【问题标题】:Updating multiple MySQL table columns using arrays with PDO使用带有 PDO 的数组更新多个 MySQL 表列
【发布时间】:2012-08-16 03:44:00
【问题描述】:

我正在尝试将所有 MySQL 连接从旧的 mysql_query 切换到 PDO。我正在尝试使用不同的数组更新 MySQL 表的多行和多列,但收到以下错误:

[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 '(accnt, car, radio, misc) values ('admin', '300.00', '400.00', '10.00') WHERE ID' at line 附近使用1

来自以下代码:

$account = $_POST['account'];
$car_lease = $_POST['car_lease'];
$radio_lease = $_POST['radio_lease'];
$misc_lease = $_POST['misc_lease'];
$lease_ID = $_POST['lease_ID'];

//$data = array_map(null,$account,$car_lease,$radio_lease,$misc_lease);
$A = count($lease_ID);

try {
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $STH = $DBH->prepare('UPDATE lease (accnt, car, radio, misc) values (:account, :car_lease, :radio_lease, :misc_lease) WHERE ID = :lease_ID');
    $i = 0;
    while($i < $A) {
        $STH->bindParam(':account', $account[$i]);
        $STH->bindParam(':car_lease', $car_lease[$i]);
        $STH->bindParam(':radio_lease', $radio_lease[$i]);
        $STH->bindParam(':misc_lease', $misc_lease[$i]);
        $STH->bindParam(':lease_ID', $lease_ID[$i]);
        $STH->execute();
        $i++;
    }
}
catch(PDOException $e) {  
    echo "I'm sorry, but there was an error updating the database.";  
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}

我相信这个问题是由我调用语句句柄的方式引起的,但我不确定我的语法的哪一部分不正确。另外,这是处理这种情况的最佳方法吗?或者有没有更好的方法来更新表中的多行?

【问题讨论】:

    标签: php mysql pdo sql-update


    【解决方案1】:

    您混淆了INSERTUPDATE 语句之间的语法。您需要一个 SET 子句,而不是 VALUES() 列表:

    $STH = $DBH->prepare('
        UPDATE lease 
        SET 
          accnt = :account, 
          car = :car_lease, 
          radio = :radio_lease, 
          misc = :misc_lease 
        WHERE ID = :lease_ID
    ');
    

    查看MySQL UPDATE syntax reference 以了解与UPDATE 语句一起使用的完整规范。

    【讨论】:

    • 完美,我明白了我的错误。谢谢你。这种方法是更新多行的最佳方法还是有另一种更有效的方法?
    • @user1562781 如果这些值看起来都是数组,那么您确实需要在循环中更新它们。由于准备好的语句只在循环之前编译一次,因此您已经从中获得了性能优势。
    【解决方案2】:

    如果您可以信任您的键和值,我认为这将是最简单和最简单的解决方案:

    $update = 'SET ';
    $fields = array_keys($_POST);
    $values = array_values($_POST);
    foreach ($fields as $field) {
        $update .= $field . '=?,';
    }
    $update = substr($update, 0, -1);
    $db->query("update sub_projects ${update} where id=${_GET['id']}");
    $db->execute($values);
    

    【讨论】:

      【解决方案3】:

      更新多个字段的简单方法。但非常重要的是,编辑页面上的输入必须与数据库表的顺序相同。

      希望有帮助

      if (isset($_POST['pageSubmit'])) {
      echo '<pre>';
      print_r($_POST['page']);
      echo '</pre>';
      
      
       $fields = array('id','name','title','content','metaKey','metaDescr','metaTitle');//fields array
      
      $fields = array_map(function($field){
      return "`$field`";
      },$fields);
      
      $queryArray = array_combine($fields,$_POST['page']);//createng array for query
      
      $countFields = count($queryArray);//getting count fields
      
      $id = array_splice($queryArray , 0,-($countFields-1));//getting id of page
      
      $insertArray = $queryArray;//getting new fields array without first key and value
      
      function updatePage($db, array $fields, array $id){
      
          $where = array_shift($id);  
          $sql = array();
      foreach ($fields as $key => $value) {
      
         $sql[] = "\n".$key."" ." = "."'".$value."'";
      }
      $sql = implode(",",$sql);
      
         try {
      
             $query = $db->prepare("UPDATE `pages` SET $sql WHERE `id` = $where ");           
      
             $query->execute();
      
         } catch (Exception $e) {
      
          echo $e->getMessage();
      
         }
      
       }
      
         updatePage($db, $insertArray, $id);
      
      
      }
      

      【讨论】:

      • 你真的叫它“简单”吗?
      • 也许不适合初学者,但它比每个输入字段的 10 个变量要好。通过此示例,您可以对任何表格进行更新,而不管字段如何
      【解决方案4】:

      更好的方法是CASE,它比准备好的stmt快3-4倍

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 2020-01-26
        • 1970-01-01
        相关资源
        最近更新 更多