[英]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.