• 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