Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [php]query e ciclo

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    70

    [php]query e ciclo

    Pensavo di esserne in grado, ma dopo aver mandato in crash phpmyadmin col codice mi son detto ke è meglio una consulenza da esperti
    Codice PHP:
    <?
    session_start
    ();

    $voto $_POST[voto];
    $id_song $_POST[id_canzone];
    $nome $_SESSION[user];

    $db db_connetti();

    //Verifico che l'utente in questione non abbia già espresso un voto per questa canzone
    $query "SELECT user_votante FROM Voti_Canzoni WHERE id_canzone = 'id_song' " 
    $result mysql_query($query$db);

    while (
    $row mysql_fetch_array($result))
    {
    if (
    $row[user_votante] == $nome){
    echo 
    "Hai già votato questa canzone";
    ?>
       <html>
       <SCRIPT LANGUAGE="JavaScript">window.setTimeout("document.location='HomePageUtenti.php'",4000)</SCRIPT>
       </html>
    <?

    }
    }


    $query2 " INSERT INTO Voti_Canzoni ( voto, id_canzone, user_votante ) 
               VALUES ( '
    $voto', '$id_song', '$nome' ) " ;

    if (
    mysql_query($query2$db))
      {
       echo 
    '<h2>Votazione inserita</h2>

    '
    ;
      }
      
       echo 
    'Sarai automaticamente indirizzato alla Homepage Utenti entro pochi secondi...';
       
    ?>
       <html>
       <SCRIPT LANGUAGE="JavaScript">window.setTimeout("document.location='HomePageUtenti.php'",4000)</SCRIPT>
       </html>
    Ricevo correttamente il voto, id_canzone e user dall sessione corrente. Devo fare in modo però che lo user attuale nella sessione non possa votare 2 volte la stessa canzone. Ho provato ad estrarre dal db le canzoni con lo stesso id che ricevo e fare il controllare tra il campo user_votante e $nome.
    Niente purtroppo, ho provato molto: o mi ignora il controllo o il ciclo va avanti all'infinito e mi blocca tutto.
    In pratica se nella tabella Voti_Canzoni c'è già il record con lo stesso id_Canzone e lo stesso user_votante di quello attuale devo avvisare che il voto è già stato inserito, altrimenti inserisco il voto.

  2. #2
    Primo, fai attenzione alla sintassi che usi, che è assai a rischio di malfunzionamenti:

    1) Gli indici stringa degli array è sempre meglio che siano tra virgolette:

    RISCHIOSO: $_SESSION[user] MOLTO MEGLIO:$_SESSION["user"]

    2) Quando vuoi usare una variabile in una stringa concatenata, sempre meglio esprimere il concatenamento:

    RISCHIOSO: "SELECT user_votante FROM Voti_Canzoni WHERE id_canzone = '$id_song' "
    MOLTO MEGLIO: "SELECT user_votante FROM Voti_Canzoni WHERE id_canzone = '".$id_song."' "

    In secondo luogo, perchè non mettere la restrizione "username='".$_SESSION["user"]."'" direttamente nella query SQL?

    "SELECT user_votante FROM Voti_Canzoni WHERE id_canzone = '".$id_song."' AND username='".$_SESSION["user"]."'"

    Questo ti evita di passare in rivista una amrea di voti che non sono stati dati dal tuo utente...

    Inoltre, se la query di inserimento che c'è nella seconda parte del codice la fai comunque sempre (non c'è nessun IF che eviti di farla se il voto è già presente) fai del lavoro inutile...
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    70
    Originariamente inviato da Shores

    "SELECT user_votante FROM Voti_Canzoni WHERE id_canzone = '".$id_song."' AND username='".$_SESSION["user"]."'"

    Questo ti evita di passare in rivista una amrea di voti che non sono stati dati dal tuo utente...
    Ok grazie per gli appunti sulla sicurezza di cui sapevo poco o niente. Utilizzando quella query otterrei o 0 record nel caso il voto non fosse già stato espresso oppure 1 record nel caso il voto a quella canzone sia già stato effettuato.
    Come faccio poi a fare il controllo?
    Avevo pensato ad inserire dopo la prima query con un if (mysql_fetch_row($result) == FALSE)
    {
    allora esegui query inserimento
    }else torna alla pagina precedente
    Sarebbe corretto?Ho timore che tutto mi si impallasse di nuovo

  4. #4
    Si, dovrebbe andare bene, puoi anche usare mysql_num_rows per avere il numero esatto di righe restituite...
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    70
    Originariamente inviato da Shores
    Si, dovrebbe andare bene, puoi anche usare mysql_num_rows per avere il numero esatto di righe restituite...
    si esatto funziona grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.