- Home
- Categorie
- Coding e Sistemistica
- PHP
- Aiuto per sistema di inserimento siti e votazione siti
-
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.
-
Ok ora funziona, grazie mille.
Ti volevo chiedere se era possibile evitare lo spam, cioè che vengano inseriti siti dai bot o cose del genere. Poi se era possibile fare in modo che gli utenti siano costratti ad inserire un sito che inizia con "http: //" oppure che qualsiasi cosa inserisca venga inserito con "http: //" altrimenti la prende come se fosse una sottocartella del mio stesso sito.
E poi se era possibile fare in modo che quando si inserisce un sito o una descrizione con una lettera accentata non mi compaia la lettera tradotta in html. per esempio ho inserito una "è" e mi è apparso "è".grazie mille ancora!!!!
-
@ManuelHT said:
Ti volevo chiedere se era possibile evitare lo spam, cioè che vengano inseriti siti dai bot o cose del genere.
Si, scusami, l'avevo letto ma rispondentoti m'è passato di mente. Hai due possibilità:- Implementare una conferma visuale (captcha);
- Implementare un calcolo automatico di cui l'utente deve scrivere il risultato di due numeri random (es.: quanto fa 2 + 5? ed accanto la input box per inserire il numero, nella pagina di controllo verifichi se la somma inserita è giusta)
Poi se era possibile fare in modo che gli utenti siano costretti ad inserire un sito che inizia con "http: //" oppure che qualsiasi cosa inserisca venga inserito con "http: //" altrimenti la prende come se fosse una sottocartella del mio stesso sito.Puoi sfruttare la funzione eregi (che sarebbe la versione case insensitive di ereg), per controllare se la stringa inserita contiene http://:
[php]if (eregi('http://', $link)
{
// procedi con l'inserimento
}
else
{
$link="http://".$link;
//procedi con l'inserimento
}[/php];)
E poi se era possibile fare in modo che quando si inserisce un sito o una descrizione con una lettera accentata non mi compaia la lettera tradotta in html. Per esempio ho inserito una "è" e mi è apparso "è".Dimenticanza mia, pardon.All'atto della visualizzazione della descrizione o del nome inserisci la funzione html_entity_decode($description), dovrebbe andare così.
-
Non ho capito bene dove inserire il secondo script: mi puoi fare un esempio?
E mi puoi far vedere come fare quello script dell inserire la somma dei numeri?Grazie ancora, se vuoi ti mando un pm e ti faccio vedere come sta venendo il sito!!!!
-
Dovrai inserirlo nella pagina dove inserisci il sito nel Db:
[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
{
if (eregi('http://', $link)
{
$sql="INSERT INTO site (name, link, description, email) VALUES ('$name', '$link', '$description', '$email')";
$query=@mysql_query($sql) or die (mysql_error());
}
else
{
$link="http://".$link;
$sql="INSERT INTO site (name, link, description, email) VALUES ('$name', '$link', '$description', '$email')";
$query=@mysql_query($sql) or die (mysql_error());
}
}
?> [/php];)E mi puoi far vedere come fare quello script dell inserire la somma dei numeri?Dovresti sfruttare la funzione rand (random) per darti dei numeri a caso, mettiamo da 1 a 10. Oltre a visualizzarli come domanda, associ il valore a degli hidden data, inserisci nel form quindi un input per far inserire il risultato e nella pagina di controllo verifichi che la somma dei due numeri sia uguale al risultato immesso dall'utente:
[php]<?
$rand1=rand(1,10);
$rand2=rand(1,10);
?>
<form........
.......Quanto fa <? echo $rand1; ?> + <? echo $rand2; ?>?
<input type="text" name="ris" />
<input type="hidden" name="rand1" value="<? echo $rand1; ?>" />
<input type="hidden" name="rand2" value="<? echo $rand2; ?>" />
</form>[/php]Nella pagina di inserimento metterai il recupero di questi valori:
[php]<?
......
$email=htmlentities($_POST['email'], ENT_QUOTES);
$ris=$_POST['ris'];
$rand1=$_POST['rand1'];
$rand2=$_POST['rand2'];// ai controlli aggiungerai la verifica
if (is_int($ris) && ($rand1 + $rand2) == $ris && $ris>0)
{
require_once ("config.php"); // includo il file di connessione al Db
............
//metti il resto dello script
}
else
{
echo "Hai immesso un valore errato.";
}
?>[/php]Nella verifica per prima cosa controlli che $ris sia un numero intero (is_int), poi che il risultato sia giusto (($rand1 + $rand2) == $ris) e quindi che lo stesso sia maggiore di zero ($ris>0), che non si sa mai.
-
Il form non funziona, mi da sempre il messaggio "hai inserito un valore errato"
il codice che ho fatto è qeusto:<? $rand1=rand(1,10); $rand2=rand(1,10); ?> <form id="aggiungi-sito" method="post" action="fun-add-site.php"> Nome sito:<br /> <input type="text" name="name" /><br /> Link sito:<br /> <input type="text" name="link" /><br /> Descrizione sito:<br /> <input type="text" name="description" /><br /> Email inseritore:<br /> <input type="text" name="email" /><br /><br /> Quanto fa <? echo $rand1; ?> + <? echo $rand2; ?>?(serve per verificare che tu sia un essere umano) <input type="text" name="ris" /> <input type="hidden" name="rand1" value="<? echo $rand1; ?>" /> <input type="hidden" name="rand2" value="<? echo $rand2; ?>" /> <input type="submit" value="Invia Sito" /> </form> ```per il form, e questo:
<?
$name=htmlentities($_POST['name'], ENT_QUOTES);
$link=htmlentities($_POST['link'], ENT_QUOTES);
$description=htmlentities($_POST['description'], ENT_QUOTES);
$email=htmlentities($_POST['email'], ENT_QUOTES);
$ris=$_POST['ris'];
$rand1=$_POST['rand1'];
$rand2=$_POST['rand2'];require_once ("config.php");
if (is_int($ris) && ($rand1 + $rand2) == $ris && $ris>0)
{
$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
{
if (eregi('http ://', $link))
{
$sql="INSERT INTO site (name, link, description, email, vote) VALUES ('$name', '$link', '$description', '$email', '0')";
$query=@mysql_query($sql) or die (mysql_error());
echo("Il tuo sito è stato aggiunto con successo.");
}
else
{
$link="http ://".$link;
$sql="INSERT INTO site (name, link, description, email, vote) VALUES ('$name', '$link', '$description', '$email', '0')";
$query=@mysql_query($sql) or die (mysql_error());
echo("Il tuo sito è stato aggiunto con successo.");
}}
}
else
{
echo "Hai immesso un valore errato.";
}
?>E poi mi puoi spiegare meglio (magari con un esempio) dove mettere "html_entity_decode($description)" per evitare che vengano convertite le vocali accentate sia nella descrizione che per esempio nel link o nel nome del sito? grazie mille ps:ho dovuto staccare http :// in eregi sennò non mi faceva inviare il post
-
Metti al posto di is_int la funzione is_numeric, non va bene per dati POSTati is_int dato che di default non viene assegnata come integer una variabile.
Per l'altra domanda:
nella pagina dove visualizzi il sito, la desrizione ed il resto, ovvero:[php]while ($array=mysql_fetch_array($query))
{
echo $array['id']."-<a href="".$array['link']."">".html_entity_decode($array['name'])."</a>-".html_entity_decode($array['description'])."<br />";
}[/php]
-
Perfetto!!!! Ora ti vorrei chiedere solamente un ultima cosa. Finalmente dovrebbe essere l'ultima cosa che ho da chiedere!
Se voglio fare in modo che ogni settimana si azzerino i voti per ogni sito ma che il sito rimanga, come faccio?
-
Dovresti rendere uguale a zero tutti i campi vote della tabella site (UPDATE site SET vote=0) e cancellare i contenuti della tabella che memorizza le votazioni/IP (TRUNCATE TABLE vote).
Per farlo fare in automatico puoi utilizzare un CRON (ovvero uno script che si riesegue ogni tot di tempo) oppure tener traccia della data dell'ultima cancellazione dati e immettere nel codice (anche dove cancelli le votazioni più vecchie di un giorno così lo hai in tutte le pagine) uno script che prende la data dell'ultima cancellazione se è passata una settimana o più esegue i comandi che ti ho postato sopra. Ti consiglio la seconda.
Vuoi provare a farlo tu?
-
Certo che voglio provare però provo domani che ora vado a dormire, sono distrutto.
ps: mi è venuta in mente un altra cosa da chiederti: se voglio disporre l'elenco dei siti in due o più colonne come faccio? cioè in pratica così:
- Sito 1 4) Sito 4 7) Sito 7
- Sito 2 5) Sito 5 Sito 8
- Sito 3 6) Sito 6 9) Sito 9
perchè per visualizzarli in colonna ho capito, ma in più colonne non saprei come fare. grazie ancora, quando il sito sarà finito posso postare il link qui per farlo vedere a te e agli altri utenti?
-
@Samyorn said:
Dovresti rendere uguale a zero tutti i campi vote della tabella site (UPDATE site SET vote=0) e cancellare i contenuti della tabella che memorizza le votazioni/IP (TRUNCATE TABLE vote).
Per farlo fare in automatico puoi utilizzare un CRON (ovvero uno script che si riesegue ogni tot di tempo) oppure tener traccia della data dell'ultima cancellazione dati e immettere nel codice (anche dove cancelli le votazioni più vecchie di un giorno così lo hai in tutte le pagine) uno script che prende la data dell'ultima cancellazione se è passata una settimana o più esegue i comandi che ti ho postato sopra. Ti consiglio la seconda.
Vuoi provare a farlo tu?
per ora ho messo da parte il fatto di volerli cancellare una volta a settimana, se riprenderò questa idea lo script lo farei così (considera che vorrei anke cancellare la tabella che tiene conto degli ip che hanno votato, il motivo lo spiego sotto)<? require_once ("config.php"); $sql="UPDATE site SET vote=0 WHERE date<".time()-604800.""; $query=@mysql_query($sql) or die (mysql_error()); ?>
(604800 secondi in una settimana) è giusto lo script?
la tabella vote la toglierei semplicemente perchè voglio adottare il sistema dei cookies, ovviamente devo anche modificare lo script di invio voto in modo che invii i dati solo alla tabella site.
per settare i cookie in modo che si possa votare solo una volta per ogni sito io farei così:
<? $id=$_POST['id']; setcookie("votazione_$id","giavotato",time()+86400); if($_COOKIE [ "votazione_".$id.""]) { $sql="UPDATE site SET vote=vote+1 WHERE id='$id'"; $query=@mysql_query($sql) or die (mysql_error()); echo "Grazie per aver votato."; } else { echo "Hai già votato per questo sito"; } ?>
però non funziona, cosa c'è di sbagliato?
e poi:
@ManuelHT said:ps: mi è venuta in mente un altra cosa da chiederti: se voglio disporre l'elenco dei siti in due o più colonne come faccio? cioè in pratica così:
- Sito 1 4) Sito 4 7) Sito 7
- Sito 2 5) Sito 5 Sito 8
- Sito 3 6) Sito 6 9) Sito 9
perchè per visualizzarli in colonna ho capito, ma in più colonne non saprei come fare.
per questo discorso come potrei fare???
grazie:D
-
Rieccomi.
Un chiarimento, vuoi cancellarli una volta a settimana o vuoi cancellare quelli più vecchi di una settimana?
Sul campo site non hai date.Per il cookie, dovresti prima verificare che il cookie esista o meno e se non esiste crei il cookie e fai l'inserimento nel Db.
Questo scrivilo così intanto:setcookie("votazione_".$id, ..... ```Poi sposta il setcookie subito dopo la query. ;) Per l'incolonnamento basta ragionare in questi termini: se io ricevo un numero di termini, che non conosco, e devo incolonnarli a 3, che devo fare? :) Se io divido il numero di siti contenuti in tabella (che ottieni facendo SELECT COUNT(link) FROM site) per 3, che son le mie colonne, otterro' un numero. Se questo numero ha resto ( $resto = $count%3; ) significa che all'intero della divisione dovro' aggiungere un'altra riga per inserire i siti restanti, che saran 1 o 2 in questo caso. Poi come procedere dipende da come li vuoi visualizzare: * dentro una tabella * un div per riga * altro. :)
-
Ho messo il codice dei cookie così
[php]
<?
$id=$_POST['id'];if($COOKIE [ "votazione".$id.""])
{echo "Hai già votato per questo sito";
}
else
{$sql="UPDATE site SET vote=vote+1 WHERE id='$id'";
$query=@mysql_query($sql) or die (mysql_error());echo "Grazie per aver votato.";
setcookie("votazione_".$id,"giavotato",time()+86400);
}?>
[/php]Solo che non funziona lo stesso, mi dice:Grazie per aver votato. **Warning**: Cannot modify header information - headers already sent by (output started at /home/xxx/xxxx/votazione-sito.php:6) in **/home/xxx/xxxx/votazione-sito.php** on line **87** ```( ovviamente le xxx sono indicative del percorso) Anche mettendo il setcookie(... dopo la chiusura di else mi da lo stesso errore, la linea 87 sarebbe quella dove c'è setcookie (."votazione..... Da cosa dipende?:x Un'altra cosa, se divido il numero di link per 3, come faccio a fare in modo da dirgli di mettere la prima parte di link nella 1 colonna, (che sarà un div con float left), la seconda parte nel secondo div e la terza nel terzo div???:bho::bho: Grazie ancora...!!!!
-
Considera il cookie come un header, pertanto la funzione va richiamata prima di ogni altro output (anche i <!DOCTYPE ... è da considerarsi un output ;)).
Difatti conviene metterlo ad inizio script.
Per il discorso dei div, dato che estrarrai i dati tramite ciclo (ti consiglio di utilizzare il for) farai in modo che ogni 3 ricorrenze venga chiuso il div ed aperto il successivo andando a capo.
Dai che stai muovendo i primi passi con il PHP in maniera egregia.