2012-04-10 5 views
1

У меня есть этот код:Php PDO множественным подготовить заявления в сделке

$this->db->beginTransaction(); 
    $query = 'INSERT INTO `table1` VALUES (NULL,:a,:b,NULL,NOW())'; 
    $sth = $this->db->prepare($query); 
    foreach ($values as $k => $v) { 
     $sth->bindParam(':' . $k, $v, PDO::PARAM_INT); 
    } 

    $this->executeQueryRollbackOnException($sth, 'Message_1'); 
    $resetId = $this->db->lastInsertId(); 

    $query = 'UPDATE `table2` SET c=:c,d=:d WHERE reset_id IS NULL'; 
    $sth = $this->db->prepare($query); 
    foreach ($values2 as $k => $v) { 
     $sth->bindParam(':' . $k, $v, PDO::PARAM_INT); 
    } 


    $this->executeQueryRollbackOnException($sth, 'Message_2'); 

    Zend_Debug::dump($sth->rowCount(), 'Affected'); // This is 0 

    // Commit 
    $this->db->commit();  

...

private function executeQueryRollbackOnException($sth, $message) { 
    try { 
     $sth->execute(); 
    } catch (Exception $e) { 
     $this->logSQLError($e); 
     $this->db->rollBack(); 
     throw new Exception($message); 
    } 
    } 

Первый запрос выполняется, но второй нет. Ошибка mysql. Есть идеи ?

+0

Возможно, это выполнено, но оно не соответствует ни одной строке? – KingCrunch

+0

@KingCrunch Нет, я запускаю его вручную и сопоставляет строки-ассоциированные – dotoree

+0

Вы используете InnoDB? –

ответ

1

Я нашел решение.

foreach ($values as $k => $v) { 
    $sth->bindParam(':' . $k, $v, PDO::PARAM_INT); 
} 

Должно быть

foreach ($values as $k => $v) { 
    $sth->bindParam(':' . $k, $values[$k], PDO::PARAM_INT); 
} 

К сожалению, я не отвечал правильный код в первый раз, я исключил foreaches для упрощения кода

+0

В таком 'foreach'-construct' $ array [$ key] 'и' $ value' то же самое. Конечно, это решение? – KingCrunch

+0

@KingCrunch Я уверен. См. Это http://stackoverflow.com/questions/146897/error-with-bindparam-overwriting-in-php – dotoree

+0

Существует ли конкретная причина, по которой вы используете 'bindParam' над' bindValue'. В последнем случае '$ v' должен работать. Проблема в том, что вы храните ссылку с помощью 'bindParam'. – Muhwu

0

Тот факт, что $sth->rowCount() 0 не означает, запрос не был запущен. Если в вашем журнале ошибок PHP нет ошибок, запрос просто прекрасен. Если количество строк равно 0, это означает, что никакие строки не обновлялись. Это очень вероятно из-за того, что ваше состояние не соответствует строкам.

Запустить следующее; если вы получаете 0, то вы знаете, что проблема заключается в вашем состоянии UPDATE:

SELECT COUNT(*) FROM `table2` WHERE reset_id IS NULL 
+0

Thanx, но проблема была в foreach, см. Мой ответ – dotoree

Смежные вопросы