2014-09-08 2 views
2

Я получаю сообщение об ошибке «Неотключенное исключение Предупреждение: Пакеты вышли из строя. Ожидаемое 1 получено 166. Размер пакета = 52« при запуске двух запросов PDO один за другим.Pdo Mysql: Предупреждение: Пакеты не по порядку

$dbh = new \PDO('mysql:host=' . $dbHost . ';dbname=' . $dbName, $dbUser, $dbPass, array(
      \PDO::MYSQL_ATTR_LOCAL_INFILE => true 
     )); 

$sql = <<<eof 
      LOAD DATA LOCAL INFILE '$csv' 
      INTO TABLE $table 
      FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' 
      LINES TERMINATED BY '\n' 
      IGNORE 1 LINES 
      ($columns); 
      ALTER TABLE $table ADD COLUMN disabled INT DEFAULT 0 
eof; 
$dbh->query($sql); 
$sql = 'SELECT COUNT(id) FROM '.$table.' WHERE myfield IS NULL'; 
$dbh->query($sql); 

То, что я пытаюсь сделать: после импорта больших CSV-файла (около 30 МБ и 40k строк) в базу данных, я хочу, чтобы подсчитать, сколько строк пусты в поле, чтобы заполнить их в более поздний запрос.

Я заметил, что могу запустить первый запрос, если я прокомментирую второй, а затем я могу запустить второй запрос, если я прокомментирую первый. Если я пытаюсь запустить их один за другим, это терпит неудачу. Я попытался собрать пакет памяти до 20M с 8M, а также установить $ dbh-> setAttribute (\ PDO :: ATTR_EMULATE_PREPARES, true); без успеха. Аналогичный код работал с меньшим набором данных ранее. Любые указатели очень приветствуются!

+0

* * Я сомневаюсь, что это не имеет ничего общего с вашим сообщением об ошибке, но вам не нужно знать, «сколько строк пуст в поле», чтобы обновить их позже. –

+0

Возможно, вы правы. Хотя в этой конкретной ситуации полезно знать число для обновления цикла цикла. (обновление может быть несколько тысяч). – user789102014

+0

Вы, вероятно, должны обращаться с предложениями WHERE, а не с циклом. –

ответ

2

Хорошо, так что в самом деле в выводе eof выше я поставил несколько запросов. После загрузки данных inline я добавил несколько альтернативных табличных запросов. Кажется, pdo не может обрабатывать несколько запросов в одном блоке eof. , поэтому я попытался отделить каждый запрос по собственному запросу, а затем он сработал.

1

вы можете добавить это прежде, чем принести все: «Я хочу, чтобы подсчитать, сколько строк пусты в поле, чтобы заполнить их в более позднем запросе»

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 
Смежные вопросы