【问题标题】:Update SQL database table from PHP array values using foreach()使用 foreach() 从 PHP 数组值更新 SQL 数据库表
【发布时间】:2018-10-04 22:48:57
【问题描述】:

我正在尝试使用 foreach() 从 PHP 数组更新 SQL 表。我注意到只有最后一个数组值被写入所有表字段。我在这里看了很多例子,但没有一个能解决我的问题。例如(Simple update sql table from PHP array 和其他一些人) 这是数组 $product_qttys: Array ( [qty0] => 1 [qty1] => 4 [qty2] => 2 [qty3] => 3 [qty4] => 6 )

这里是代码:

foreach ($product_qttys as $key => $pr_qtys){

    $qttys = mysqli_real_escape_string($con, $pr_qtys);
    // print_r ($qttys);
    $sql = "UPDATE table-a SET qty = '$qttys' WHERE ip_add = '$ip'";
    $result = mysqli_query($con,$sql);

}

    echo "<br/>check SQL table<br/>";           

    $sqla = "SELECT * FROM table-a WHERE ip_add='$ip'";
    $querya = mysqli_query($con,$sqla);
    if  (mysqli_num_rows($querya) > 0) {
        while ($producta = mysqli_fetch_assoc($querya)) {
             echo ("item_qty=" . ($item_qty = $producta ['qty']) . "<br/>");
        }
    }

这是我得到的输出:

check SQL table
item_qty=6
item_qty=6
item_qty=6
item_qty=6
item_qty=6

PhpMyAdmin 表也显示相同。 我错过了什么或做错了什么吗? 感谢您的反馈/输入并希望将其关闭。 谢谢。

【问题讨论】:

  • 所以它的工作方式与我通过查看提供的代码所期望的方式一样,即您正在执行 5 次 UPDATE 查询,每一次都使用 $ip 更新所有行,数量,所以当然,在最后一个循环中,所有这些行都变得相同。剩下的问题是您期望发生的事情不是。
  • 因此,您有 5 行具有相同的 $ip... 如果您想单独更新它们,您需要使用另一个字段来识别每一行,并将该条件添加到您的更新中。让我们用猫做一个例子(因为每个人都喜欢猫),你去宠物店要他们所有的猫(他们给你 5 只),然后你说“给他们取名吉姆”、“给他们取名弗兰克”、“取名他们 Jules”、“给他们取名 Cat”、“给他们取名 Purr”……最后,他们都被命名为“Purr”。
  • 为了更加简化,我删除了条件WHERE ip_add = "$ip",因此更新语句变为$sql = "UPDATE table-a SET qty = '$qttys'"; 。将此更新语句移出 foreach() 以运行更新一次,如下所示:foreach ($product_qttys as $key =&gt; $pr_qtys){ $qttys = mysqli_real_escape_string($con, $pr_qtys); } $sql = "UPDATE table-a SET qty = '$qttys'"; $result = mysqli_query($con,$sql);。我得到了相同的结果:数组的最后一个值被写入所有表字段。任何解决方案@OctavioGalindo ?你怎么看?
  • @JonStirling 你怎么看?请问可以提供一个有效的语法吗?
  • 有什么答案吗?卡在这里

标签: php mysql arrays foreach


【解决方案1】:

您在 values 数组中执行 foreach 并传递相同的 ip,所以 where 永远在说要更改相同的元素。

它将我看到的其余代码放在错误的地方,我会帮助纠正它。

但你必须这样做。

$product_qttys = Array ( ["127.0.0.1"] => 1 ["127.0.0.1"] => 4 ["127.0.0.1"] => 2 ["127.0.0.1"] => 3 ["127.0.0.1"] => 6);

foreach ($product_qttys as $key => $pr_qtys){
  $qttys = mysqli_real_escape_string($con, $pr_qtys);

  $sql = "UPDATE table-a SET qty = '$qttys' WHERE ip_add = '$key'";
  $result = mysqli_query($con,$sql);
}


echo "<br/>check SQL table<br/>";           
$sqla = "SELECT * FROM table-a WHERE ip_add='$key'";
$querya = mysqli_query($con,$sqla);
if  (mysqli_num_rows($querya) > 0){
while ($producta = mysqli_fetch_assoc($querya)){
echo ("item_qty=" . ($item_qty = $producta  ['qty']) . "<br/>");
    }
}

也可以改进逻辑

【讨论】:

  • 你好 Marcus,我已经删除了 "WHERE ip_add = '$ip'" 所以更新语句变成了: $sql = "UPDATE cart SET qty = '$qttys'";仍然有相同的答案,没有任何改变!你怎么看?
  • 是你有几个元素,当它需要时,它总是给出更新。
  • 你需要有where,但要引用正确的元素
  • (示例:更新购物车 SET qty = 1 Where ip = '127.0.0.1') 然后他在 ip 为 127.0.0.1 时将金额改为 1
  • 我认为删除where ip_add="$ip" 可能会使其工作。但我认为问题出在代码中的其他地方,因为删除 where 会导致相同的结果。我试图从foreach() 循环中删除更新语句$sql = "UPDATE cart SET qty = '$qttys'" 以进行一次更新,但问题仍然存在。你觉得@Marcus 怎么样?
【解决方案2】:

您将 'qty' 列 5 次设置为不同的数字,因此当第一个循环通过时,一旦将 'qty' 列设置为 1,然后随着向前移动,它将把最后一个数字重写为新数字.您不能在同一列和同一行中保存不同的数字,因此如果 $ip = 127.0.0.1 则您将重写 ip 行中具有 127.0.0.1 的所有行。也许像$sql = "UPDATE table-a SET $key = '$qttys' WHERE ip_add = '$ip'"; 这样的东西可以解决问题,但这没有经过测试,所以可能不起作用。如果语句正确,那么您需要将所有数组键作为不同的列。

【讨论】:

  • 为了更加简化,我删除了 WHERE ip_add = "$ip" 条件,因此更新语句变为 $sql = "UPDATE table-a SET qty = '$qttys'"; 。将此更新语句移出 foreach() 循环以运行更新一次,如下所示:foreach ($product_qttys as $key =&gt; $pr_qtys){ $qttys = mysqli_real_escape_string($con, $pr_qtys); } $sql = "UPDATE table-a SET qty = '$qttys'"; $result = mysqli_query($con,$sql);。我得到了相同的结果:数组的最后一个值被写入所有表字段。 @M4ST3RX 你能提供一个可行的解决方案吗?谢谢
  • IP地址没有问题,但即使你取出IP地址,你仍然必须有不同的列,否则它只会重写数据。你希望我如何在数据库中?有 1 行或多行,甚至是字符串或数组?
  • 我发现的做法是将数组转换为字符串,以便能够在 SQL 语句中使用它。所以 $qttys 是从 $product_qttys 单行数组中“转义”的字符串。 $qttys 需要填入table-a 的“qty”栏。我对吗?我正在寻求使用我卡住的 $product_qttys 数组更新“数量”值:(
猜你喜欢
  • 2013-12-06
  • 2019-05-22
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多