【问题标题】:Foreach loop still execute after the last array is updated更新最后一个数组后,foreach 循环仍然执行
【发布时间】:2013-07-03 01:02:11
【问题描述】:

我在完成任务而不是回显结果后收到错误“错误:查询为空”。我怀疑即使更新了最后一个数组,FOREACH 仍会尝试执行查询。我说的对吗?

如果是,我该如何纠正?

<?php
    $con = mysql_connect("localhost", "$username" , "$password");
    mysql_select_db($database, $con);
?>

<?php

  foreach ($_POST['id'] as $key=>$id)
  {
    $order = $_POST['order'][$key];
    mysql_query("UPDATE table SET `order`=$order WHERE `id` = $id");
  }
    if (!mysql_query($sql,$con))
     {
       die('Error: ' . mysql_error());
     }
       echo "<div class=\"result\">**1 record updated**</div>";         
?>

非常感谢

有关发布这些值的表单的更多信息:Create array from form and update mysql

【问题讨论】:

  • 您在什么时候填充了$sql?不在上面的代码中......这是导致错误的空查询。
  • 至少,您必须保护 $id 免受 sql 注入。如果它是预期的整数,请执行$id = intval($id)
  • print_r($_POST); 看起来像多了一个 id 然后 oder
  • !mysql_query($sql,$con) 但是你在哪里设置 $sql?
  • 我刚刚用初始化文件的内容更新了这个问题。是的,Dagon,我有几个 id 和表单中的订单。

标签: php mysql arrays foreach


【解决方案1】:

问题可能出在:

 if (!mysql_query($sql,$con))

它的运行 mysql_query 没有定义 $sql

虽然我不建议将查询放在循环中,因为这会浪费内存,但对于您的代码示例 - 尝试将 mysql_query() 放在这样的变量中:

$sql = mysql_query("UPDATE table SET `order`=$order WHERE `id` = $id");

【讨论】:

  • 谢谢!但是想知道为什么即使没有 $sql= 它仍然会更新表
【解决方案2】:

您没有正确检查错误,而是调用了 mysql_query 两次。这样做:

<?php
foreach ($_POST['id'] as $key=>$id)
{
  $order = $_POST['order'][$key];
  $result = mysql_query("UPDATE table SET `order`=$order WHERE `id` = $id");
  if ($result === false)
  {
    die('Error: ' . mysql_error());
  }
  echo "<div class=\"result\">**1 record updated**</div>";         
}
?>

义务通知:

  • 不要使用 mysql - 使用 mysqliPDO
  • 请确保正确转义 SQL 查询的输入。使用 mysql_real_escape_string()

【讨论】:

  • 谢谢,我已经使用了你的方法并添加了这个 => foreach ($_POST['id'] as $key=>$ids) { $id = mysql_real_escape_string(ids);.... . }
【解决方案3】:
  1. 您已从循环中排除查询执行。
  2. 没有在任何地方定义$sql,所以它被威胁为empty string

使用这个:

<?php
foreach ($_POST['id'] as $key => $id)
{
    $order = mysql_real_escape_string($_POST['order'][$key], $con);
    $id    = mysql_real_escape_string($id, $con);

    $sql   = "UPDATE table SET `order` = $order WHERE `id` = $id";

    if(!mysql_query($sql, $con))die(mysql_error());
}      
?>

注意: MySQLmysql_* 函数)扩展名是 deprecated。我建议改用MySQLimysqli_* 函数)或PDO

注意:您的代码易受SQL-Injection 攻击。您可以阅读此问题中的解决方案建议:How can I prevent SQL injection in PHP?

【讨论】:

    【解决方案4】:

    在其他情况下,您之前检查过您的连接吗? 如果可以的话试试这个

    <?php
      foreach ($_POST['id'] as $key=>$id)
      {
        $order = $_POST['order'][$key];
        $query = "UPDATE table SET `order`=$order WHERE `id` = $id";
        $result = mysql_query($query) or die("Query failed : " . mysql_error());
    
      }
        if (!$result)
         {
           die('Error: ' . mysql_error());
         }
           echo "<div class=\"result\">**1 record updated**</div>";         
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2013-01-30
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多