2013-08-10 3 views
1

Почему я не могу использовать «bind_param» следующим образом? Существуют ли альтернативные способы использования привязки в цикле?MySQLi "bind_param" в цикле

$insert = $this->db->prepare('INSERT INTO '.$tableName.' ('.implode($colum, ', ').') VALUES ('.implode($placeholder, ', ').'); '); 

for ($i=0;$i<$count;$i++) { 
    $insert->bind_param($query[$i]['type'], $query[$i]['value']); 
} 
+0

Пожалуйста, опишите вашу проблему дальше. Вы получили сообщение об ошибке? Вы пытались отладить свой код, повторяя строку запроса и содержимое '$ query'? – Pikrass

+0

Я получаю эту ошибку: «Warning: mysqli_stmt :: bind_param(): Число переменных не соответствует количеству параметров в подготовленном сообщении». Tnx для ответа :). – Roman

+0

Вы можете использовать 'array_fill', чтобы получить точно' $ count' элементы в '$ placeholder'. – Gumbo

ответ

1

Ну, ваша ошибка делает это довольно ясно: ваш $placeholder массив не содержит одинаковое количество заполнителей, как у вас есть параметры в вашем $query массиве.

Проверьте код здания $placeholder и $query массивов. Если вы не можете найти проблему, добавьте этот фрагмент кода в свой вопрос.


ОК, извините, я не привык к mysqli. Очевидно, вы должны передать все параметры за один звонок до bind_param. Это раздражает, но есть обходной путь.

Функция call_user_func_array позволяет передавать аргументы функции в виде массива.

Таким образом, вы можете:

  • построить строку типов проходом по параметрам;
  • сделать массив $params с этой строкой с индексом 0 и значениями параметров при последующих индексах;
  • звонок call_user_func_array(array($insert, 'bind_param'), $params);.

Это будет выглядеть следующим образом:

$insert = $this->db->prepare('INSERT INTO '.$tableName.' ('.implode($colum, ', ').') VALUES ('.implode($placeholder, ', ').'); '); 

$values = array(); 
for ($i=0 ; $i<$count ; $i++) { 
    $types .= $query[$i]['type']; // this needs to be one single character from [idsb] 
    $values[] = $query[$i]['value']; 
} 

$params = array_merge(array($types), $values); 
call_user_func_array(array($insert, 'bind_param'), $params); 
+0

Спасибо за ваш ответ. Запрос построен правильно. Проблема в параметре param_bind для установки всех заполнителей в одном вызове функции. Я не знаю как это сделать. У тебя есть идеи? – Roman

+0

Вот фрагмент кода http://pastebin.com/xDxYRm5A – Roman

+0

Спасибо. Я отредактировал ответ. ;) – Pikrass

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