• User

    Mysql: Associare campi tabella

    Ragazzi, ne approfitto della vostra competenza per risolvere dei problemi, che purtroppo il "programmatore autodidatta" incontra più spesso del previsto.

    Dunque, prima di tutto è bene spiegarvi in cosa consiste il progetto che sto tentando di realizzare:

    si tratta di un CMS di un sito portfolio, con circa 5 o 6 pagine.
    Esempio:
    pag1 = graphic design
    pag2 = packaging
    pag3 = web design
    pag4 = illustration etc etc.

    In ogni pagina, i lavori saranno presentati in questo semplice modo:
    ci sarà un titolo, una descrizione, e una serie di foto.

    Tramite l'accesso a una pagina di amministrazione, l'utente dovrà poter essere in grado di inserire nuovi lavori, inserendo in un form il titolo, la descrizione, le foto e scegliendo da un menù a tendina la pagina nella quale dovrà esser postato.

    Se si fosse trattato solo di testo, sarei stato in grado di farlo, purtroppo le immagini complicano un pò il discorso.

    Veniamo al punto:
    nel mio database ho due tabelle,

    "post2"
    cui campi sono "id_post", "titolo" e "descrizione" (successivamente sarà inserito anche il campo "sezione")

    "post2_image"
    cui campi sono "id_image", "image"

    A questo punto, se carico i dati tramite il mio form, le immagini vengono caricate come array, con un loro ID e il titolo e la descrizione vengono caricati con un'altro ID.
    Suppongo che per richiamare i dati, l'array e il titolo e la descrizione debbano avere lo stesso ID.
    Come posso fare?
    Ho provato anche a inserire la query all'interno del ciclo foreach, le immagini venivano caricate singolarmente, ma ognuna aveva un id diverso; ho anche quindi pensato di inserire un altro campo nella tabella post2_image, chiamato id_post, nel quale inserire l'ID corrispondente al titolo e alla descrizione della tabella post2, ma non so come inserirlo.

    Ecco il codice:

    $titolo = $_POST["title"];
     $titolo = addslashes(stripslashes($titolo));
     $descrizione = $_POST["testdata"];
     $descrizione = addslashes(stripslashes($descrizione));
     
     $query = "INSERT INTO post2 SET
     titolo = '$titolo', 
     descrizione = '$descrizione'";
     
    mysql_query($query, $db);
    
    $target_path = "temp/";
    $uploads_dir = $target_path;
    
    foreach ($_FILES["Filedata"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
    $tmp_name = $_FILES["Filedata"]["tmp_name"][$key];
    $name = $_FILES["Filedata"]["name"][$key];
    
    $query2 = "INSERT INTO post2_image SET
    image = '$name'";
    
    mysql_query($query2, $db);
    
    
    $ext = substr(strrchr($name, '.'), 1);
    switch(strtolower($ext)) {
    case 'jpg':        
    case 'jpeg':
    case 'png':
    case 'gif':
    case 'png':
    case 'doc':
    case 'txt':
    move_uploaded_file($tmp_name,  "$uploads_dir/$name");
    break;
    default:
    exit();
    break;
    }
    }
    }
    
    echo 'RETURN DATA!';
    ?>
    

    Spero di essere stato chiaro.
    Vi ringrazio della disponibilità, Lorenzo


  • User Attivo

    ... ho anche quindi pensato di inserire un altro campo nella tabella post2_image, chiamato id_post, nel quale inserire l'ID corrispondente al titolo e alla descrizione della tabella post2, ma non so come inserirlo.


    Questa, secondo me, è la migliore soluzione. Aggiungere alla tabella post2 un altro campo, numerico, cui corrisponderà l'ID della tabella post1.

    Per recuperare l'ID del record interessato bisognerebbe inserire prima i dati nella tabella post1 per poi recuperare l'ID con mysql_insert_id() (che restituisce l'ultimo record inserito), inglobarlo in una variabile (es.: $ID = mysql_insert_id(); ) ed inserirlo nella tabella post2.

    Spero di essere stato chiaro.
    Fammi sapere.


  • User

    Ok, ti ringrazio della tua disponibilità, ho provato il tuo suggerimento.
    Funziona solo in parte, perchè nonostante il comando mysql_insert_id () sia inserito all'interno del ciclo "foreach", viene popolato solo il campo id_post dell'ultima immagine caricata.

    Questo è il codice:

    <?php
    include('connect.php');
    
    $titolo = $_POST["title"];
    $titolo = addslashes(stripslashes($titolo));
    $descrizione = $_POST["testdata"];
    $descrizione = addslashes(stripslashes($descrizione));
    
    $query = "INSERT INTO post2 SET
                  titolo = '$titolo', 
                  descrizione = '$descrizione'";
    			 
    mysql_query($query, $db);
    	       
    $target_path = "temp/";
    
    //$myFile = $target_path."post_data.txt";
    //$fh = fopen($myFile, 'w') or die("can't open file");
    //fwrite($fh, "Title: ".$_POST['title']."\n");
    //fwrite($fh, "Another Field: ".$_POST['testdata']."\n");
    //fclose($fh);
    
    $uploads_dir = $target_path;
    
    	foreach ($_FILES["Filedata"]["error"] as $key => $error) {						
    
    	    if ($error == UPLOAD_ERR_OK) {
    	        $tmp_name = $_FILES["Filedata"]["tmp_name"][$key];
    	        $name = $_FILES["Filedata"]["name"][$key];
    						
    			$sezione = mysql_insert_id(); 
    			$query2 = "INSERT INTO post2_image SET
    						id_post = '$sezione',
    						image = '$name'";
    			 
    			mysql_query($query2, $db);
    
    	        $ext = substr(strrchr($name, '.'), 1);
    	        switch(strtolower($ext)) {
    				case 'jpg':	
    				case 'jpeg':
    				case 'png':
    				case 'gif':
    				case 'png':
    				case 'doc':
    				case 'txt':
    					move_uploaded_file($tmp_name, "$uploads_dir/$name");
    				break;
    				default:
    				exit();
    				break;
    			}
    	    }
    	}
    
    echo 'RETURN DATA!';
    ?>
    

    Ti ringrazio della disponibilità.
    Lorenzo


  • User

    oi ci sono riuscito! il comando mysql_insert_id andava inserito fuori dal foreach!


  • User

    adesso il problema è diventato la select, ovvero nella pagina grafica io devo avere i miei post contententi ognuno il titolo, la descrizione, e le relative immagini.

    il fatto interessante, è che se io ho solo un post per sezione funziona, se ne ho di più no.
    credo che non sia un errore di select, ma di ciclo.

    questo è il codice:

     $query = "SELECT * FROM post2 WHERE sezione='grafica' ORDER BY data ASC";
      $risultato = mysql_query($query) or die("Query testo fallita");
    
    	  while ($tmp = mysql_fetch_array($risultato, MYSQL_ASSOC)) {
    
    	echo 
    "<div class=post>
    <p class=data>{$tmp['data']}</p>
    <h2>{$tmp['id_post']}</h2>
    
    <h1>{$tmp['titolo']}</h1>
    <p class=descrizione>{$tmp['descrizione']}</p>
    ";
    	}
    	
    	
    	 $query2 = "SELECT * FROM post2_image WHERE id_post=(SELECT id_post FROM post2 WHERE sezione='grafica')";
      $risultato2 = mysql_query($query2) or die("Query img fallita");
         
    	  while ($tmp2 = mysql_fetch_array($risultato2, MYSQL_ASSOC)) {
     echo "<img src=../temp/".$tmp2['image'] ."> <br>"; 
     	}
    	
    	echo "</div>";
    

    grazie della disponibilità.


  • User Attivo

    @lurex89 said:

    $query = "SELECT * FROM post2 WHERE sezione='grafica' ORDER BY data ASC";
     $risultato = mysql_query($query) or die("Query testo fallita");
    
    	  while ($tmp = mysql_fetch_array($risultato, MYSQL_ASSOC)) {
    
    	echo 
    "<div class=post>
    <p class=data>{$tmp['data']}</p>
    <h2>{$tmp['id_post']}</h2>
    
    <h1>{$tmp['titolo']}</h1>
    <p class=descrizione>{$tmp['descrizione']}</p>
    ";
    	}
    	
    	
    	 $query2 = "SELECT * FROM post2_image WHERE id_post=(SELECT id_post FROM post2 WHERE sezione='grafica')";
     $risultato2 = mysql_query($query2) or die("Query img fallita");
        
    	  while ($tmp2 = mysql_fetch_array($risultato2, MYSQL_ASSOC)) {
    echo "<img src=../temp/".$tmp2['image'] ."> <br>"; 
    	}
    	
    	echo "</div>";
    

    grazie della disponibilità.

    Infatti i due cicli WHILE sono separati. Dovresti fare un ciclo FOR prendere il valore ID per ogni sezione per poi confrontarlo nel secondo ciclo WHILE inglobato nel ciclo FOR.
    Rammento che l'ID è l'unico valore di confronto per la visualizzazione delle immagini.
    Spero sia stato ancora utile.


  • User Attivo

    Usa una sola query e un solo ciclo fore.

    query:

    
    SELECT p2.*, p2i.image FROM post2 p2 INNER JOIN post2_image p2i ON p2i.id_post = p2.id_post WHERE ...
    
    ```Con questa query (rimetti ovviamente la condizione where e l'eventuale sort) hai tutto quello che ti serve e puoi usare solo il ciclo fore esterno, aggiungendo naturalmente la parte per visualizzare l'immagine.
    
    :ciauz:

  • User

    vi ringrazio delle risposte, ma ho risolto così:

    <?php
    include('../connect.php');

    $query = "SELECT * FROM post2 WHERE sezione='grafica' ORDER BY data DESC";
    $risultato = mysql_query($query) or die("Query testo fallita");

      while ($tmp = mysql_fetch_array($risultato, MYSQL_ASSOC)) {
    
    echo 
    

    "<div class=post>
    <p class=data>{$tmp['data']}</p>
    <h2 class=titolo>{$tmp['titolo']}</h2>
    <p class=descrizione>{$tmp['descrizione']}</p>
    ";

    $id = $tmp['id_post'];
    $titolo = str_replace(" ", "%20", $tmp['titolo']);

    	 $query2 = "SELECT * FROM post2_image WHERE id_post=$id";
    

    $risultato2 = mysql_query($query2) or die("Query img fallita");

      while ($tmp2 = mysql_fetch_array($risultato2, MYSQL_ASSOC)) {
    

    echo "<img src=../img/grafica/".$titolo."/".$tmp2['image'] ."> <br>";
    }
    mysql_free_result($risultato2);

    echo "</div>";
    

    }

    mysql_free_result($risultato);
    mysql_close($db);
    

    ?>