- Home
- Categorie
- Coding e Sistemistica
- Coding
- Estrazione dati con stessa query e ciclo while
-
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!!
-
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?
-
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!
-
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]
-
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]
-
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 ?
-
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!!
-
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 ?
-
Esatto - ovviamente l'importante è creare prima un array bidimensionale, cioè che abbia la forma:
array (
categoria1 => array(prodotto1, prodotto2, ...)
categoria2 => array(prodotto6, prodotto7, ...)
...
)
-
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 ?
-
A mio modo di vedere la fonte migliore (e meno costosa...
per imparare il PHP è il manuale online: http://php.net