【问题标题】:PDO insert query not working PHPPDO插入查询不起作用PHP
【发布时间】:2018-11-28 10:32:10
【问题描述】:

我正在使用以下代码将一堆记录插入到 sqlite 数据库中:

try {
    $dir = 'sqlite:file_name';
    $dbh  = new PDO($dir) or die("cannot open the database");
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

    $query_str = 'DELETE FROM mytable; INSERT INTO mytable (field1, field2, field3, field4, field5, field6, field7, field8, field9) VALUES ';
    $query = $dbh->prepare( $query_str . $valuesPlaceholders);
    $sqlResponse = $query->execute($valuesArr);
}
catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        echo 'here';
    } else {
        throw $e;
}

这是 $valuesPlaceholders:

(?, ?, ?, ?, ?, ?, ?, ?, ?),(?, ?, ?, ?, ?, ?, ?, ?, ?),(?, ?, ?, ?, ?, ?, ?, ?, ?)

这是我的$valuesArr

Array
(
    [0] => Array
        (
            [0] => temperature
            [1] => M1
            [2] => 40110
            [3] => 100
            [4] => 500
            [5] => 200
            [6] => 300
            [7] => 1
            [8] => C
        )

    [1] => Array
        (
            [0] => humidity
            [1] => M1
            [2] => 40114
            [3] => 100
            [4] => 500 
            [5] => 200
            [6] => 300
            [7] => 1
            [8] => %
        )

    [2] => Array
        (
            [0] => param111
            [1] => M2
            [2] => 40115
            [3] => 100.5
            [4] => 500
            [5] => 200
            [6] => 300
            [7] => 0.1
            [8] => uni
        )

)

这给了我以下错误:

数组到字符串的转换

PDOStatement::execute(): SQLSTATE[HY000]: 一般错误:25 列索引超出范围

表结构由10列组成,其中1列id为自增列。

我做错了什么?

【问题讨论】:

  • 您不能使用 PDO 执行多个查询
  • @RiggsFolly 我检查了这个:stackoverflow.com/questions/1176352/…
  • 您正在尝试运行 两个 查询 1) DELETE 和 2) INSERT
  • 我什至使用一维数组绑定,即使这会导致索引超出范围错误
  • @u_mulder ,执行函数需要一个包含字符串或数字的一维数组是否正确,但他输入的数组中包含数组,因此它尝试将每个内部数组转换为字符串.因为这就是它想要的:带有数字或字符串的一维数组,而不是数组?

标签: php pdo sqlite


【解决方案1】:

****您的函数需要包含字符串或数字的一维数组, 因为您有多维数组,它会尝试将您的内部数组转换为字符串,以便您将错误数组转换为字符串****

   Convert the values to single array,

    $values_str =''; 
    $i = 0;
    foreach($valuesArr as $ar){
      if($i > 0)$values_str.=',';
      $values_str .= implode(',',$ar);
      $i++;
    }
    $values_str = explode(',', $values_str);
    //I dont know whether you would need this array_map or not
    array_map('strin_function', $values_str);
    function strin_function($val){
      return "'".$val."'";
    }
    $valuesArr = $values_str;
    var_dump($valuesArr);

【讨论】:

    【解决方案2】:

    您的comment 中有linked to another question,但您似乎错过了为什么接受的答案有效而您的代码无效。

    具体来说,答案显示了创建一个新的一维数组,该数组被传递给execute 方法:

    ...
    foreach($data as $d){
        $question_marks[] = '('  . placeholders('?', sizeof($d)) . ')';
        $insert_values = array_merge($insert_values, array_values($d));
    }
    ...
    

    你没有在你的代码中这样做,这就是它失败的原因。

    除非您明显需要使用上述多插入技术,否则我建议您坚持使用标准方法:

    $dbh->beginTransaction();
    $dbh->exec('DELETE FROM mytable');
    $query = $dbh->prepare(
        'INSERT INTO mytable (field1, field2, field3, field4, field5, field6, field7, field8, field9) VALUES (?,?,?,?,?,?,?,?,?)'
    );
    foreach ($valuesArr as $arr) {
        $query->execute($arr);
    }
    $dbh->commit();
    

    您还应该将 $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); 更改为 $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 或者您的 try/catch 块是无用的,因为 PDO 不会引发异常。

    【讨论】:

      【解决方案3】:

      试试这个语法, 它将 100% 工作。

      <?php
          $servername = "localhost";
          $username = "username";
          $password = "password";
          $dbname = "myDBPDO";
      
          try {
              $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
              // set the PDO error mode to exception
              $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              $sql = "INSERT INTO MyGuests (firstname, lastname, email)
              VALUES ('John', 'Doe', 'john@example.com')";
              // use exec() because no results are returned
              $conn->exec($sql);
              echo "New record created successfully";
              }
          catch(PDOException $e)
              {
              echo $sql . "<br>" . $e->getMessage();
              }
      
          $conn = null;
          ?>
      

      【讨论】:

      • 这个语法究竟对这个问题有什么帮助?
      • 所以你认为 OP 应该忘记做DELETE FROM mytable;
      猜你喜欢
      • 2014-01-12
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2013-08-06
      • 2013-09-03
      • 1970-01-01
      • 2012-05-05
      • 2013-10-04
      相关资源
      最近更新 更多