Query update

seguendo la tua guida ho provato ad adattare il tuo script per fare l'update di un record per adattarlo alle mie esigenze ecco il codice <?php include("config.inc.php"); include("connect.inc.php");

if($_POST && isset($_GET['id'])) {    aggiorna_record(); } elseif(isset($_GET['id'])) {    mostra_record(); } else    mostra_lista();

function mostra_lista() {    // mostro un eventuale messaggio    if(isset($_GET['msg']))       echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';

   // preparo la query    $query = "SELECT id, titolo FROM ricette";

   // invio la query    $result = mysql_query($query);

   // controllo l'esito    if (!$result) {       die("Errore nella query $query: " . mysql_error());    }

   echo '    <table border="1">       <tr>          <th>Ricetta</th>          <th> </th>       </tr>';

   while ($row = mysql_fetch_assoc($result))    {       $nome = htmlspecialchars($row['titolo']);

      // preparo il link per la modifica dei dati del record       $link = $_SERVER['PHP_SELF'] . '?id=' . $row['id'];

      echo "<tr>             <td>$nome</td>             <td><a href=\"$link\">modifica</a></td>          </tr>";    }

   echo '</table>';

   // libero la memoria di PHP occupata dai record estratti con la SELECT    mysql_free_result($result);

   // chiudo la connessione a MySQL    mysql_close(); }

function aggiorna_record() {    // recupero i campi di tipo "stringa"    $titolo      = trim($_POST['titolo']);    $regione     = trim($_POST['regione']);    $persone = trim($_POST['persone']);    $tipopiatto = trim($_POST['tipopiatto']);     $ingredienti = trim($_POST['ingredienti']);     $preparazione = trim($_POST['preparazione']);     $note = trim($_POST['note']);

   // verifico se devo eliminare gli slash inseriti automaticamente da PHP    if(get_magic_quotes_gpc())    {       $titolo   =   stripslashes($titolo);         $regione   =   stripslashes($regione);         $persone   =   stripslashes($persone);       $tipopiatto   =   stripslashes($tipopiatto);       $ingredienti   =   stripslashes($ingredienti);         $preparazione   =   stripslashes($preparazione);         $note   =  stripslashes($note);

          }

   // effettuo l'escape dei caratteri speciali per inserirli all'interno della query              $titolo   =   mysql_real_escape_string($titolo);         $regione   =   mysql_real_escape_string($regione);         $persone   =   mysql_real_escape_string($persone);        $tipopiatto   =   mysql_real_escape_string($tipopiatto);         $ingredienti   =   mysql_real_escape_string($ingredienti);         $preparazione   =   mysql_real_escape_string($preparazione);         $note   =  mysql_real_escape_string($note);

   $id = intval($_GET['id']);

   // verifico la presenza dei campi obbligatori //   if(!$nome) //   { //      $messaggio = urlencode("Non hai inserito il nome"); //      header("location: $_SERVER[PHP_SELF]?id=$id&msg=$messaggio"); //      exit; //   }

   // preparo la query    $query = "UPDATE ricette SET

        titolo           ='$titolo',         regione          ='$regione',         persone          ='$persone',       tipopiatto       ='$tipopiatto',         ingredienti      ='$ingredienti',         preparazione     ='$preparazione',         note             ='$note',       WHERE id         = $id";

   // invio la query    $result = mysql_query($query);

   // controllo l'esito    if (!$result) {       die("Errore nella query $query: " . mysql_error());    }

   // chiudo la connessione a MySQL    mysql_close();

   $messaggio = urlencode('Aggiornamento effettuato con successo');    header("location: $_SERVER[PHP_SELF]?msg=$messaggio"); }

function mostra_record() {    // mostro un eventuale messaggio    if(isset($_GET['msg']))       echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';

   $id = intval($_GET['id']);

   // preparo la query    $query = "SELECT titolo, regione, persone, tipopiatto, ingredienti, preparazione, note  FROM ricette WHERE id = $id";

   // invio la query    $result = mysql_query($query);

   // controllo l'esito    if (!$result) {       die("Errore nella query $query: " . mysql_error());    }

   // controllo che la SELECT abbia restituito un record    // l'id passato via GET potrebbe essere stato manipolato    if(mysql_num_rows($result) != 1) {       die("l'ID passato via GET è errato");    }

   list($titolo,$regione,$persone,$tipopiatto,$ingredienti,$preparazione,$note) = mysql_fetch_row($result);

   $titolo   =  htmlspecialchars($titolo);     $regione   =   htmlspecialchars($regione);     $persone   =   htmlspecialchars($persone);     $tipopiatto   =   htmlspecialchars($tipopiatto);    $ingredienti   =   htmlspecialchars($ingredienti);     $preparazione   =   htmlspecialchars($preparazione);     $note   =  htmlspecialchars($note);

   ?>    <form name="form_registrazione" method="post" action="">     <label>Titolo:      <input   type=text   size=50   name=titolo value="<?echo $titolo?>" /><br>     </label>     <br>      <label>Nazione/Regione:      <input   type=text   size=30   name=regione value="<?echo $regione?>" />     </label> <label>Portata: <input   type=text   size=30   name=regione value="<?echo $tipopiatto?>" /> </label> <label>N. Persone: <input   type=text   size=2   name=persone value="<?echo $persone?>" /> </label> <br> <br> <label>Ingredienti:<br> <textarea cols=50 rows=20    name=ingredienti><?echo $ingredienti?></textarea>  </label> <br> <br> <label>Preparazione:<br> <textarea   cols=50   rows=20   name=preparazione ><?echo $preparazione?></textarea><br> </label> <br> <br> <label>Note:<br> <textarea   cols=25   rows=10   name=note><?echo $note?></textarea> </label> <br>       <p>        <input name="invia" type="submit" value="Invia" />      </p>    </form>    <? } ?>

il record viene estratto correttamente ma quando do' invia per modificarlo ricevo questo errore

[shadow=red,left]Errore nella query UPDATE ricette SET titolo ='Risotto al cacao', regione ='Primi', persone ='4', tipopiatto ='', ingredienti ='

\r\n

\r\n-300 g di riso carnaroli

\r\n

\r\n-5 cucchiai di cacao amaro

\r\n

\r\n-4 cucchiai di panna da cucina

\r\n

\r\n-1/2 cipolla tritata

\r\n

\r\n-1 bicchiere di vino bianco secco

\r\n

\r\n-30 g di burro brodo di pollo

\r\n

\r\n-parmigiano grattugiato', preparazione ='Sciogliete in padella il burro e soffriggetevi la cipolla tritata. Quando il soffritto è dorato e profumato, mettete in pentola il riso e tostatelo a fiamma bassa. Quando i chicchi di riso sono trasparenti, bagnate con il vino bianco e fiammeggiate per farlo svaporare. Quando il riso è asciutto, aggiungete un mestolo di brodo e ripetete loperazione ogni volta che il riso si asciuga fino al completamento della cottura (circa 18 minuti). Quando il risotto è cotto, setacciate il cacao sulla panna e mescolate. Aggiungete il composto al risotto cotto e mescolate per distribuirlo in maniera omogenea. Spolverizzate a piacere con parmigiano e servite in tavola.', note ='nulla', WHERE id = 6: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 6' at line 10[/shadow]

Dove sbaglio?

tra l'altro nel campo regione mi porta il valore del campo tipopiatto ??? ??? e tipopiatto lo lascia vuoto ::)

Del tuo script ho escluso questo ???

// verifico la presenza dei campi obbligatori
//   if(!$nome)
//   {
//      $messaggio = urlencode("Non hai inserito il nome");
//      header("location: $_SERVER[PHP_SELF]?id=$id&msg=$messaggio");
//      exit;
//   }

Ciao e grazie

inviato 10 anni fa
blackeyes
X 0 X

provato ad usare : addslashes

se usi l'apice singolo " ' " e poi ne inserisci un'altro nel testo php dà errore o perlomeno lo fa mysql ... usando addslashes($stringa)

ciao  :bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Il problema è una banale virgola in più prima della clausola WHERE della UPDATE. Cambia le righe:

note             ='$note',

WHERE id         = $id";

in

note             ='$note'

WHERE id         = $id";

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

loooooooooool che vista io l'ho letta due volte e non l'ho vista !

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Il problema è una banale virgola in più prima della clausola WHERE della UPDATE. Cambia le righe:

note             ='$note',

WHERE id         = $id";

note             ='$note'

WHERE id         = $id";

infatti l'errore era lì ok adesso una parte del problema è risolto, il record viene aggiornato ma non correttamente infatti il contenuto del campo regione viene sostituito da quello di tipopiatto e quest'ultimo viene lasciato vuoto

Errore nella query UPDATE ricette SET titolo ='Risotto al cacao', regione ='Primi', persone ='4', tipopiatto ='',

in

 :bye:

risposto 10 anni fa
blackeyes
modificato 10 anni fa
X 0 X

loooooooooool che vista io l'ho letta due volte e non l'ho vista !

:bye:

Solo 2 io prima di postarlo l'ho letto almeno 10 volte :-D

risposto 10 anni fa
blackeyes
X 0 X

un'altra domanda sempre prendendo in esame il tuo script:

// preparo la query

   $query = "UPDATE utenti SET

            nome = '$nome',

            email = '$email',

            sesso = $sesso,

            newsletter = $newsletter,

            attivita = $attivita,

            messaggio = '$messaggio'

            WHERE id = $id";

perchè in alcuni casi usi il singolo apice e in altri no?

risposto 10 anni fa
blackeyes
X 0 X

in caso di dati numerici nell'sql l'apice si può omettere ma non con le stringhe ...

se la query è definita nei doppi apici è meglio usare l'apice singolo in modo da non dover aggiungere l'escape a quelli doppi :

// tra apici doppi, con altri apici doppi ma con l'escape \

// altrimenti la definizione della stringa si interrompe e ti da errore . . . 

   $query = "UPDATE utenti SET

            nome = \"$nome\",

            email = \"$email\",

            sesso = \"$sesso\",

            newsletter = \"$newsletter\",

            attivita = \"$attivita\",

            messaggio = \"$messaggio\"

            WHERE id = $id";

// tra apici doppi, ma con quelli singoli dentro 

   $query = "UPDATE utenti SET

            nome = '$nome',

            email = '$email',

            sesso = '$sesso',

            newsletter = '$newsletter',

            attivita = '$attivita',

            messaggio = '$messaggio'

            WHERE id = $id";

la stessa cosa vale nel caso che siano gli apici singoli a "racchiudere" la query :)

apici singoli : singoli con escape o doppi,cioè con ' usi  \' o "

apici doppi : doppi con escape o singoli,cioè con " usi  \" o '

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
modificato 10 anni fa
X 0 X

in caso di dati numerici nell'sql l'apice si può omettere ma non con le stringhe ...

se la query è definita nei doppi apici è meglio usare l'apice singolo in modo da non dover aggiungere l'escape a quelli doppi :

la stessa cosa vale nel caso che siano gli apici singoli a "racchiudere" la query :)

apici singoli : singoli con escape o doppi,cioè con ' usi  \' o "

apici doppi : doppi con escape o singoli,cioè con " usi  \" o '

Perfetto non lo sapevo! Si vede che sono agli inizi eh?! :-)

risposto 10 anni fa
blackeyes
X 0 X
il record viene aggiornato ma non correttamente infatti il contenuto del campo regione viene sostituito da quello di tipopiatto e quest'ultimo viene lasciato vuoto

ho risolto anche questo c'era un errore nel form O0

risposto 10 anni fa
blackeyes
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda