[RISOLTO]Inserimento Immagini da pc a MySql

Alex@1983

Utente Attivo
9 Mag 2015
105
1
18
Ciao Amici del Forum,

avrei bisogno ancora di voi per una nuova "sfida con me stesso" nell' imparare questo affascinante linguaggio.
Nello specifico vorrei aggiungere al mio form di Registrazione Segnalazioni.... la possibilità di salvare una foto...

Cosa ho fatto allora: ho aggiunto al mio form che prevedeva i campi : DATA , SEGNALAZIONE , DESCRIZIONE , NOTE .... il campo FOTO

Ed ho aggiunto alla mia tabella MySql il campo "foto" (Long Blob )

Il codice del mio file , comprensivo della query di inserimento è :
PHP:
f(isset($_POST['registra'])){
    header("Cache-Control: no-cache");

include("connectDB.php");  

mysql_select_db("my_db");

$data = $_POST['data'];

$dataUs = explode("/", $data);
$datadb = $dataUs[2]. "-". $dataUs[1]. "-" .$dataUs[0];

$segnalazione = $_POST['segn'];
$descrizione = htmlentities($_POST['desc'],ENT_QUOTES);
$note = $_POST['note'];
$foto = $_POST['foto'];

$toinsert = "INSERT INTO `RegistroSegnalazioni`
        (data, segnalazione, descrizione, note, foto)
            VALUES
            (
              '$datadb',
             '$segnalazione',
             '$descrizione',
             '$note'
             '$foto')";

$res = mysql_query($toinsert);
Se provo ad inserire un record direttamente da phpmyadmin ... funziona .... Ma se provo dal form di inserimento mi dà Errorrrreeee !!!!

Mi illuminereste in merito ?...dove sbaglio ancora una volta ? .... ho provato a googolare in giro ... ma sono più confuso di prima !!!

Grazie in anticipo !
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
Partendo dal fatto che forse salvare le immagini sul DB non è una buona pratica, probabilmente hai sbagliato qui:
VALUES
(
'
$datadb',
'
$segnalazione',
'
$descrizione',
'
$note'
'
$foto')";
Codice:
$toinsert = "INSERT INTO `RegistroSegnalazioni`
        (data, segnalazione, descrizione, note, foto)
            VALUES
            ('".$data."',.....)
'(singolo) "(doppio).$variabile."(doppio)'(singolo)
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
il "file system" è il miglior database per foto e file di dimensioni onerose
ti suggerisco di evitare di memorizzare foto nel db,
memorizzale in un folder del file system e nel db registra le coordinate per rintracciarle (percorso e nome del file)
il db te ne sarà grato e lo saranno tutte le persone che dovessero fare un back up dei dati ( o peggio una restore)

quando chiedi supporto per un errore, posta anche l'errore così che si possa anche noi capire, spesso la causa non è nello scrip ma risiede da altre parti

per capire se l'errore deriva dalla foto, prova ad inserire la conversione prima della insert,
HTML:
$foto64 = base64_encode($foto)
e memorizza il file "64"
leggi il manuale php per info
 

Alex@1983

Utente Attivo
9 Mag 2015
105
1
18
Ciao Macus_adi e Marino51 .... Grazie per le risposte !

Allora... intanto ho verificato che , eliminando dalla tabella del db il campo foto, e modificando opportunamente il codice di inserimento dei dati .... il record viene inserito correttamente. Quindi il problema sembra nascere proprio nel monìmento in cui aggiungo " il pezzettino " relativo all' acquisizione della foto.

@macus_adi .... A questo punto , credo , che il problema di apici e doppi apici ... sia smarcato ...

@marino51 .... Ho provato aggiungendo "base64_encode($foto)" .... ma non cambiava nulla e l'insert falliva ugualmente. Per quanto riguarda il salvataggio in una cartella delle immagini poi...con relativo collegamento al record salvato nel DB ... non saprei neanche da dove cominciare onestamente.....:( .....

Aiutatemi .... non so proprio dove sbattere la testa !!!!!

Grazie ancora !
 

Alex@1983

Utente Attivo
9 Mag 2015
105
1
18
Macus_ ma il mio db è su altervista ... come controllo post_max_size ? .... il file poi è 77.1 kb .....
 

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
PHP:
try{
    $res = mysql_query($toinsert);
}catch (Exception $e){
    print_r($e);
}
Posta codice errore!
 

Alex@1983

Utente Attivo
9 Mag 2015
105
1
18
Ciao Macus...Rispondo solo adesso perchè ieri ho avuto dei disagi e non ho potuto....

ho provato ad inserire il pezzo di codice che mi hai consigliato ma non succede proprio nulla......

allego lo screen della mia tabella db + il codice ... nella speranza di riuscire ad ovviare...

Nella tabella noterai che gli ultimi due record contengono correttamente l'immagine....Ma quelle sono due prove fatte direttamente da phpmyadmin ..... le prime due ,fatte da form ... vengono registrate ma senza immagine

Grazie ancora per il supporto !

PHP:
  <form id="forminserisci" method="post" enctype="multipart/form-data" runat="server" action="<?php echo $_SERVER['PHP_SELF']; ?>" autocomplete="on">
    <table class="tableinserisci" align="center">
      <tr>
        <td align="center" colspan="8" class="registro"><h1>REGISTRO VERIFICHE</h1></td>
    </tr>
    <tr></tr>
       <tr></tr>
       <tr></tr>
       <tr></tr>
       <tr></tr>
       <tr></tr>
      <tr class="lbl"> 
         <td class="lbl"; align="center">DATA</td>
       </td>
     <td class="lbl"; align="center">SEGNALAZIONE
       </td>
       <td> <input type="hidden" class="desc" id="desc"  name="desc" value="" size="65" autocomplete="on">
       </td>
     </tr>
      <tr>   
         <td> <input type="text" id="data"  name="data" value="<?php echo date("d/m/Y");?>" size="10" autocomplete="on">
       </td>
     <td> <select id="segn"  name="segn" value="">
        <option></option>
        <option>Altro</option>
   </select>
       </td> 
       <td> <input type="hidden" class="aaa" id="aaa"  name="desc" value="" size="65" autocomplete="on">
       </td>
  <tr>
         <td class="lbl"; align="center"; colspan="3">DESCRIZIONE
       </td>
       <td class="lbl"; align="center"; colspan="1">
       </td>
     </tr>
       <tr>
      <td colspan="3"> <input type="text" class="desc" id="desc"  name="desc" value="" size="65" autocomplete="on">
       </td>
       <td colspan="1"> <input type="hidden" class="desc" id="des"  name="des" value="" size="65" autocomplete="on">
       </td>
     </tr>
<tr>
<td><input type="file" id="foto" name= "foto"></td>
</tr>


       <tr></tr>
     <td align="center"; colspan="8"><input type="submit" name="registra" value="Registra"
                 style="
                      width: 161px;
                      height: 55px;
                      font-size: 25px;
                      ">
       </td>
     </tr>
</table>
  </form>
<br/>
<br/> 
 
<?php

if(isset($_POST['registra'])){
    header("Cache-Control: no-cache");

include("connectDB.php");   

mysql_select_db("my_web1105");

//$id = ;

$data = $_POST['data'];

$dataUs = explode("/", $data);
$datadb = $dataUs[2]. "-". $dataUs[1]. "-" .$dataUs[0]; 

$operatore = $_POST['oper'];
$segnalazione = $_POST['segn'];
$descrizione = htmlentities($_POST['desc'],ENT_QUOTES);
$foto = $_POST['foto'];
$fotodb = base64_encode($foto);

if(preg_match("#^\d{2}/\d{2}/\d{4}$#",$data))

    {
    echo "";
}
else
    {   
    echo "Inserisci la data nel formato corretto \n gg/mm/aaaa";
        
    exit;
}   

if (($data=="") || ($segnalazione=="") )

    {
        echo "Non hai inserito la data o la segnalazione";

        exit;
    }


$toinsert = "INSERT INTO RegistroVerifiche2017
        (data, segnalazione, descrizione, foto)
            VALUES
            (
              '$datadb',
             '$segnalazione',
             '$descrizione',
             '$foto'
              )";


$res = mysql_query($toinsert);

if($res){

echo("");

header("location: Inserisci.php");
    
}

else
    {
    echo("ERRORE
               '$datadb',
             '$segnalazione',
              '$descrizione',
              '$note',
             '$foto'
                ").mysql_error();

mysql_close($connessione);
}
}

try{
    $res = mysql_query($toinsert);
}catch (Exception $e){
    print_r($e);
}
 

Allegati

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
La foto non risiede nella variabile POST, ma in FILES.
Il try doveva essere l'esecuzione della query non alla fine del file.
Ti posto comunque il codice, ho utilizzato la nuova estensione mysqli e non mysq in quanto vecchiotta.
PHP:
function get_conn(){
    $mysql=new mysqli('localhost','root','','test');
    return $mysql;
}
if(isset($_POST['registra'])){
    header("Cache-Control: no-cache");

    $conn=get_conn();


    $data = $_POST['data'];

    $dataUs = explode("/", $data);
    $datadb = $dataUs[2]. "-". $dataUs[1]. "-" .$dataUs[0];

    $operatore = (isset($_POST['oper']))?$_POST['oper']:'null';
    $segnalazione = (isset($_POST['segn']))?$_POST['segn']:'null';
    $descrizione = htmlentities($_POST['desc'],ENT_QUOTES);
//FOTO
    $fotodb = base64_encode(file_get_contents($_FILES['foto']['tmp_name']));
    if(preg_match("#^\d{2}/\d{2}/\d{4}$#",$data))
    {
        echo "";
    }
    else
    {
        echo "Inserisci la data nel formato corretto \n gg/mm/aaaa";

        exit;
    }
    if (($data=="") || ($segnalazione=="") )
    {
        echo "Non hai inserito la data o la segnalazione";
        exit;
    }
    $toinsert = "INSERT INTO RegistroVerifiche2017
        (`data`, `segnalazione`, `descrizione`, `foto`)
            VALUES
            (
              '$datadb',
             '$segnalazione',
             '$descrizione',
             '$fotodb'
              )";
    try{
        $conn->query($toinsert);
    }catch (Exception $e){
        print_r($e);
    }
}
File HTML per invio dati:
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form id="forminserisci" method="post" enctype="multipart/form-data"  action="index.php" autocomplete="on">
    <table class="tableinserisci" align="center">
        <tr>
            <td align="center" colspan="8" class="registro"><h1>REGISTRO VERIFICHE</h1></td>
        </tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr class="lbl">
            <td class="lbl"; align="center">DATA</td>
            </td>
            <td class="lbl"; align="center">SEGNALAZIONE
            </td>
            <td> <input type="hidden" class="desc" id="desc"  name="desc" value="" size="65" autocomplete="on">
            </td>
        </tr>
        <tr>
            <td> <input type="text" id="data"  name="data" value="<?php echo date("d/m/Y");?>" size="10" autocomplete="on">
            </td>
            <td> <select id="segn"  name="segn" value="">
                <option></option>
                <option>Altro</option>
            </select>
            </td>
            <td> <input type="hidden" class="aaa" id="aaa"  name="desc" value="" size="65" autocomplete="on">
            </td>
        <tr>
            <td class="lbl"; align="center"; colspan="3">DESCRIZIONE
            </td>
            <td class="lbl"; align="center"; colspan="1">
            </td>
        </tr>
        <tr>
            <td colspan="3"> <input type="text" class="desc" id="desc"  name="desc" value="" size="65" autocomplete="on">
            </td>
            <td colspan="1"> <input type="hidden" class="desc" id="des"  name="des" value="" size="65" autocomplete="on">
            </td>
        </tr>
        <tr>
            <td><input type="file" id="foto" name= "foto"></td>
        </tr>


        <tr></tr>
        <td align="center"; colspan="8"><input type="submit" name="registra" value="Registra"
                                               style="
                      width: 161px;
                      height: 55px;
                      font-size: 25px;
                      ">
        </td>
        </tr>
    </table>
</form>
<br/>
<br/>
</body>
</html>
Ho replicato il tuo DB, funziona!
 
  • Like
Reactions: Alex@1983

Alex@1983

Utente Attivo
9 Mag 2015
105
1
18
La foto non risiede nella variabile POST, ma in FILES.
Il try doveva essere l'esecuzione della query non alla fine del file.
Ti posto comunque il codice, ho utilizzato la nuova estensione mysqli e non mysq in quanto vecchiotta.
PHP:
function get_conn(){
    $mysql=new mysqli('localhost','root','','test');
    return $mysql;
}
if(isset($_POST['registra'])){
    header("Cache-Control: no-cache");

    $conn=get_conn();


    $data = $_POST['data'];

    $dataUs = explode("/", $data);
    $datadb = $dataUs[2]. "-". $dataUs[1]. "-" .$dataUs[0];

    $operatore = (isset($_POST['oper']))?$_POST['oper']:'null';
    $segnalazione = (isset($_POST['segn']))?$_POST['segn']:'null';
    $descrizione = htmlentities($_POST['desc'],ENT_QUOTES);
//FOTO
    $fotodb = base64_encode(file_get_contents($_FILES['foto']['tmp_name']));
    if(preg_match("#^\d{2}/\d{2}/\d{4}$#",$data))
    {
        echo "";
    }
    else
    {
        echo "Inserisci la data nel formato corretto \n gg/mm/aaaa";

        exit;
    }
    if (($data=="") || ($segnalazione=="") )
    {
        echo "Non hai inserito la data o la segnalazione";
        exit;
    }
    $toinsert = "INSERT INTO RegistroVerifiche2017
        (`data`, `segnalazione`, `descrizione`, `foto`)
            VALUES
            (
              '$datadb',
             '$segnalazione',
             '$descrizione',
             '$fotodb'
              )";
    try{
        $conn->query($toinsert);
    }catch (Exception $e){
        print_r($e);
    }
}
File HTML per invio dati:
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form id="forminserisci" method="post" enctype="multipart/form-data"  action="index.php" autocomplete="on">
    <table class="tableinserisci" align="center">
        <tr>
            <td align="center" colspan="8" class="registro"><h1>REGISTRO VERIFICHE</h1></td>
        </tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr></tr>
        <tr class="lbl">
            <td class="lbl"; align="center">DATA</td>
            </td>
            <td class="lbl"; align="center">SEGNALAZIONE
            </td>
            <td> <input type="hidden" class="desc" id="desc"  name="desc" value="" size="65" autocomplete="on">
            </td>
        </tr>
        <tr>
            <td> <input type="text" id="data"  name="data" value="<?php echo date("d/m/Y");?>" size="10" autocomplete="on">
            </td>
            <td> <select id="segn"  name="segn" value="">
                <option></option>
                <option>Altro</option>
            </select>
            </td>
            <td> <input type="hidden" class="aaa" id="aaa"  name="desc" value="" size="65" autocomplete="on">
            </td>
        <tr>
            <td class="lbl"; align="center"; colspan="3">DESCRIZIONE
            </td>
            <td class="lbl"; align="center"; colspan="1">
            </td>
        </tr>
        <tr>
            <td colspan="3"> <input type="text" class="desc" id="desc"  name="desc" value="" size="65" autocomplete="on">
            </td>
            <td colspan="1"> <input type="hidden" class="desc" id="des"  name="des" value="" size="65" autocomplete="on">
            </td>
        </tr>
        <tr>
            <td><input type="file" id="foto" name= "foto"></td>
        </tr>


        <tr></tr>
        <td align="center"; colspan="8"><input type="submit" name="registra" value="Registra"
                                               style="
                      width: 161px;
                      height: 55px;
                      font-size: 25px;
                      ">
        </td>
        </tr>
    </table>
</form>
<br/>
<br/>
</body>
</html>
Ho replicato il tuo DB, funziona!
Graziiiiisssmmoooo Macus!

Avevo voglia di provare e riprovare io !!!!.... [Files] no [Post] !!!! ...... ecco come saltano fuori tutte le mie debolezze da novellino !:(:(

L'immagine viene correttamente inserita nel db .... ovviamente codificata ed allo stesso modo viene visualizzata nella <table> , sottostante il form , che mostra i record inseriti .....chiaramente annche li mostra l'immagine codificata (valori alfanumerici ) ....

Per visualizzarla all'interno della <table> ... credi sia sufficiente usare "base64_decode() ?

Tipo :

PHP:
$foto = base64_decode($result['foto']) ;

echo "<tr bgcolor='#98FF98'><td style='width: 35px;'>".$r['id']."</td>".
     "<td style='width: 82px;'>".$dataRelIta."</td>".
     "<td style='width: 143px;'>".$r['segnalazione']."</td>".
     "<td style='width: 500px;'>".$r['descrizione']."</td>".
     "<td style='width: 80px; '>" .$foto."<td>
    </tr>";
Per ora non mi funziona.... ma magari sto sbagliando qualcosa nella sintassi ? .... o mi perdo ancora qualche pezzo per strada ?....

Non mandarmi a quel paese ......;)
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.265
82
48
IT/SW
Quando salvi è encode, quando visualizza decode!
PHP:
$foto = base64_decode($result['foto']) ;
$foto='<img src="data:image/png;base64,'.$foto.'" />';
echo "<tr bgcolor='#98FF98'><td style='width: 35px;'>".$r['id']."</td>".
"<td style='width: 82px;'>".$dataRelIta."</td>".
"<td style='width: 143px;'>".$r['segnalazione']."</td>".
"<td style='width: 500px;'>".$r['descrizione']."</td>".
"<td style='width: 80px; '>" .$foto."<td>
</tr>"
;
 
  • Like
Reactions: Alex@1983

Alex@1983

Utente Attivo
9 Mag 2015
105
1
18
Quando salvi è encode, quando visualizza decode!
PHP:
$foto = base64_decode($result['foto']) ;
$foto='<img src="data:image/png;base64,'.$foto.'" />';
Ciao Macus_adi...

Questa volta scrivo solo per RINGRAZIARTI di tutto l'aiuto che mi hai voluto dare !

Grazie alle tue dritte sono riuscito a fare quello che avevo in mente :
--Salvare un' immagine nel db
--Estrarla per visualizzarla all'interno di una "Tabella-Registro"

Da questa mattina poi ... mi sono "sbattuto" per portare a termine un' ultima cosa che ... dava il tocco finale al tutto :
--Ricevere una mai lin HTML ... con allegata l'immagine.....ogni volta che una segnalazione viene inserita.
Ho faticato un po ma ... prova e riprova .... alla fine cel'ho fatta!

Senza il tuo aiuto ...starei ancora cercando di capire come mai .... $foto = $_POST['foto'] ..... non funzionava...;)

Grazie mille ancora !!
 

Alex@1983

Utente Attivo
9 Mag 2015
105
1
18
Deve essere $_FILES no $_POST
per questo ti ho scritto :

Senza il tuo aiuto ...starei ancora cercando di capire come mai .... $foto = $_POST['foto'] ..... non funzionava...;)

Intendevo proprio dire che ...se non mi avessi spiegato il mio "banale" errore ... sarei fermo ancora all'inizio.....;)