PHP PDO - не вставляет все операторы в цикл

Давайте представим ситуацию, когда мы должны вставить много строк в цикл, используя 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

и print_r на 20-й строке будет выводить

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

Код ошибки PDO 00000 означает, что все работает нормально. И никакие ряды не пострадали. И если я попытаюсь вручную вставить строку, в которой $result был false - все в порядке.

и только 61 строка будет вставлена ​​в таблицу. И каждый раз, когда запускается скрипт, это число меняется, и это действительно странно.

Зачем?

Другим способом - мы могли бы сделать один запрос из всех запросов на вставку, и все 100 строк будут вставлены. Вот ссылка на вставку с кодом.

Вот структура таблицы:

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;

Кстати. Я использую Percona MySQL server (5.5) с плагином HandlerSocker. И я попытался вставить строки, используя 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));
}

А у меня после этого - у меня ~ 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 ответа

Решение

Я решаю эту проблему путем переустановки PHP. (Я использовал PHP из этого репозитория: ppa:ondrej/php5)

И проблема со вставкой HandlerSocket: 1. создать индекс внутри цикла 2. если вы сделаете запрос на вставку с помощью HandlerSocket, лучше установить id (автоинкремент) вручную

Вау!!! Это много информации, чтобы смотреть на братан. Не уверен, правильно ли я понял ваш вопрос, но если у меня есть, то приведенный ниже фрагмент кода достигнет того же эффекта только лучше:

$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();

} 

Попробуйте и скажите мне, что у вас есть.

Другие вопросы по тегам