Discussione chiusa
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: [PHP] Update Immagine

  1. #1
    sanpedroguadalcanal non  in linea Scolaretto
    Post
    54

    [PHP] Update Immagine

    Salve a tutti,
    nel mio DB c' un'immagine; da una form di modifica inserisco una nuova foto che andrebbe a sostituire la precedente:
    Codice PHP:
    <?
    ...
    echo 
    "<form action=\"modifica.php\"  method=\"POST\" name=\"mod\" enctype=\"multipart/form-data\">";
    echo 
    "    Foto:   <input name=\"imm\"  type=\"file\">  <br>"
    echo
    " </form>";
    ...
    ?>
    Vorrei sapere:
    1) come si fa ad impostare a tale tag di input il valore di default pari alla foto precedente, cio tale da rendere il campo, ora vuoto, riempito gi col valore della foto esistente nel db;

    2) una volta che vado a modificare il campo inserendo una nuova foto, la invio alla pagina "modifica.php", che ha il compito di fare l'update dell'immagine nel db:
    Codice PHP:
    // modifica.php
    <?
    ...
    $file=$_FILES['imm']['tmp_name'];                                  // acquisisco l'immagine

    $immagine   addslashes(file_get_contents($file));          // la rendo compatibile col campo BLOB

    $sql="UPDATE  table SET  immagine='$immagine' ";         // eseguo l'update
     
    $query=@mysql_query($sql) or die (mysql_error());
     {echo 
    "Modifica immagine eseguita con successo<br><br><br>"; }

    ?>
    Ma questo update non mi funziona: l'immagine non viene modificata, resta quella di prima.
    Dove sto sbagliando?

  2. #2
    L'avatar di bottomap
    bottomap non  in linea Moderatore Globale
    Post
    4,130
    Ciao,

    1) Non puoi farlo. Mostra l'immagine attuale e prevedi che l'utente possa non inviarne una nuova. Pensa al campo file come un contenitore lato client... o vuoto o reimpito con i dati di un'immagine sul pc client. Non puoi impedirlo e non puoi pre-riempire i dati lato server.

    2) Invece della addslashes usa la funzione apposita mysql_real_escape_string che tratta in modo speciale alcuni caratteri in pi. Alla query manca una clausola where (immagino il codice sia solo esemplificativo). Inoltre per i blob esiste un limite di dimensioni specifico (il BLOB arriva a 64k, per immagini pi grandi devi usare almeno il MEDIUMBLOB). Ti devi assicurare che la dimensione del file non superi il massimo consentito. Per il resto dovrebbe andare... verifica anche che la cache non entri in mezzo se continui a vedere le immagini precedenti (prova ad aggiornare la pagina con Ctrl+F5).

    Ciaociao


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta no, sarebbe proprio l'ora di farlo...
    - Il Crossposting vietato dalla Netiquette.

    "Solo Puffin ti dar forza e grinta a volont" - Charlie O'Brian
    "I gatti sono animali verso cui ho il massimo rispetto. I gatti e i non conformisti mi sembrano davvero i soli esseri in questo mondo che abbiano una coscienza pratica e attiva" - Jerome K. Jerome
    "Dun Dun DUNNN!" - Capitan Caos
    (per chiunque se lo fosse mai chiesto, il nick Bottomap volutamente sgrammaticato)

  3. #3
    sanpedroguadalcanal non  in linea Scolaretto
    Post
    54
    Ciao bottomap,
    ho inserito mysql_real_escape_string al posto di addslashes (e ho inserito la clausola WHERE , il codice era solo esimplificativo):
    Codice PHP:
    // modifica.php
    <?
    ...
    $file=$_FILES['imm']['tmp_name'];                                  // acquisisco l'immagine

    $immagine   mysql_real_escape_string(file_get_contents($file));          // la rendo compatibile col campo BLOB

    $sql="UPDATE  table SET  immagine='$immagine'  WHERE id=$id";            // eseguo l'update
     
    $query=@mysql_query($sql) or die (mysql_error());
     {echo 
    "Modifica immagine eseguita con successo<br><br><br>"; }

    ?>
    il risultato che continuo a visualizzare l'immagine precedente sulla pagina (che dopo CTRL+F5 scompare) e guardando nel db, vedo che laddove l'immagine prima era [BLOB - 35KiB], ora [BLOB - 0KiB], come fosse svanita;
    ho verificato che la stessa cosa avveniva con 'addslashes', cio l'immagine nel db non si aggiorna ma "scompare".
    Il campo MEDIUMBLOB e le dimensioni delle immagini inserite sono corrette, tant' vero che l'immagine caricata la prima volta si visualizza correttamente.


    P.S.: una cosa strana che la INSERT per l'inserimento iniziale delle immagini funziona correttamente (con addslashes) ma la UPDATE no.
    Ultima modifica di sanpedroguadalcanal; 26-11-2010 03:55 

  4. #4
    L'avatar di bottomap
    bottomap non  in linea Moderatore Globale
    Post
    4,130
    Ciao,

    Che versione di mysql stai usando?

    Inoltre, verifica se il problema a valle o a monte dell'esecuzione della query... il $file o il $immagine ad essere vuoto oppure fallisce la query? E in quel caso che errore ottieni?
    Togli la @ davanti alla chiamata e verifica il valore di ritorno (true/false). Se false fatti stampare eventualmente il mysql_error.

    Ciaociao


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta no, sarebbe proprio l'ora di farlo...
    - Il Crossposting vietato dalla Netiquette.

    "Solo Puffin ti dar forza e grinta a volont" - Charlie O'Brian
    "I gatti sono animali verso cui ho il massimo rispetto. I gatti e i non conformisti mi sembrano davvero i soli esseri in questo mondo che abbiano una coscienza pratica e attiva" - Jerome K. Jerome
    "Dun Dun DUNNN!" - Capitan Caos
    (per chiunque se lo fosse mai chiesto, il nick Bottomap volutamente sgrammaticato)

  5. #5
    sanpedroguadalcanal non  in linea Scolaretto
    Post
    54
    La versione MySQL 3.23.32;
    Ho tolto la @ prima della query (ma c' differenza tra metterla o toglierla?).
    Ho stampato $immagine:
    Codice PHP:
    $immagine   addslashes(file_get_contents($_FILES['imm']['tmp_name']));
    echo 
    $immagine
    e il risultato stato giusto:
    Codice PHP:
    &#8240;PNG  \0\0\0 IHDR\0\0\0L\0\0{\0\0\0\0|\0\0\0sBIT|dˆ\0\0\0 pHYs\0\0\0\0~\0\0\0tEXtSoftware\0Adobe Fireworks CS4 \0\0\0tEXtCreation Time\010/15/10=\0\07prVWxœ—•0E-‚„lA)iͤ€=e;y#K: ٿf†?~=ŠžG)U.kYh•u-R—|‹[‹g^}M&„Ÿ>?=§}^dhšO?QO{Ÿo7-m 
    .....
    [
    I]...ecc...[/I]
    ..... 
    quindi il $F_FILES non vuoto.
    Dopodich ho cercato gli errori nella query:
    Codice PHP:
     $sql="UPDATE annunci SET  immagine='$immagine', titolo='$titolo', categoria = '$categoria', descrizione='$descrizione', immagine='$foto', prezzo='$prezzo', nome='$nome', cognome='$cognome', uid='$uid', data='$data', datagma='$datagma', dataoms='$dataoms' WHERE id=$id";     

     
    $query=mysql_query($sql) or die (mysql_error());
     
    mysql_error($query);
     {echo 
    "Modifica immagine eseguita con successo<br><br><br>"; } 
    e il risultato stato:

    Modifica immagine eseguita con successo

    Quindi la query non d errori.
    Ultima modifica di sanpedroguadalcanal; 26-11-2010 12:27 

  6. #6
    L'avatar di bottomap
    bottomap non  in linea Moderatore Globale
    Post
    4,130
    Quindi la query non d errori.
    Ecco un bell'esempio di falsa certezza... quel codice che hai scritto stamper sempre e comunque "Modifica immagine eseguita con successo" a meno che non finisca nella die(), visto che hai inserito una echo che stampa sempre quella frase.

    La mysql_error non accetta argomenti se non un resource_identifier opzionale (non il tuo caso) e restituisce una stringa descrittiva dell'errore che tu non stampi. E'comunque possibile che effettivamente non ci siano errori, ma se non li stampi non lo saprai mai.
    Lascia perdere un attimo le cose abbreviate e verifica i risultati "a mano":
    Codice PHP:
    $query="UPDATE ...";
    $risultato=mysql_query($query);
    if(!
    $risultato){
       die(
    'Errore Query: ' mysql_error());

    La @ serve a sopprimere i messaggi di errore e non il caso di metterla durante lo sviluppo.

    Ciaociao
    Ultima modifica di bottomap; 26-11-2010 13:46 


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta no, sarebbe proprio l'ora di farlo...
    - Il Crossposting vietato dalla Netiquette.

    "Solo Puffin ti dar forza e grinta a volont" - Charlie O'Brian
    "I gatti sono animali verso cui ho il massimo rispetto. I gatti e i non conformisti mi sembrano davvero i soli esseri in questo mondo che abbiano una coscienza pratica e attiva" - Jerome K. Jerome
    "Dun Dun DUNNN!" - Capitan Caos
    (per chiunque se lo fosse mai chiesto, il nick Bottomap volutamente sgrammaticato)

  7. #7
    sanpedroguadalcanal non  in linea Scolaretto
    Post
    54
    hai ragione, in effetti mi d questo errore:

    Modifica immagine eseguita con successo


    Errore Query: 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 '1' at line 1

  8. #8
    L'avatar di bottomap
    bottomap non  in linea Moderatore Globale
    Post
    4,130
    Ciao,

    1) Come mai tornata la addslashes? Stai usando la addslashes o la mysql_real_escape_string?
    2) Che versione di php e di mysql stai usando?
    3) A seconda della 2, nel php.ini hai la magic_quotes_gpc attivata? In quel caso non vanno usate le funzioni per l'escape, altrimenti effettui un doppio escape con risultati errati, soprattutto su dati binari.

    Fatti stampare la query che esegui, separandola dalla mysql_query (come ho fatto nel codice che ho postato pi sopra) e magari togliendo di mezzo la parte relativa a $image. A questo punto meglio verificare che anche il resto della query sia corretto prima di dare la colpa al blob.


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta no, sarebbe proprio l'ora di farlo...
    - Il Crossposting vietato dalla Netiquette.

    "Solo Puffin ti dar forza e grinta a volont" - Charlie O'Brian
    "I gatti sono animali verso cui ho il massimo rispetto. I gatti e i non conformisti mi sembrano davvero i soli esseri in questo mondo che abbiano una coscienza pratica e attiva" - Jerome K. Jerome
    "Dun Dun DUNNN!" - Capitan Caos
    (per chiunque se lo fosse mai chiesto, il nick Bottomap volutamente sgrammaticato)

  9. #9
    sanpedroguadalcanal non  in linea Scolaretto
    Post
    54
    1) scusami, ho commesso un errore nella trascrizione, sto usando la mysql_real_escape_string:

    Codice PHP:
    $immagine   mysql_real_escape_string(file_get_contents($_FILES['imm']['tmp_name']));

    $sql="UPDATE  table SET  immagine='$immagine'  WHERE id=$id";
    $query=mysql_query($sql) or die (mysql_error());
     {echo 
    "Modifica immagine eseguita con successo<br><br><br>"; }

    $risultato=mysql_query($query);
    if(!
    $risultato){
       die(
    'Errore Query: ' mysql_error());

    2) Versione MySQL: 3.23.32; Versione PHPMyAdmin: 2.11.9.5


    Ho scoperto, grazie al tuo suggerimento di verificare '$risultato', che anche la insert presenta lo stesso errore, quindi credo sia un problema di formattazione della stringa...ma a questo punto non so che fare perch le ho provate tutte: apici, doppi apici, senza apici...non so che fare.

  10. #10
    L'avatar di bottomap
    bottomap non  in linea Moderatore Globale
    Post
    4,130
    Ciao,

    Se sospetti che una query non sia ben formata, stampala a video (magari togliendo la parte relativa a $immagine che riempirebbe di dati binari la pagina).
    Se hai la query che ti accingi ad eseguire in $sql, fai una echo $sql prima di lanciare effettivamente la query e posta qui il risultato... dovresti vedere la query con gli argomenti effettivi e hai modo di valutare meglio quale sia il problema.

    Per quanto riguarda gli argomenti, ricorda che gli apici vanno inseriti solo se i campi su cui operi sono di tipo stringa (char, varchar) o blob. Nel caso di numerici, come fai per l'id, non devi incapsulare il valore tra apici (prezzo e uid nella query pi sopra mi sembrano, a naso, valori numerici piuttosto che stringhe).

    NB: Mysql molto datato (siamo alla 5.5 e oltre oramai - non semplice capire come si comportava la 3.23 con i BLOB... non da escludere che ci fossero problemi). Poi chiedevo la versione di php, non di phpmyqdmin...


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta no, sarebbe proprio l'ora di farlo...
    - Il Crossposting vietato dalla Netiquette.

    "Solo Puffin ti dar forza e grinta a volont" - Charlie O'Brian
    "I gatti sono animali verso cui ho il massimo rispetto. I gatti e i non conformisti mi sembrano davvero i soli esseri in questo mondo che abbiano una coscienza pratica e attiva" - Jerome K. Jerome
    "Dun Dun DUNNN!" - Capitan Caos
    (per chiunque se lo fosse mai chiesto, il nick Bottomap volutamente sgrammaticato)

Discussione chiusa
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi