Ich schreibe eine Bestandsaufnahme für unsere IT-Abteilung und ich bin nicht zuversichtlich, die Art, wie ich gehe, ist das Beste.SQL-Anweisung in verschachtelten While-Schleifen
Ich habe eine 'Produktgruppe' Tabelle und eine 'Produkt' Tabelle, die mit einer ID verbunden sind (eine Produktgruppe zu vielen Produkten) Produktgruppe zum Beispiel LaserJet Pro 400 und Produkte wären die einzelnen Verbrauchsmaterialien .. schwarz, magenta , cyan usw.
Also was passiert ist, habe ich eine while-Schleife für die Anzeige der Gruppen und dann eine geschachtelte While-Schleife für die Anzeige der Produkte innerhalb dieser Gruppe.
Worüber ich mir Sorgen gemacht habe ist, dass es viele Aussagen im Schnellfeuer gibt, es scheint kein Problem mit der Leistung in diesem frühen Stadium zu geben, aber ich bin unsicher .. ist das akzeptabel? Gibt es einen besseren Weg?
foreach ($_POST['BeginLocation'] as $key => $value) {$LocationID = $key;}
echo '<div class="nmform"><form name="StockTake" action="index.php" method="post" enctype="multipart/form-data">';
include "../DBCon/RDPNearMisses.php";
$GetProductGroups = sqlsrv_query($NMDB, "select distinct PD.ProductGroupID, PG.GroupName
from [JobObservations].[dbo].[ITStk.Products] as PD
inner join [JobObservations].[dbo].[ITStk.ProductGroups] as PG on PD.ProductGroupID = PG.ProductGroupID
where PD.LocationID = $LocationID");
if($GetProductGroups === false) {
if(($errors = sqlsrv_errors()) != null) {
foreach($errors as $error) {
echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
echo "code: ".$error[ 'code']."<br />";
echo "message: ".$error[ 'message']."<br />";
}
}
}
while ($row = sqlsrv_fetch_array($GetProductGroups)) {echo '<h4>'.$row['GroupName'].'</h4>';
$ProductGroupID = $row['ProductGroupID'];
$GetProducts = sqlsrv_query($NMDB, "select PD.ProductID, PD.ProductGroupID, PD.ProductCode, PD.ProductDescription
from [JobObservations].[dbo].[ITStk.Products] as PD
inner join [JobObservations].[dbo].[ITStk.ProductGroups] as PG on PD.ProductGroupID = PG.ProductGroupID
inner join [JobObservations].[dbo].[ITStk.Locations] as LC on PD.LocationID = LC.LocationID
where PD.LocationID = $LocationID
and PD.ProductGroupID = $ProductGroupID
order by LC.LocationDescription asc, PG.GroupName asc, PD.ProductCode asc");
if($GetProducts === false) {
if(($errors = sqlsrv_errors()) != null) {
foreach($errors as $error) {
echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
echo "code: ".$error[ 'code']."<br />";
echo "message: ".$error[ 'message']."<br />";
}
}
}
echo '<table><th>Code</th><th>Description</th><th>Qty</th>';
while ($row1= sqlsrv_fetch_array($GetProducts)) {echo '<tr><td>'.$row1['ProductCode'].'</td><td>'.$row1['ProductDescription'].'</td><td><select name="'.$row1['ProductID'].'"><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option></select></td></tr>';}
echo '</table>';
}
echo '<input type="Submit" name="SubmitStock"></form>';
sqlsrv_close($NMDB);
echo '</div>';
Es gibt viele Probleme mit dem Code hier. Zuerst müssen Sie über parametrisierte Abfragen lesen, verstehen und starten. Zweitens könnten Sie diese ganze geschachtelte Loop-Lösung wahrscheinlich in eine einzige Abfrage umwandeln. Wenn Sie wirklich Hilfe benötigen, lesen Sie diesen Artikel. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
Ich könnte es leicht zu einer einzigen Abfrage aus einer SQL-Sicht zu machen , das Problem ist, wie ich es mit php mit einem Gruppennamen Überschrift dann Subproducts präsentieren. –
Sean, danke für die Erwähnung parametrisierter Abfragen. Meine Umgebung ist ziemlich risikoarm für SQL-Injection, da ich nicht im Web bin, aber ich werde das übernehmen. Leider habe ich bei Google PHP unterrichtet, so dass ich immer noch auf vieles stoße, das für andere und Neuigkeiten für mich grundlegend ist. –