php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #74912 PDO errorInfo 1062 Duplicate entry
Submitted: 2017-07-12 16:02 UTC Modified: -
Votes:1
Avg. Score:4.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: marc dot w dot hagen at gmail dot com Assigned:
Status: Open Package: PDO related
PHP Version: 5.6.31 OS: Debian 3.2.86-1 x86_64
Private report: No CVE-ID:
Have you experienced this issue?
Rate the importance of this bug to you:

 [2017-07-12 16:02 UTC] marc dot w dot hagen at gmail dot com
Description:
------------
PDOStatement->errorInfo() will have driver errors even if there is a new query that has been executed.
If, for example, there is a duplicated query on the first statement it will return   false and populates the errorInfo.
But the next query that succeeds still has the errorInfo, only array key 1 and 2, from the previous query.
This should be cleared.

Test script:
---------------
<?php
$db = new PDO("mysql:host=".$dboptions['host'].";port=".$dboptions['port'].";dbname=".$dboptions['dbname'], $dboptions['username'], $dboptions['password']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$data = [ [ 'php', 'rulez' ], [ 'php', 'rulez' ], [ 'php', 'rule' ] ];
$stmt = $db->prepare('INSERT INTO testTable VALUES (?, ?)');
$stmt->bindParam(1, $lang, PDO::PARAM_STR);
$stmt->bindParam(2, $action, PDO::PARAM_STR);
foreach($data as $set) {
    $lang = $set[0];
    $action = $set[1];
    $stmt->execute();
    var_dump($stmt->errorInfo());
}
$db = null;

Expected result:
----------------
array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  NULL
  [2]=>
  NULL
}
array(3) {
  [0]=>
  string(5) "23000"
  [1]=>
  int(1062)
  [2]=>
  string(45) "Duplicate entry 'php-rulez' for key 'PRIMARY'"
}
array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  NULL
  [2]=>
  NULL
}

Actual result:
--------------
array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  NULL
  [2]=>
  NULL
}
array(3) {
  [0]=>
  string(5) "23000"
  [1]=>
  int(1062)
  [2]=>
  string(45) "Duplicate entry 'php-rulez' for key 'PRIMARY'"
}
array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  int(1062)
  [2]=>
  string(45) "Duplicate entry 'php-rulez' for key 'PRIMARY'"
}

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-07-12 16:11 UTC] martins dot teresko at gmail dot com
It's not a bug. You need to learn SQL.
 [2017-07-12 16:22 UTC] marc dot w dot hagen at gmail dot com
Re: martins dot teresko at gmail dot com
Well more information is needed than that. As i see it this has nothing to do with SQL... This was a MySQL database.
 [2017-07-12 16:30 UTC] martins dot teresko at gmail dot com
From the fine manual: 


"If you do not specify a list of column names for INSERT ... VALUES or INSERT ... SELECT, values for every column in the table must be provided by the VALUES list or the SELECT statement. If you do not know the order of the columns in the table, use DESCRIBE tbl_name to find out."

https://dev.mysql.com/doc/refman/5.7/en/insert.html
 [2017-07-12 16:33 UTC] martins dot teresko at gmail dot com
Ah, damn. Nevermind, I missed the error code :(
 [2017-07-12 16:36 UTC] marc dot w dot hagen at gmail dot com
ah, can happen!
 
PHP Copyright © 2001-2017 The PHP Group
All rights reserved.
Last updated: Tue Aug 29 15:01:52 2017 UTC