【问题标题】:PHP generate dynamic PDO insertPHP生成动态PDO插入
【发布时间】:2012-08-14 17:32:00
【问题描述】:

以下代码应将数组中的每个键值对插入到表中的数学列值中。脚本不返回错误,但插入的行仅包含数组中的最后一个值

例如

array('one'=>1,'two'=>2,'three'=>3);

在具有第一、二和三列的表中成功插入行,但总共插入值 3。

    $columns = array();
    $bind = '';
    foreach($array as $key => $value){

        $columns[] = $key;

    }

    $columnString = implode($columns,',');
    $valueString = implode($columns,',:');
    $valueString = ':' . $valueString;

    $core = core::getInstance();
    $STH = $core->dbh->prepare("INSERT INTO table (" . $columnString . ") VALUES 
    (" . $valueString . ")");

    foreach($array as $key => $value){

        $STH->bindParam(':' . $key,$value);
    }

【问题讨论】:

  • pdoStatement::bindParam对变量的引用 作为参数,pdoStatement::bindValue变量的值 作为参数。按照你的做法,你给了它对同一个变量 $value 的多个引用,当然这都会得到相同的值。

标签: php mysql pdo


【解决方案1】:

如果想使用位置占位符实现您的目标,@netcoder 的回复也很好。但是,您可以使用 sprintf 函数来准备使用命名占位符的动态 sql 查询。

$sql = sprintf("INSERT INTO table (%s) VALUES(%s)",
              implode(", ", array_keys($array)),
              ":" . implode(", :", array_keys($array)));

$pdo->prepare($sql);
$pdo->execute($array);

【讨论】:

    【解决方案2】:
    $conn = new PDO('mysql:host=' . $HOST . ';dbname=' . $DATABASE, $USERNAME, $PASSWORD);
    $conn->exec("set names utf8");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    
    $ins_query = 'INSERT INTO `' . $table_name . '` ';
    
    $columns = array();
    $columns_bindings = array();
    foreach ($dataArray as $column_name => $data) {
        $columns[] = $column_name;
        $columns_bindings[] = ':' . $column_name;
    }
    
    $ins_query = $ins_query . '(' . implode(', ', $columns) . ') VALUES (' . implode(', ', $columns_bindings) . ')';
    
    $stmt = $conn->prepare($ins_query);
    
    foreach ($dataArray as $column_name => $data) {
        $stmt->bindValue(":" . $column_name, $data);
    }
    if (!$stmt->execute()) {
        print_r($stmt->errorInfo());
    
    } else {
        echo "Insertd";
    }
    

    【讨论】:

      【解决方案3】:

      忘记bindParam,只需使用execute 并将$array 的值传递给它:

      $STH->execute($array);
      

      或者,您可以完全删除命名参数以稍微简化代码:

      $columnString = implode(',', array_keys($array));
      $valueString = implode(',', array_fill(0, count($array), '?'));
      
      $STH = $core->dbh->prepare("INSERT INTO table ({$columnString}) VALUES ({$valueString})");
      $STH->execute(array_values($array));
      

      【讨论】:

        【解决方案4】:

        可能是这样的:

        $columns = array('one'=>1,'two'=>2,'three'=>3);
        
        $columnString = implode(',', array_flip($columns));
        $valueString = ":".implode(',:', array_flip($columns));
        
        $core = core::getInstance();
        $STH = $core->dbh->prepare("INSERT INTO table (" . $columnString . ") VALUES (" . $valueString . ")");
        
        foreach($columns as $key => $value){
            $STH->bindValue(':' . $key, $value);
        }
        

        【讨论】:

          【解决方案5】:
          foreach($array as $key => $value){
              $STH->bindParam(':' . $key,$array[$key]);
          }
          

          试试看

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-10-23
            • 2018-03-30
            • 2015-02-28
            • 2012-08-30
            • 2014-05-06
            • 2012-02-12
            • 2013-09-03
            相关资源
            最近更新 更多