[英]php loop within mysqli loop
我有一個mysql表,其中包含2列,看起來像這樣...
-------------------------------------------
| sku | superseded_sku |
+---------------------+-------------------+
| part1 | part2 |
| part2 | part3 |
| part3 | part4 |
| part5 | part6 |
| part6 | part7 |
該表基本上顯示了公司出售的產品已被更新的產品所替代。 我的任務是重塑表格,使其類似於以下內容...
-------------------------------------------
| sku | superseded_sku |
+---------------------+-------------------+
| part1 | part4 |
| part2 | part4 |
| part3 | part4 |
| part5 | part7 |
| part6 | part7 |
這樣就消除了重新整理列表以查找當前替換項的需要。
我寫了下面的文章,它有一個基本的缺點:如果產品被替換的次數超出了我在代碼中允許的次數,那么看起來就不會那么遠了。 我已經嘗試了很多次,包括一個while循環,一個do {} while循環和一個foreach循環,但是到目前為止,我已經失敗了。
這是我的代碼
<?php
// Error reporting on
ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL);
// variables
// Page variable
$P = $_REQUEST["p"];
// variables for latest BritPart list
$dbhost = 'localhost';
$dbuser = 'userame';
$dbpass = 'password';
$dbselect = 'superseded';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbselect);
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
// Start throwing data about
$compare = "SELECT * FROM mar15 ORDER BY sku";
echo "<h3 style=\"text-align: center;\">Supersedes Tables</h3>
<div class=\"output\" style=\"width: 940px;\">
<table cellspacing=\"0\" class=\"db-table\" style=\"width: 940px; border-radius: 5px 5px 0 0\"><thead><tr>
<th width=\"398\">sku</th>
<th width=\"270\">superseded_sku</th>
<th width=\"270\">supersede_length</th>
</tr></thead>
<tbody>";
if ($result = mysqli_query($mysqli,"$compare")) {
while($row = mysqli_fetch_array($result)) {
$sku = $row['sku'];
$ss1 = $row['superseded_sku'];
$ssl = "1";
// ---------------------------------------------------------------
// I want to loop through this section until it doesn't find a match
// ---------------------------------------------------------------
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
// ---------------------------------------------------------------
// Instead I've done this as I don't know how to do what I want
// ---------------------------------------------------------------
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
$query1 = "SELECT superseded_sku FROM mar15 WHERE sku = \"$ss1\"";
if ($result1 = mysqli_query($mysqli,"$query1")) {
while($row1 = mysqli_fetch_array($result1)) {
$ss2 = $row1['superseded_sku'];
if($ss2 != $ss1) {
$ssl++;
$ss1 = $ss2;
}
}
}
// --------------------------------------------------------------------------------------
echo "<tr";
if($ssl > 1) {
echo " style=\"background: #ff0;\"";
}
echo ">
<td width=\"398\">$sku</td>
<td width=\"270\">$ss1</td>
<td width=\"270\">$ssl</td>
</tr>";
}
$result->close();
}
echo "</tr></tbody></table><a href=\"#\" class=\"export linkbutton\" style=\"margin: 10px 0 0 0; display: block; text-align: center;\">Export CSV</a></div>";
mysqli_close($mysqli);
?>
可以看到,我已經評論了我想讓循環出現的位置,但是我不知道如何進行工作,我的鄉下人方法可以工作,但是我對它們不滿意,希望提高自己的技能。 在有人問之前,這些不是我的真實用戶/通行證。
我沒有看到任何更新語句,所以我想這不是問題。
我也不知道循環是否是最有效的解決方案,但是如果要循環,則要循環直到superseded_sku
列中的元素也沒有出現在sku
列中。
使用嵌套的select語句很容易檢查,例如:
SELECT superseded_sku
FROM mar15
WHERE superseded_sku IN (
SELECT DISTINCT sku FROM mar15
)
此查詢將使您獲得superseded_sku
列中sku
列中有對應項的所有元素/需要替換。
因此,盡管此sql語句返回的行多於0,但您需要進行更多替換。
您可能會更進一步,並將其與UPDATE
語句結合使用,但這應該可以幫助您入門。
通常,我不會提倡在循環內進行數據庫查詢。 它效率低下,並可能導致數據庫服務器上的負載過大。
也就是說,除非您可以重構數據模型,否則我看不出其他選擇。 您所擁有的是單個表中的父/子關系(“ superseded_sku”引用同一表的子記錄)。 這對於您要嘗試執行的操作是不利的,因為如果子記錄中有自己的子記錄,您可能永遠不會事先知道。
假設重構不可行,您要運行查詢,檢查是否有匹配的記錄,更新查詢並重復直到沒有更多的記錄。
試試這樣的東西...
// get initial result set (don't forget to escape your variables)
$query = "SELECT superseded_sku FROM mar15 WHERE sku = '" .
mysqli_real_escape_string($mysqli, $ss1) . "'";
$result = mysqli_query($mysqli, $query);
// loop while we have results
while(mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_array($result);
// double check the row is valid
if (empty($row["superseded_sku"])) {
break;
}
$ss1 = $row["superseded_sku"];
// run the query again to check for further superseded skus
$query = "SELECT superseded_sku FROM mar15 WHERE sku = '" .
mysqli_real_escape_string($mysqli, $ss1) . "'";
$result = mysqli_query($mysqli, $query);
}
我會嚴重建議不要將此方法用作長期措施,因為它根本無法很好地擴展。 您幾乎肯定會遇到服務器資源問題或超時,尤其是在您的產品列表持續增長的情況下。 如果您打算將來使用某些數據,則需要考慮一下重構數據的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.