【问题标题】:PDO MySQL php foreach loopPDO MySQL php foreach 循环
【发布时间】:2015-10-29 13:49:51
【问题描述】:

我使用 foreach 循环更新单个 mysql 记录,该循环获取 $_POST 变量的名称和值并更新当时的记录列,$_POST 变量的名称与 mysql 列名相同

这里是代码

foreach ($_POST as $key => $value)  {  
    $value = mysqli_real_escape_string($con, $value );  
    $value = strip_tags($value);  
    $sql="UPDATE properties SET $key = '$value' WHERE propertyID='$propertyID'";
    $query = mysqli_query($con, $sql);
    if (mysqli_errno($con)){$error=1;}
}//end foreach loop
unset($value);
unset($key);

这很好用

但是我正在尝试将循环转换为使用 PDO。我曾尝试查看有关此主题的先前帖子,但仍然无法使其正常工作

这是我尝试过的代码:

foreach ($_POST as $key => $value) {  
    $value = mysqli_real_escape_string($con, $value );  
    $value = strip_tags($value);  
    $sql="UPDATE vendors SET $key = '$value' WHERE vendorID='$vendorID'";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue($key, $value); //have also tried bindParam!!
    $stmt->execute();
}//end foreach loop
unset($value);
unset($key);

这会运行但不会更新任何列,有人可以帮忙吗?

感谢

鲍勃

【问题讨论】:

  • 是否显示任何错误?是否启用错误报告?
  • 这是真的吗,您一次为多列更新同一个表一列。 You cannot be serious 当你重新审视这个烂摊子时,尝试同时重构你的基本概念
  • 嘿鲍勃。 边吃边跑有点不礼貌 有大神帮忙解答一下吗?如果他们接近了,请询问更多信息。如果答案回答了您的问题,则接受该答案。它阻止人们继续提供答案,并让其他人在搜索类似问题时知道是什么解决了您的问题。

标签: php mysql pdo foreach


【解决方案1】:

你没有正确绑定值,这样做:

$sql="UPDATE vendors SET $key = :value WHERE vendorID='$vendorID'";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':value', $value); //have also tried bindParam!!

【讨论】:

    【解决方案2】:

    我会这样做的:

    foreach ($_POST as $key => $value) {  
        $query = 'UPDATE vendors SET ' . $key .' = :key WHERE vendorID=:vendorID';
        $statement = $pdo->prepare($query);
        $statement->execute(['key' => $key, 'vendorID' => $vendorID]);
    }
    

    但这并没有优化,您正在逐列更新..

    查看此线程,它解释了如何从数组中分解 $key 和 $value,使用它并将其放入您的 SET 语句中。

    How to implode array with key and value without foreach in PHP

    【讨论】:

      【解决方案3】:

      这是一个更好的主意,您处理 $_POST 有点危险 并构建一个查询来更新一个查询中提供的所有列。它可以将您的数据库服务器上的负载减少 1000 倍。

      $columns = '';
      foreach ( $_POST as $field_name=> $value ) {
          $columns .= "$field_name = ?,";
      }
      $columns = rtrim($columns, ',');  // loose the trailing comma
      
      $sql="UPDATE vendors SET $columns WHERE vendorID=?";
      
      $stmt = $stmt = $pdo->prepare($sql);
      if ( ! $stmt ) {
          print_r( $pdo->errorInfo() );
          exit;
      }
      
      // add the parameter using the bindValue
      $col = 1;
      foreach ( $_POST as $idx => $value ) {
          $stmt->bindValue($col, $value);
          $col++;
      }
      $stmt->bindValue($col, $vendorID); // finally bind the vendorID
      
      $res = $stmt->execute();
      if ( ! $res ) {
          print_r( $stmt->errorInfo() );
          exit;
      }
      

      我很想知道这是否真的有效,因为我还没有测试过。如果是这样,您可能会听到您的数据库服务器松了一口气。

      【讨论】:

        【解决方案4】:

        问题是您正在绑定值,但您没有发送任何参数查询,只需删除该行:

        $stmt->bindValue($key, $value);
        

        然后代码将是:

        foreach ($_POST as $key => $value) {  
        $value = mysqli_real_escape_string($con, $value );  
        $value = strip_tags($value);  
        $sql="UPDATE vendors SET $key = '$value' WHERE vendorID='$vendorID'";
        $stmt = $pdo->prepare($sql);
        $stmt->execute(); 
        }  //end foreach loop
        unset($value);
        unset($key);
        

        另一种将参数放入查询中的选项更安全,但需要更多的工作和专业知识。

        【讨论】:

          猜你喜欢
          • 2016-09-02
          • 2015-03-14
          • 2013-03-05
          • 2016-10-25
          • 2014-05-26
          • 1970-01-01
          • 1970-01-01
          • 2012-10-11
          • 2016-12-28
          相关资源
          最近更新 更多