让我们想象一下我们应该使用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 6161
第20行的print_r将输出
Array (
[0] => 00000
[1] =>
[2] =>
)
PDO错误代码00000表示一切正常。没有任何行受到影响。如果我尝试手动插入$result为false的行,一切都可以
并且只有61行将被插入到表中。每次脚本运行时,这个数字都在变化,这真的很奇怪。
为什么?
换句话说,我们可以从所有插入查询中生成一个查询,并且将插入所有100行。这里有一个带有代码的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;
顺便说一句我使用带有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服务器似乎有问题?
哇!!!这是很多信息看兄弟。我不确定我是否答对了你的问题,但如果我答对了,那么下面的代码只会更好地达到同样的效果:
$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();
}
试试看,告诉我你有什么收获。
我通过重新安装PHP来解决这个问题。(我使用了这个回购中的PHP:ppa:ondrej/php5
)
HandlerSocket插入的问题:1.在循环中创建索引2.如果您让HandlerSocket的插入查询更好地手动设置id(自动增量)