- Home
- Categorie
- Coding e Sistemistica
- PHP
- Aiuto per sistema di inserimento siti e votazione siti
-
Allora innanzitutto ti ringrazio veramente tantissimo per l'eenooorme aiuto che mi hai dato....
Ora ho creato tutti i file solo che non riesco a metterli sul sito perchè non mi fa connettere, appena riesco ti faccio sapere il risultato.
Dovrei aver capito tutto, o perlomeno il funzionamento l ho capito anche perchè sei stato molto chiaro.
Mi piacerebbe, finita la scuola, imbattermi pure in questi linguaggi di programmazione, solo che ora come ora non avendoli mai studiati e, soprattutto, mai applicati viene un pò difficile abituarsi al meccanismo.
Spero davvero di riuscire ad attuare questa piccola idea che ho in testa, sia perchè sarebbe un bella soddisfazione personale e sia perchè ne verrebbe fuori una idea carina.
grazie ancora, a presto
-
Ti accorgerai che studiare il PHP non è affatto difficile, anzi...se l'ho un po' compreso io...
In rete trovi guide ed aiuti di ogni genere, anche quì sul Forum.
Un libro adatto ai primi passi poi, secondo il mio parere, non sarebbe affatto male.
In bocca al lupo per i tuoi progetti.
-
Ok ho messo le pagine online...c'è solo un problema, ossia quando invio i dati la prima volta mi inserisce la riga nella tabella ma mi mette solo l'ID, ed il resto è vuoto.
Se facccio un altro invio mi da il seguente problema: " Duplicate entry '' for key 'link' ".mi sai dire come risolvere il problema?
La pagina di elenco siti invece funziona perfettamente così come la pagina di ogni sito.
ps: per quanto riguarda la votazione (senza contare il discorso di un voto per ogni IP a settimana) avevo pensato di creare un altro campo con un valore tale che quando si clicca sulla votazione quel valore venga aumentato tramite un UPDATE, è possibile fare questa cosa o c'è un metodo migliore??
grazie mille ancora....
-
@ManuelHT said:
..quando invio i dati la prima volta mi inserisce la riga nella tabella ma mi mette solo l'ID, ed il resto è vuoto.
Se faccio un altro invio mi da il seguente problema: " Duplicate entry '' for key 'link' ".
Posteresti il form e la pagina che recupera ed inserisce i dati nel Db? Il problema sarà sicuramente nel raccordo dati.ps: per quanto riguarda la votazione (senza contare il discorso di un voto per ogni IP a settimana) avevo pensato di creare un altro campo con un valore tale che quando si clicca sulla votazione quel valore venga aumentato tramite un UPDATE, è possibile fare questa cosa o c'è un metodo migliore?Potresti, volendo fare anche così, darebbe comunque meglio tenere separate le cose.
Per aggiornare il voto basterà, appunto, fare un update:
[php]$sql="UPDATE site SET vote=vote+1 WHERE id='$id'";[/php];)Edit: i nomi dei campi sono tutti in minuscolo? Perché Name è diverso da name.
-
Scusami ho risolto quel problema....in pratica al posto di name="xxx" nel form avevo messo id="xxx", pensavo andasse bene lo stesso.
Per la votazione avevo pensato di aggiungere un campo semplicemente perchè così rimaneva tutto nella stessa tabella, e non si creavano problemi di id, quindi preferirei lasciare quel sistema dell'aggiunta del campo.
ora avrei da chiederti un altra cosa, ti faccio un esempio:
Se io avessi un link del sito:
<a href="xxx" style="font-size: YYYpx;">Sito</a>Come potrei fare per fare in modo che YYY sia un valore in base al numero di votazioni?
Cioè mettiamo che con 0 voti il valore sia 8, con 10 voti sia 9, con 20 sia 10 e così via fino ad arrivare ad un massimo di per esempio 100 voti il valore sia 24 px con 300 voti il valore sia sempre 24 px, cioè che oltre i 24 px non aumenti più?Grazie ancora
ps: se si inserisce due volte uno stesso link mi da l errore di prima, quello del doppio link, solo che non è molto carino da vedere quindi come potrei mettere un messaggio di errore di tipo "Questo sito è gia stato inserito", " Questo link è gia stato inserito". o qualcosa del genere?
-
@ManuelHT said:
Come potrei fare per fare in modo che YYY sia un valore in base al numero di votazioni?
Cioè mettiamo che con 0 voti il valore sia 8, con 10 voti sia 9, con 20 sia 10 e così via fino ad arrivare ad un massimo di per esempio 100 voti il valore sia 24 px con 300 voti il valore sia sempre 24 px, cioè che oltre i 24 px non aumenti più?Ti basta impostare una serie di controlli del genere:
[php]<?
if ($array['voto']< 20 && $array['voto']>9)
{
$size=9;
}
else if ($array['voto']< 30 && $array['voto']>19)
{
$size=10;
}
else if (..........)
..............
else
{
$size=8;
}
?><a href="xxx" style="font-size: <? echo $size; ?>px;">Sito</a>[/php]> ps: se si inserisce due volte uno stesso link mi da l errore di prima, quello del doppio link, solo che non è molto carino da vedere quindi come potrei mettere un messaggio di errore di tipo "Questo sito è gia stato inserito", " Questo link è gia stato inserito". o qualcosa del genere?Per farlo puoi verificare che già non esista quel link ovvero fai una select mettendo come clausola WHERE link='$link' e quindi a query eseguita controlli se il numero di righe è diverso da zero, quindi il link già esiste:
[php]<?
$sql="SELECT link FROM site WHERE link='$link'";
$query=@mysql_query($sql) or die (mysql_error());$row=mysql_num_rows($query);
if ($row!=0)
{
echo "Questo sito è già stato inserito";
exit;
}[/php]Ovviamente in questo caso non dovrai continuare con l'inserimento, per non aver il Duplicate Entry dal Db.
Dovrai considerare anche che htt p://vvv.domain.ext e vvv.domain.ext saranno considerati differenti.
-
Ho provato a fare l'update della votazione ma non funziona, non da errori però non mi fa l'update. Nel form ho messo questo:
<form method="get" action="add-vote.php"> <input type="submit" name="vote" value="Invia il voto per questo sito" /> </form> ```e in add-vote-php ho messo
<?
$vote=htmlentities($_POST['vote'], ENT_QUOTES);
$id=$_GET['id'];require_once ("config.php");
$sql="UPDATE site SET vote='vote+1' WHERE id='$id'";
?>Come posso fare??? Inoltre quel codice per controllare se un sito esiste già in quale file lo dovrei mettere??? Grazie.
-
@ManuelHT said:
Ho provato a fare l'update della votazione ma non funziona, non da errori però non mi fa l'update.
Non ti prende l'id perché te non lo invii.
Dal form così strutturato non c'è traccia di invio dell'id di riferimento, potresti semplicemente usare un hidden data:
[html]<form method="post" action="add-vote.php">
<input type="hidden" name="id" value="1" />
<input type="submit" name="vote" value="Invia il voto per questo sito" />
</form>[/html]Se non sei costretto cerca di usare sempre il metodo post.[php]<?
$id=$_POST['id'];require_once ("config.php");
$sql="UPDATE site SET vote=vote+1 WHERE id='$id'";
$query=@mysql_query($sql) or die (mysql_error());
?>[/php]> Inoltre quel codice per controllare se un sito esiste già in quale file lo dovrei mettere???Prima dell'insert o addirittura inglobarlo:
[php]<?
$name=htmlentities($_POST['name'], ENT_QUOTES);
$link=htmlentities($_POST['link'], ENT_QUOTES);
$description=htmlentities($_POST['description'], ENT_QUOTES);
$email=htmlentities($_POST['email'], ENT_QUOTES);require_once ("config.php"); // includo il file di connessione al Db
$sql="SELECT link FROM site WHERE link='$link'";
$query=@mysql_query($sql) or die (mysql_error());$row=mysql_num_rows($query);
if ($row!=0)
{
echo "Questo sito è già stato inserito";
exit;
}
else
{
$sql="INSERT INTO site (name, link, description, email) VALUES ('$name', '$link', '$description', '$email')";
$query=@mysql_query($sql) or die (mysql_error());}
?>[/php];)
-
Okei ora funziona tutto alla perfezione, tranne una cosa: cioè che il form mi invia il voto ma il campo nascosto avendo value="1" me lo invia sempre sull ID 1. Come faccio a fare in modo che me lo invii all'ID da cui è stato inviato il voto?
Il codice in totale è così:
<? $id=$_GET['id']; require_once ("config.php"); $sql="SELECT * FROM site WHERE id='$id'"; $query=@mysql_query($sql) or die (mysql_error()); //a questo punto associ ad un array il risultato della query e quindi cicli il contenuto while ($array=mysql_fetch_array($query)) { echo "-<a href=\"".$array['link']."\">".$array['name']."</a>-"."<br />".$array['description']."<br />"; } mysql_close($connessione); ?> <form method="post" action="add-vote.php"> <input type="hidden" name="id" value="1" /> <input type="submit" name="vote" value="Invia il voto per questo sito" /> </form>
E poi se volessi fare in modo che gli utenti possano votare una quantità X di volte ogni Y di tempo (per esempio 3 volte a settimana e per 3 siti diversi) come faccio?
Grazie ancora...
la realizzazione del mio progetto sembra sempre più vicina, anche se la strada è ancora lunga ed ho paura che la parte più difficile debba ancora arrivare....Comunque per la seconda parte dovrei riuscire ad arrangiarmi da solo perchè devo solo modificare degli script già esistenti....
-
@ManuelHT said:
Come faccio a fare in modo che me lo invii all'ID da cui è stato inviato il voto?
Ti basterà mettere al posto del value="1" l'id del sito.
[php]<input type="hidden" name="id" value="<? echo $id; ?>" />[/php]> E poi se volessi fare in modo che gli utenti possano votare una quantità X di volte ogni Y di tempo (per esempio 3 volte a settimana e per 3 siti diversi) come faccio?Comunque per la seconda parte dovrei riuscire ad arrangiarmi da solo perchè devo solo modoficare degli script già esistenti....Ok.
-
Ok grazie anche il form è apposto, però mi sa che mi sono espresso male:
@ManuelHT said:
E poi se volessi fare in modo che gli utenti possano votare una quantità X di volte ogni Y di tempo (per esempio 3 volte a settimana e per 3 siti diversi) come faccio?
Per questa parte avrei bisogno....mentre c'è un altra parte che consiste nel modificare un codice già esistente, in quella dovrei riuscire a cavarmela da solo...mi puoi aiutare per la parte che ho quotato sopra???
Grazie!!!
-
Ti servirà un'altra tabella che abbia id, id del sito, ip di chi vota e data (formato timestamp).
Nella index metterai uno script che cancellerà tutti i record più vecchi di una settimana.
Ad ogni inserimento effettuerai due controlli:
- che l'utente non abbia già votato per qual sito nell'ultima settimana
- che il numero di votazioni presenti per quell'IP non sia già al limite impostato.
Pero' mi permetto di farti notare che ad ogni riconnessione si ha un IP diverso, infatti solitamente questo controllo viene effettuato sul giornaliero o tramite cookie (ma già diventa più invasiva la cosa).
Se dalla selezione in questa tabella risulta che quell'IP non ha già votato quel sito, fai il controllo di quante volte è presente quell'IP, se è presente tre volte, dai messaggio di errore, se è presente meno di tre volte provvedi al nuovo inserimento.
-
Ok allora mettiamo caso che io volessi far votare una volta al giorno per ogni IP (quindi ogni cambio di IP) come posso fare?
Creo un altra tabella con nome 'vote' ed inserisco 'id' (autoincrementale), 'idsito', 'ip' e 'date'. Una volta fatto ciò dovrei mettere quello script che mi cancella i dati una volta a settimana, ma come faccio?
Quindi, eliminando il discorso dei 3 voti ognuno su un sito diverso, rimarrebbe solo da fare il controllo se l indirizzo IP ha votato nell'arco della giornata.
Ho provato quindi a buttare già due righe di codice ma molto probabilmente sarà sbagliato:Il codice del form sarebbe questo:
<form method="post" action="add-vote.php"> <input type="hidden" name="id" value="<? echo $id; ?>" /> <input type="hidden" name="ip" value="<? echo $ip; ?>" /> <input type="submit" name="vote" value="Invia il voto per questo sito" /> </form>
ed il codice di add-vote.php sarebbe questo:
<? $id=$_POST['site'.'id']; $ip=$_POST['vote'.'ip']; require_once ("config.php"); $sql="SELECT ip FROM vote WHERE ip='$ip'"; $query=@mysql_query($sql) or die (mysql_error()); $row=mysql_num_rows($query); if ($row!=0) { echo "Non puoi votare due volte nell'arco della stessa giornata"; exit; } else { $sql="UPDATE site SET vote=vote+1 WHERE id='$id'"; $query=@mysql_query($sql) or die (mysql_error()); } echo("Il tuo voto è stato inviato con successo"); ?>
Ho specificato in $ip il percorso 'site'.'id' per non fare confusione con id della tabella 'vote' quindi probabilmente sarà sbagliato....
mi puoi dare le giuste correzioni per favore??
-
Beh, se decidi di fare il controllo giornalmente allora cancellerai quel voto giornalmente.
Quindi: come cancellare i dati più vecchi di un tot di tempo?
Se usi il formato timestamp per la data ti verrà un gioco da ragazzi.
Ti basta implementare nelle pagine del sito uno script che cancelli tutti i record della tabella vote più vecchi di XXX secondi rispetto all'orario attuale, ovvero:
[php]<?
require_once ("config.php");
$sql="DELETE FROM vote WHERE date<".time()-86400."";
$query=@mysql_query($sql) or die (mysql_error());
?>[/php]Time() è una funzione di PHP che ti restituisce il timestamp attuale del server, 86400 sono i secondi in un giorno.Vediamo ora l'add-vote.php.
Nel form basta che ci sia l'id del sito, quindi:
[html]<form method="post" action="add-vote.php">
<input type="hidden" name="id" value="<? echo $id; ?>" />
<input type="submit" name="vote" value="Invia il voto per questo sito" />
</form>[/html]Nel file add-vote.php recuperi l'id del sito, associ l'IP dell'utente ad una variabile e quindi effettui il controllo se nella tabella vote quell'IP ha già votato quel sito (dato che passate le 24 ore il record viene automaticamente cancellato non lo troverà se ha votato il giorno prima):
[php]<?
$id=$_POST['id'];
$ip=$_SERVER['REMOTE_ADDR']; //l'indirizzo IP dell'utenterequire_once ("config.php");
//controlliamo che l'associazione IP-id non esista già.
$sql="SELECT * FROM vote WHERE id_site='$id' AND ip='$ip'";
$query=@mysql_query($sql) or die (mysql_error());// vediamo se la query contiene delle righe
$row=mysql_num_rows($query);
if ($row!= 0) //se la query ha delle righe e quindi ha estratto dei risultati
{
echo "Hai già votato per questo sito, torna alla <a href="paginasito.php?id=".$id."">pagina del sito</a>.";
}
else // se la query non produce risultati
{
$sql="UPDATE site SET vote=vote+1 WHERE id='$id'";
$query=@mysql_query($sql) or die (mysql_error());echo "Grazie per aver votato, torna alla <a href="paginasito.php?id=".$id."">pagina del sito</a>.";
}
?>[/php]Credo che qualcosa del genere potrebbe andare.
-
Provando a fare come dici tu il voto funziona ma non invia l'ip alla tabello vote-->ip
In effetti guardando il codice non capisco come fa ad inviare e quindi a registrare l'indirizzo ip nel database, per poi verificare se esiste, inoltre io voglio fare in modo che un certo IP possa votare solo una volta, per qualsiasi sito, cioè non può votare due siti diversi, quindi al posto di
$sql="SELECT * FROM vote WHERE id_site='$id' AND ip='$ip'"; ```presumo che devo mettere solo
$sql="SELECT * FROM vote WHERE ip='$ip'";
Un altra cosa, lo script per il cancellamento dei record lo devo mettere nella pagina della votazione? Ma poi se ho due $sql diversi non vanno in contrasto?
-
@ManuelHT said:
Provando a fare come dici tu il voto funziona ma non invia l'ip alla tabello vote-->ip
Perché me lo son dimenticato. Maledetta fretta...
Manca l'inserimento dei dati nella tabella vote:[php] <?
$id=$_POST['id'];
$ip=$_SERVER['REMOTE_ADDR']; //l'indirizzo IP dell'utenterequire_once ("config.php");
//controlliamo che l'associazione IP-id non esista già.
$sql="SELECT * FROM vote WHERE id_site='$id' AND ip='$ip'";
$query=@mysql_query($sql) or die (mysql_error());// vediamo se la query contiene delle righe
$row=mysql_num_rows($query);
if ($row!= 0) //se la query ha delle righe e quindi ha estratto dei risultati
{
echo "Hai già votato per questo sito, torna alla <a href="paginasito.php?id=".$id."">pagina del sito</a>.";
}
else // se la query non produce risultati
{
$sql="UPDATE site SET vote=vote+1 WHERE id='$id'";
$query=@mysql_query($sql) or die (mysql_error());$sql="INSERT INTO vote (id_sito, ip, date) VALUES ('$id', '$ip', ".time().")";
$query=@mysql_query($sql) or die (mysql_error());echo "Grazie per aver votato, torna alla <a href="paginasito.php?id=".$id."">pagina del sito</a>.";
}
?> [/php]...voglio fare in modo che un certo IP possa votare solo una volta, per qualsiasi sito, cioè non può votare due siti diversi, quindi al posto di
$sql="SELECT * FROM vote WHERE id_site='$id' AND ip='$ip'"; ```presumo che devo mettere solo
$sql="SELECT * FROM vote WHERE ip='$ip'";
Giustissimo. ;) Ma a questo punto non ti serve più il riferimento dell'id_sito in quella tabella. :) > Un altra cosa, lo script per il cancellamento dei record lo devo mettere nella pagina della votazione? Beh, sarebbe meglio in tutte, potresti, volendo, inglobarlo nel config.php. :) > Ma poi se ho due $sql diversi non vanno in contrasto? Una volta eseguita la query la variabile $sql non ti serve più, puoi quindi assegnarli ulteriori valori nella stessa pagina, l'importante è ricordare che quando richiami una variabile come $sql, etc. etc., queste avranno come valore l'ultimo che gli hai assegnato. ;)
-
Ora funziona tutto tranne che anche avendo
echo "Hai già votato per questo sito"; ```invece di postarmi la frase mi dice: "Duplicate entry 'XXXXX' for key 'ip'" dove XXXXX è il mio IP, come mai??? Poi un altra cosa: in pratica nella mia pagina ho un filmato .sfw dove al suo interno devono essere inseriti i siti che sono elencati in un file xml. I siti devono essere inseriti sotto forma di codice html: <a href="linksito" style="font-size: 12px" >Nome sito</a> linksito e nome sito devono essere presi dal database e il valore font-size deve essere preso dallo script che mi avevi dato tu. Ora il problema è che se la pagina fosse PHP la saprei fare, ma essendo la pagina XML come posso fare ad inserire quei dati? Posso inserire il php all interno dell' xml? grazie ancora sul serio, ormai è quasi finita :) ps: nel campo data mi da "0000-00-00 00:00:00", è normale?? e poi per il campo IP ho messo INT (30) è giusto?
-
@ManuelHT said:
Ora funziona tutto tranne che anche avendo
>echo "Hai già votato per questo sito"; >```invece di postarmi la frase mi dice: "Duplicate entry 'XXXXX' for key 'ip'" dove XXXXX è il mio IP, come mai??? ps: nel campo data mi da "0000-00-00 00:00:00", è normale?? e poi per il campo IP ho messo INT (30) è giusto? La risposta te la dai nel P.S., dato che i campi son impostati male per i dati che ricevono non verificherà mai l'esistenza della query. :) Ti da quel valore nel campo data perché te lo hai impostato come campo data per ricevere dati del tipo: 2009-04-15 14:42:00. Ma siccome stiamo lavorando di timestamp e quindi con i secondi, ovvero numeri interi, il campo date dovrà essere un INT. Per l'IP non va bene l'INT dato che 127.0.0.1 non è un numero intero, puoi mettere anche un VARCHAR volendo, non è un grosso problema. ;) > Poi un altra cosa: in pratica nella mia pagina ho un filmato .sfw dove al suo interno devono essere inseriti i siti che sono elencati in un file xml. I siti devono essere inseriti sotto forma di codice html: <a href="linksito" style="font-size: 12px" >Nome sito</a> linksito e nome sito devono essere presi dal database e il valore font-size deve essere preso dallo script che mi avevi dato tu. Ora il problema è che se la pagina fosse PHP la saprei fare, ma essendo la pagina XML come posso fare ad inserire quei dati? Posso inserire il php all interno dell' xml?Purtroppo quì non saprei esserti d'aiuto, non ho mai lavorato su file XML. :(
-
Ok grazie, ti vorrei chiedere un altro paio di cose:
per evitare gli spammer si può fare qualcosa?
se dovessi richiamare i link sotto forma<a href="link_sito" style="font-size: XYpx" >nome_sito</a> ```questo script
<?
require_once ("config.php");
$sql="SELECT vote FROM site";
$query=@mysql_query($sql) or die (mysql_error());if ($array['vote']< 10 && $array['vote']>0)
{
$size=3;
}
else if ($array['vote']< 20 && $array['vote']>9)
{
$size=4;
}
else if ($array['vote']< 30 && $array['vote']>19)
{
$size=5;
}
else if ($array['vote']< 40 && $array['vote']>29)
{
$size=6;
}
else if ($array['vote']>39)
{
$size=8;
}
else
{
$size=2;
}$sql="SELECT * FROM site ORDER BY name ASC";
$query=@mysql_query($sql) or die (mysql_error());
//a questo punto associ ad un array il risultato della query e quindi cicli il contenuto
while ($array=mysql_fetch_array($query))
{
echo "<a href="".$array['link']."" style="font-size: <? echo $size; ?>pt">".$array['name']."</a><br />";
}mysql_close($connessione);
?>In questo modo da 1 a 9 voti si ha '3' da 10 a 19 si ha '4' da 20 a 29 si ha '5' da 30 a 39 si ha '6' per più di 40 si ha '8' e per 0 voti si ha '2' giusto?
-
Tutti i controlli vanno quì:
[php]<?
......
while ($array=mysql_fetch_array($query))
{
// copia quì tutti gli if -> else
echo "<a href="".$array['link']."" style="font-size: ".$size."pt">".$array['name']."</a><br />";
}
.........
?>[/php]Fuori dal while non otteresti nulla dato che l'array $array non è stato ancora creato.Altra cosa, se sei dentro l'istruzione PHP non devi richiamare nuovamente il modulo:
[echo](http://www.giorgiotave.it/wikigt/os/Echo) "<a href=\"".$array['link']."\" style=\"font-size: <? echo $size; ?>pt\">".$array['name']."</a><br />";
Questo lo devi variare come sopra.