PDOStatement::bindParam — почему не получается биндить через foreach?

Всем доброго времени суток.

В общем такая ситуация. (Может из-за того что пол третьего ночи уже.)

// не в запросе дело
$stmt = $this->db->prepareQuery( 'insert ignore into `xref_tags` ( `tag_id`, `post_id` ) values( ?, ? )' );

//допустим
$tagId = 10;
$postId = 20; 

// рабочий пример
$stmt->bindParam( 1, $tagId );
$stmt->bindParam( 2, $postId );
$stmt->execute();

// не рабочий пример
foreach( array( $tagId, $postId ) as $i => $value ) {
    $stmt->bindParam( $i + 1, $value );
}
$stmt->execute();


Так вот, в первом варианте данные прекрасно биндятся и записываются корректно в базу.
tag_id	post_id
10	20


Во втором же случае, когда делаешь фактически тоже самое, записывается, но иначе.

tag_id	post_id
20	20


Вот и собственно вопрос, почему ?

Спасибо, с ув. Иван.
  • Вопрос задан
  • 2317 просмотров
Решения вопроса 2
Tyranron
@Tyranron
Потому, что нужно читать документацию:
В отличие от PDOStatement::bindValue(), переменная привязывается по ссылке, и ее значение будет вычисляться во время вызова PDOStatement::execute().
Ответ написан
dez-fafara
@dez-fafara Автор вопроса
Сам спросил и сам ответил
foreach( array( $tagId, $postId ) as $i => & $value ) {
    $stmt->bindParam( $i + 1, $value );
}

Все потому что в PDOStatement::bindParam значение по ссылке передается. Вот собственно и решение. Забыл. Извините за беспокойство, всем хороших выходных. А я пойду спать =)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Открываю стрррррашный секрет:

$stmt = $this->db->prepareQuery( 'insert ignore into `xref_tags` ( `tag_id`, `post_id` ) values( ?, ? )' );
$stmt->execute(array( $tagId, $postId ));
Ответ написан
Комментировать
@maxloyko
1 строчка гугле, ищу за Вас
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы