php mysqli 循环中的循环
php loop within mysqli loop
我有一个 mysql table,它包含 2 列,看起来像这样...
-------------------------------------------
| sku | superseded_sku |
+---------------------+-------------------+
| part1 | part2 |
| part2 | part3 |
| part3 | part4 |
| part5 | part6 |
| part6 | part7 |
table 基本上显示了公司销售的产品在哪些地方被更新的产品所取代。我的任务是重塑 table 使其类似于以下内容...
-------------------------------------------
| 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);
?>
你可以看到我已经评论了我想要一个循环的位置,我不知道如何使一个工作但是,我的乡下人方法有效但我对它们不满意并希望改进我的技能。在任何人问之前,这些都不是我的真实 user/pass。
我没有看到任何更新语句,所以我想这不是问题所在。
我也不知道循环是否是最有效的解决方案,但是如果你要循环,你想循环直到 superseded_sku
列中没有元素也存在于sku
列。
使用嵌套的 select 语句很容易检查,例如:
SELECT superseded_sku
FROM mar15
WHERE superseded_sku IN (
SELECT DISTINCT sku FROM mar15
)
此查询将为您提供 superseded_sku
列中的所有元素,这些元素在 sku
列中具有对应项/需要替换。
因此,虽然此 sql 语句 returns 多于 0 行,但您需要进行更多替换。
您可以更进一步,将其与您的 UPDATE
语句结合起来,但这应该让您开始。
通常,我不提倡在循环中进行数据库查询;它效率低下,可能会导致数据库服务器负载过大。
也就是说,除非您可以重构您的数据模型,否则我看不到太多替代方案。您拥有的是单个 table 中的 parent/child 关系("superseded_sku" 引用同一 table 的子记录)。这对您尝试做的事情不利,因为您事先不知道子记录是否有自己的子记录。
假设重构不可行,您想运行查询,检查是否有匹配的记录,更新查询并重复直到没有更多记录。
尝试这样的事情...
// 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);
}
我强烈建议不要将此方法用作长期措施,因为它根本无法很好地扩展。您几乎肯定会遇到服务器资源问题或超时,尤其是当您的产品列表继续增长时。如果这是您计划在未来使用的东西,您将需要考虑重构数据。
我有一个 mysql table,它包含 2 列,看起来像这样...
-------------------------------------------
| sku | superseded_sku |
+---------------------+-------------------+
| part1 | part2 |
| part2 | part3 |
| part3 | part4 |
| part5 | part6 |
| part6 | part7 |
table 基本上显示了公司销售的产品在哪些地方被更新的产品所取代。我的任务是重塑 table 使其类似于以下内容...
-------------------------------------------
| 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);
?>
你可以看到我已经评论了我想要一个循环的位置,我不知道如何使一个工作但是,我的乡下人方法有效但我对它们不满意并希望改进我的技能。在任何人问之前,这些都不是我的真实 user/pass。
我没有看到任何更新语句,所以我想这不是问题所在。
我也不知道循环是否是最有效的解决方案,但是如果你要循环,你想循环直到 superseded_sku
列中没有元素也存在于sku
列。
使用嵌套的 select 语句很容易检查,例如:
SELECT superseded_sku
FROM mar15
WHERE superseded_sku IN (
SELECT DISTINCT sku FROM mar15
)
此查询将为您提供 superseded_sku
列中的所有元素,这些元素在 sku
列中具有对应项/需要替换。
因此,虽然此 sql 语句 returns 多于 0 行,但您需要进行更多替换。
您可以更进一步,将其与您的 UPDATE
语句结合起来,但这应该让您开始。
通常,我不提倡在循环中进行数据库查询;它效率低下,可能会导致数据库服务器负载过大。
也就是说,除非您可以重构您的数据模型,否则我看不到太多替代方案。您拥有的是单个 table 中的 parent/child 关系("superseded_sku" 引用同一 table 的子记录)。这对您尝试做的事情不利,因为您事先不知道子记录是否有自己的子记录。
假设重构不可行,您想运行查询,检查是否有匹配的记录,更新查询并重复直到没有更多记录。
尝试这样的事情...
// 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);
}
我强烈建议不要将此方法用作长期措施,因为它根本无法很好地扩展。您几乎肯定会遇到服务器资源问题或超时,尤其是当您的产品列表继续增长时。如果这是您计划在未来使用的东西,您将需要考虑重构数据。