PHP PDO - 不会在循环中插入所有语句

时间:2013-07-31 18:11:51

标签: php loops pdo percona handlersocket

让我们想象一下我们应该使用PDO在循环中插入很多行的情况。

$sql = "INSERT INTO products (name, price) VALUES (:name, :price)";
$stmt = $db->prepare($sql);

for ($i = 0; $i < 100; $i++)
{
    $name = md5(rand(0, 1000));
    $price = rand(0, 1000);

    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':price', $price);

    try
    {
        $result = $stmt->execute();

        if (!$result)
        {

            print_r($db->errorInfo());
        }

        echo $db->lastInsertId();
    }
    catch (Exception $e)
    {
        echo $e->getMessage();
    }
}

这样,所有100行都不会插入到数据库中。而第23行的回声将输出如下内容:

  

1 2 3 4 5 ... 59 60 61 61 61 61 61 61

和第20行的print_r将输出

 Array (
     [0] => 00000
     [1] => 
     [2] =>  
 )

PDO错误代码00000表示一切正常。没有行受到影响。如果我尝试手动插入$ result为false的行 - 一切正常。

只会在表格中插入61行。每次脚本运行时,这个数字都在变化,这是非常奇怪

为什么?

换句话说 - 我们可以从所有插入查询中进行一次查询,并且将插入所有100行。这是一个带代码的link到pastebin。

这是一个表结构:

CREATE TABLE IF NOT EXISTS `products` (
`id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `price` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

btw。我使用带有HandlerSocker插件的percona MySQL服务器(5.5)。 我试图使用HandlerSocket插入行。这是一个代码

$hs = new \HSPHP\WriteSocket();
$hs->connect();

$id = $hs->getIndexId('test','products','','name,price');
$loops_number = 10000;

for ($i = 0; $i < $loops_number; $i++)
{
    $name = 'handler-'.md5(rand(0, 1000));
    $price = rand(0, 1000);

    $hs->insert($id, array($name, $price));
}

在此之后 - 我在DB中有大约14000行。为什么?如果我改变循环次数(变量 $ loops_number ) -

if 10 loops - I have 100 rows in DB table
if 50 loops - 50 rows
if 100 loops - 100 rows
if 500 loops - 500 rows
if 1000 loops - ~1100 rows and this number always change. (if I truncate table and run script again)

我的MySQL服务器似乎有问题吗?

2 个答案:

答案 0 :(得分:0)

哇!!!这是看看兄弟的很多信息。我不确定我的问题是否正确,但如果我有,那么下面的代码只能更好地达到同样的效果:

$name = md5(rand(0, 1000));
$price = rand(0, 1000);

try{

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    for($i=0, $i<100, $i++){

        $sql = "INSERT INTO products (name, price) VALUES (:name, :price)";
        $stmt = $db->prepare($sql);
        $stmt->execute(array(':name'=>$name[$i], ':price'=>$price[$i]));

        echo $db->lastInsertId();

    }

}catch(PDOException $e){


    print_r($db->errorInfo());

    echo 'An error occured'.$e->getMessage();

} 

试一试,告诉我你得到了什么。

答案 1 :(得分:0)

我通过重新安装PHP解决了这个问题。 (我使用了这个回购中的PHP:ppa:ondrej/php5

HandlerSocket插入的问题: 1.在循环内创建索引 2.如果你通过HandlerSocket进行插入查询更好地手动设置id(自动增量)