• User

    Da quel che ho visto non solo puoi evitare di ripetere la stessa query, ma puoi addirittura farne una sola per eseguire tutte le operazioni di cui hai bisogno.

    Eegui una query con join dove peschi tutte le informazioni riguardo i prodotti e la traduzione della lingua in proposito (ti consiglio una variabile di sessione piuttosto che inviare per get il dato della lingua).

    Mentre viene effettuato il ciclo, accumuli tutte le informazioni che ti occorrono in un array, successivamente scorrerai questo array per riprodurre l'elenco 🙂

    es (nell'esempio ho supposto che richiami anche l'id):
    [php]$articolo = array();

    $query_prodotti = "SELECT tabella_articoli.id, tabella_articoli.foto, tabella_articoli.descrizione, tabella_articoli.dettagli, tabella_lingua_$lingua.descrizione AS desc_lingua
    FROM tabella_articoli, tabella_lingua_$lingua
    WHERE tabella_articoli.id_articolo = tabella_lingua_$lingua.id_articolo
    AND tabella_articoli.id_articolo = '$id'";
    $risultato_prodotti = mysql_query($query_prodotti,$con) or die ("impossibile eseguire la query");

    while ($row = mysql_fetch_array($risultato_prodotti))
    {
    $id = $row['id'];

    $articolo[$id]['foto'] = $row['foto'];
    $articolo[$id]['descrizione'] = $row['descrizione'];
    $articolo[$id]['dettagli'] = $row['dettagli'];
    $articolo[$id]['dettagli_lingua'] = $row["desc_lingua"];
    

    }[/php]
    A questo punto hai l'array $articolo che sarà strutturato, all'incirca, così:

    Array(
      id => Array(
                       foto => dato
                       descrizione => dato
                       dettagli => dato
                       dettagli_lingua => dato
                       )
    
      id => Array(
                       foto => dato
                       descrizione => dato
                       dettagli => dato
                       dettagli_lingua => dato
                       )
    
    etc..
    )
    ```Per cui potrai navigarlo in tutta semplicità con un foreach:
    [php]foreach ($articoli as $id => $info){
    
        echo "<li><a href=\"prodotti.php?id=$id\">".$info['descrizione']."</a></li>";     
    
    }[/php](come ho recuperato descrizione puoi recuperare i contenuti delle altre chiavi registrate nel while allo stesso modo).
    
    Fammi sapere come ti va :ciauz:
    
    ps: per le query, cerca sempre di specificare i nomi dei campi che ti occorre recuperare, nel caso di una join tra tabelle con campi simili devi includere "nometabella." davanti al nome che vuoi richiamare.
    
    p-ps: Per quanto riguarda il recupero di array associativi, evita di scriverli come avevi fatto ma includi gli apici per specificare la chiave tra parentesi, in quanto a livello prestazionale c'è un abisso tra l'inclusione o meno di questi apici.

  • User Attivo

    Non entro nel merito della discussione (mi pare che la soluzione di Blancks vada più che bene, al massimo suggerirei un NATURAL JOIN visto che le due tabelle hanno il campo che le "unisce" con lo stesso nome) ma vorrei invitarvi a stare **attenti attenti attenti **all' SQL injection - nel vostro codice inserite direttamente in una query SQL del testo che proviene dall'input utente e questo è pericoloso pericoloso pericoloso!!


  • User Attivo

    Ciao SEO Italy, ti ringrazio per la precisazione, ma quale altra soluzione per evitare SQL Injection ?
    Alla fine è un catalogo, come posso selezionare i prodotti dalle tabelle se passando le variabili in GET ?
    Grazie!

    Posso anche chiedere perchè per la lingua sarebbe preferibile utilizzare una variabile di sessione?


  • User Attivo

    Visto che ormai ho perso la speranza di far utilizzare una libreria per accedere al DB (la libreria da utilizzare è MDB2), la soluzione è usare mysql_real_escape_string così (ad esempio):
    [PHP]$query = "SELECT * FROM tabella_articoli WHERE id_articolo='" . mysql_real_escape_string($id) . "'";[/PHP]
    HTH, ciao! 🙂


  • User Attivo

    Ti ringrazio!
    Quindi come ho visto nel manuale PHP sarebbe sicuro e giusto e più semplice usare una piccola funzione per i GET e i POST ?
    [PHP]
    <?php
    function safe($value){
    return mysql_real_escape_string($value);
    }
    ?>

    Then, when I am using my code, I simply use:

    <?php
    $name = safe($_POST["name"]);
    $password = safe($_POST["password"]);
    ?>[/PHP]


  • User Attivo

    Mah, come vedi la funzione non fa altro che richiamare mysql_real_escape_string quindi ti basta usare quella, cioè
    [PHP]<?php
    $name = mysql_real_escape_string($_POST["name"]);
    $password = mysql_real_escape_string($_POST["password"]);
    ?>[/PHP]


  • User Attivo

    A questo punto avrei un'altra domanda.
    Nella creazione del mio sottomenu dovrei fare una ulteriore query per dividere i prodotti
    [PHP]//****************************************
    // qui dovrei rifare la query
    //****************************************
    <ul>
    <li><a href="prodotti.php?id=1">prodotto 1</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    </ul>
    </dd>
    <dt><a href="/discuss/">Modulo 2700</a></dt>
    <dd>
    <ul>
    //****************************************
    // qui dovrei rifare la query
    //****************************************
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    </ul>
    </dd>
    <dt><a href="/dev/">Modulo 2500</a></dt>
    <dd>
    <ul>
    //****************************************
    // qui dovrei rifare la query
    //****************************************
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    <li><a href="prodotti.php?id=2">prodotto 2</a></li>
    </ul>
    </dd>
    </dl></div>[/PHP]
    la query potrebbe essere un'altra select perchè vorrei che modulo 2500
    avesse tutti i dati contrassegnati da categoria 2500 quindi dovrei fare
    [PHP]"SELECT * FROM tabella_articoli WHERE categoria='2500'";[/PHP]
    poi dovrei farne un'altra che mi visualizzasse
    [PHP]"SELECT * FROM tabella_articoli WHERE categoria='3000'";[/PHP]

    Così facendo dovrei fare più volte la stessa query cambiando un solo paramentro ?


  • User Attivo

    Direi che sarebbe piuttosto inefficiente... La soluzione che ti suggerisco è fare una query e mettere il tutto in un array bidimensionale dove per ogni categoria c'è un array di prodotti (non ti preoccupare, è più facile farlo che dirlo...)

    In sostanza fai così:
    [php]while ($row = mysql_fetch_array($risultato_prodotti)) {
    $prodotti[$row['categoria']][$row['id']] = $row;
    }[/php]quando poi vai a mostrare l'array (cioè a fare i sottomenu) fai così:
    [php]foreach ($prodotti as $categoria => $array_categoria) {
    echo '<dd>';
    echo '<ul>';
    foreach ($array_categoria as $id => $prodotto) {
    echo '<li><a href="prodotti.php?id=' . htmlspecialchars($id) . '">' . htmlspecialchars($prodotto['descrizione']) . '</a></li>';
    }
    echo '</ul>';
    echo '</dd>';
    echo '<dt><a href="/discuss/">Modulo ' . htmlspecialchars($categoria) . '</a></dt>';
    }[/php]Due cose a cui prestare attenzione:

    • come vedi ho usato la funzione htmlspecialchars, leggiti la pagina di manuale corrispondente poichè è fondamentale usarla quando si devono mostrare in una pagina HTML dei dati su cui non si ha il controllo
    • ovviamente la URL della categoria ("/discuss/" o quello che deve essere) la devi variare tu (come ho fatto io è sempre uguale) ad esempio utilizzando un array associativo - però non so cosa vuoi ottenere lì quindi non entro nei dettagli

    HTH, ciao!!


  • User Attivo

    Quindi da quello che ho capito, un ciclo foreach mi analizza le categorie mentre un altro sotto ciclo foreach mi analizza cio' che è all'interno delle categorie giusto ?


  • User Attivo

    Esatto - ovviamente l'importante è creare prima un array bidimensionale, cioè che abbia la forma:

    array (
    categoria1 => array(prodotto1, prodotto2, ...)
    categoria2 => array(prodotto6, prodotto7, ...)
    ...
    )


  • User Attivo

    Ok quindi se ho ben capito (speriamo!) estraggo tutti i dati dalla tabella con un [php]SELECT * FROM tabella_articoli[/php] poi mi creo il mio array bidimensionale con
    [php]while ($row = mysql_fetch_array($risultato_prodotti)) {
    $prodotti[$row['categoria']][$row['id']] = $row;
    } [/php]e li estraggo con il ciclo foreach che mi avete suggerito ?

    Ps.
    Queste ottimizzazioni del codice, suggerimenti e scorciatoie, posso trovarlo in qualche manuale? Mi consigliate qualche lettura ?


  • User Attivo

    A mio modo di vedere la fonte migliore (e meno costosa... :2: per imparare il PHP è il manuale online: http://php.net