PHP PDO - doesnt insert all statements in the loop -
lets imagine situation should insert lot of rows in loop using pdo.
$sql = "insert products (name, price) values (:name, :price)"; $stmt = $db->prepare($sql); ($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(); } }
in way 100 rows not inserted database. , echo @ 23th line output like:
1 2 3 4 5 ... 59 60 61 61 61 61 61 61
and print_r @ 20th line output
array ( [0] => 00000 [1] => [2] => )
pdo error code 00000 means works fine. , no rows affected. , if try manually insert row on $result false - ok.
and 61 rows inserted table. , each time script running number changing , really strange.
why?
in other way - make 1 query insert queries , there 100 rows inserted. here link pastebin code.
here table structure:
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. use percona mysql server (5.5) handlersocker plugin. , tried insert rows using handlersocket. here code
$hs = new \hsphp\writesocket(); $hs->connect(); $id = $hs->getindexid('test','products','','name,price'); $loops_number = 10000; ($i = 0; $i < $loops_number; $i++) { $name = 'handler-'.md5(rand(0, 1000)); $price = rand(0, 1000); $hs->insert($id, array($name, $price)); }
and after - have ~ 14000 rows in db. why? if change number of loops (variable $loops_number) -
if 10 loops - 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 , number change. (if truncate table , run script again)
seems problem mysql server?
whoa!!! lot of info @ bro. not sure whether have got question right if have below piece of code achieve same effect better:
$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 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(); }
give try , tell me got.
Comments
Post a Comment