• User

    Abbinare più immagini ad un record

    Salve a tutti, mi servirebbe inserire più immagini in un articolo, ma non riesco a capire come devo fare, il record viene memorizzato, ma le immagini non vengono uplodate nella cartella public. Provo a passare il listato da me utilizzato, se qualcuno possesse dirmi dove sbaglio:
    Questo è il form che utilizzo:
    [php]<html>
    <head>
    <meta http-equiv='Content-Type' content='text/html; charset=windows-1252'>
    <title>form 1</title>
    </head>
    <body>
    <form action='insert.php' method='post' enctype='multipart/form-data' name='form1'>
    <table align='center'><tr valign='baseline'>
    <td nowrap align='right'> </td>
    <td> </td></tr>
    <tr valign='baseline'>
    <td nowrap align='right'> </td>
    <td> </td></tr>
    <tr valign='baseline'>
    <td nowrap align='right'> </td>
    <td> </td></tr>
    <tr valign='baseline'>
    <td nowrap align='right'> </td>
    <td> </td></tr>
    <tr valign='baseline'>
    <td nowrap align='right'> </td>
    <td> </td></tr>
    <tr valign='baseline'>
    <td nowrap align='right'>
    <p align='right'>Cognome - Nome</td>
    <td><input type='text' name='cognome' value='' size='32'></td></tr>
    <tr valign='baseline'>
    <td nowrap align='right'>Descrizione:</td>
    <td><input type='text' name='descrizione' value='' size='32'></td></tr>
    <?php
    for ($numFoto = 1; $numFoto <= 2; $numFoto ++){
    echo " <tr valign='baseline'> <td nowrap align='right'>Foto $numFoto: <td><input name='userfile.$numFoto' type='file' id='foto' value='' /><br></td></tr>";
    }
    echo "<td><input type='submit' value='Inserisci Foto'></td></tr>";
    ?>
    </table>
    <input type='hidden' name='MAX_FILE_SIZE' value='30000'></form>
    </body>
    </html>
    [/php]

    Questo per inserire i dati nel db e upodare le immagini
    [php]<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <title>insert</title>
    </head>
    <body>
    <?php

    $db=mysql_connect("xxxxxx", "xxxxxxx", "xxxxxx");
    $comando = "INSERT INTO foto VALUES (0,'$descrizione','$cognome')"; //preparo la stringa per l'inserimento
    mysql_db_query(Sql125150_5, $comando); //effettuo l'inserimento sul database

    for ($numFoto = 1; $numFoto <= 2; $numFoto ++)
    {

    $ultimo_id=mysql_insert_id(); //valore di foto_id dopo l'inserimento
    $file_temp=($_FILES['userfile.$numFoto']['tmp_name']); //file temporaneo che contiene l'immagine caricata
    $percorso="../public/img_foto/"; //cartella sul server dove verrà spostata la foto
    $nuovo_nome=$percorso.$ultimo_id.".jpg"; //nuovo nome dell'immagine
    $inviato=file_exists($file_temp); //verifica se il file è stato caricato sul server
    if ($inviato) {move_uploaded_file($file_temp.$nuovo_nome);

    header("Location:VisualizzaFoto.php"); // sposto l'immagine nella cartella e vado alla pagina di visualizzazione
    } else {
    header("Location:Errore.php"); // vado alla pagina di errore
    }}
    mysql_close($db);
    ?>
    </body>
    </html>
    [/php]

    Spero in un Vostro aiuto per capire dovè l'errore


  • User Attivo

    Ciao giovy58,
    direi che l'errore e' nell'uso della funzione "move_uploaded_file". Infatti hai usato un punto "." al posto della virgola ",". Infatti tale funzione richiede due argomenti, mentre cosi' risultano uno solo.

    Facci sapere


  • User

    Ciao grazie per la celerità nella risposta, ho provato a cambiare il punto con la virgola,ma niente da fare, non funziona.


  • User Attivo

    Ciao, prova a sostituire questo blocco
    [php]
    $inviato=file_exists($file_temp); //verifica se il file è stato caricato sul server
    if ($inviato) {move_uploaded_file($file_temp.$nuovo_nome);
    [/php]

    con
    [php]
    if (is_uploaded_file($file_temp))
    {
    move_uploaded_file($file_temp,$nuovo_nome);
    //...
    }
    [/php]


  • User Attivo

    Ti segnala qualche errore lo script? Se si, prova a riportarlo qui.

    Potrebbe essere che non hai i permessi giusti per la cartella $percorso.


  • User

    niente da fare, ho sostituito il tutto ma non ottengo nessun upload.
    Questo script lo utilizzavo e lo utilizzo nel mio sito per inserire una immagine abbinata ad un record (ed il nome diventa il numero dell'id )e funziona perfettamente visto che mi serve inserire più immagini nello stesso record (articolo news o altro) ho inserito un ciclo di for sia nel form che nella pagina che inserisce il record nel db.
    Anche con le modifice da Voi consigliatemi memorizza i dati nel db, ma non effettua l'upload delle immagini. Ho però notato che nella pagina di prova che ho fatto per vedere se funziona lo script non riesce a dare un nome diverso alle due immagini abbinate al recod, vi segnalo le tre pagine utilizzate in quanto ho paura che non riesca a spiegare bene il problema:

    Pagina form (completate voi in quanto non mi permette di inserire il link completo)
    srcity.it/prova_immagini/form1.php

    Pagina inserimento
    srcity.it/prova_immagini/insert.php

    Pagina lettura
    srcity.it/prova_immagini/VisualizzaFoto.php

    Vi prego di aiutarmi, risolverei tutti i miei problemi


  • User Attivo

    Ciao giovy58..

    Prima di tutto ti faccio una domanda ?

    Sei su hosting windows ?


  • User

    Ciao MZ, si sono su hosting Windows su ARUBA


  • User

    Mi avete abbandonato?:bho:


  • User Attivo

    Ciao giovy58,

    ho provato ad inserire un'immagine ed in effetti c'e' qualcosa che non funziona.

    Prova a postare il codice di "insert.php" e "VisualizzaFoto.php".

    :ciauz:


  • User Attivo

    Sicuro che nella variabile $percorso vada impostato "../public/img_foto/" e non "public/img_foto/".
    Se lo script che deve spostare la foto nella cartella pubblic, si trova allo stesso livello della cartella, "../" non serve, in quanto obbligano lo script a tornare indietro di un livello superire per cercare la cartella dove posizionare i file.


  • User

    Si, sono sicuro in quanto è in una cartella superiore del sito, e tralarto con una sola immagine funziona, a dir la verità anche con due ci sono riuscito, ma devo riscrivere sempre la routine, e mi volevo evolvere un pochino(visto che non capsco nulla di programmazione) utilizzando il ciclo di for, che potrebbe avere degli sviluppi interessanti, ad esempio si potrebbe decidere prima quante immagini impostare per ogni articolo etc.


  • User Attivo

    Secondo me non funziona per il fatto che cerchi di inviare più immagini nella stessa cartella public rinominandole tutte con lo stesso nome.

    mysql_db_query(Sql125150_5, $comando);

    for(...)
    {
    $ultimo_id=mysql_insert_id();
    $file_temp=($_FILES['userfile.$numFoto']['tmp_name']);
    $percorso="../public/img_foto/";
    $nuovo_nome=$percorso.$ultimo_id.".jpg";

    Impostato così, $ultimo_id è sempre uguale ad ogni ciclo del FOR dato che l'inserimento del DataBase è unico e viene eseguito prima di entrare nel FOR.
    Di conseguenza $nuovo_nome=$percorso.$ultimo_id.".jpg"; sarà sempre uguale per ogni foto inviata, causando sovrascrizioni oppure errori.
    Per questo se ripeti due volte la routin funziona, perchè crei un nuovo inserimento nel DB e quindi un nuovo ID da assegnare alla foto.


  • User

    Hai perfettamente ragione per la prima parte, in quanto l'id rimane lo stesso, però quando inserisco due foto nel form inserisco due immagini con nome file diversi e nella pagina che upload le immagini ripeto due volte la routine dell'upload con i due nomefile diversi, ma l'id del record al quale sono abbinati è identico cioè unico.
    Faccio l'esempio solo perchè ho paura di non sapermi spiegare:
    Nel Form che in questo caso è un html
    [HTML]<tr valign="baseline"> <td nowrap align="right">Foto</td>
    <td> <input name="userfile" type="file" id="foto"></td></tr>
    <tr valign="baseline"> <td nowrap align="right">Foto 2</td>
    <td> <input name="userfile1" type="file" id="foto"></td></tr>
    [/HTML]

    Nella pagina di inserimento

    [PHP]$ultimo_id=mysql_insert_id(); //valore di foto_id dopo l'inserimento
    $file_temp=($_FILES['userfile']['tmp_name']); //file temporaneo che contiene l'immagine caricata
    $percorso="../public/img_foto/"; //cartella sul server dove verrà spostata la foto
    $nuovo_nome=$percorso.$ultimo_id.".jpg"; //nuovo nome dell'immagine
    echo "$nuovo_nome <br>";
    if (is_uploaded_file($file_temp)){
    move_uploaded_file($file_temp,$nuovo_nome); //verifica se il file è stato caricato sul server}
    header("Location:VisualizzaFoto.php"); // sposto l'immagine nella cartella e vado alla pagina di visualizzazione
    } else {
    header("Location:Errore.php"); // vado alla pagina di errore
    }
    $s='bis';
    $ultimo_id=mysql_insert_id(); //valore di foto_id dopo l'inserimento
    $file_temp=($_FILES['userfile1']['tmp_name']); //file temporaneo che contiene l'immagine caricata
    $percorso="../public/img_foto/"; //cartella sul server dove verrà spostata la foto
    $nuovo_nome=$percorso.$s.$ultimo_id.".jpg"; //nuovo nome dell'immagine
    echo "$nuovo_nome <br>";
    if (is_uploaded_file($file_temp)){
    move_uploaded_file($file_temp,$nuovo_nome); //verifica se il file è stato caricato sul server}
    [/PHP]

    Fin qui ci sono, ma se riuscissi a fare lo stesso lavoro con il ciclo di for, potrei decidere a priori anche in numero di foto da inserire, e penso che la cosa possa servire anche ad altri


  • User Attivo

    Nello script che hai postato, quello con il FOR, il nome di destinazione non cambia mai, mentre nella routin ripetuta si.

    FOTO 1:
    $nuovo_nome=$percorso.$ultimo_id.".jpg";

    FOTO 2:
    $s='bis';
    $nuovo_nome=$percorso.$s.$ultimo_id.".jpg";

    Se ci fai caso $nuovo_percorso di FOTO1 è diverso da $nuovo_percorso di FOTO2 perchè inserisci "bis".

    Prova a mettere nel ciclo FOR questa stringa e fare un test
    $nuovo_nome=$percorso.$numFoto.ultimo_id.".jpg";


  • User

    Test effettuato, sempre lo stesso errore,
    ../public/img_foto/13.jpg si è verificato un errore durante l'upload: ../public/img_foto/23.jpg si è verificato un errore durante l'upload: ../public/img_foto/33.jpg si è verificato un errore durante l'upload:

    Come vedi il nome lo sistema, ma non effettua l'upload delle immagini.

    E' come se avesse il nome ma non l'immagine da uplodare cioè voglio dire mi dà l'impressione che dal form alla pagina di questo script l'indicazione dell'immagina da uplodare si perdesse, mtre il nome se lo costruisce nel ciclo di for non so se ho reso l'idea di quello che penso.


  • User Attivo

    Provare a togliere il punto in questi due pezzi di codice

    <input name='userfile*.*$numFoto' ...

    $file_temp=($_FILES['userfile*.*$numFoto']['tmp_name']);

    Cambiando in

    <input name='userfile$numFoto' ...

    $file_temp=($_FILES['userfile$numFoto']['tmp_name']);


  • User

    Niente da fare, sempre lo stesso errore.