Форумы портала PHP.SU » » Работа с СУБД » bind_result и подготовленный запрос произвольным количеством переменных

Страниц (1): [1]
 

1. _Evgenij_ - 14 Августа, 2017 - 01:03:25 - перейти к сообщению
Доброго времени суток!

Прошу помочь готовым кодом, поскольку с MySql познакомился совсем недавно.
Вопрос в следующем: как при подготовленном динамическом запросе, передавать разное количество привязываемых переменных в bind_result()? После нескольких часов поиска в сети, пришло понимание, что нужно как-то использовать функцию call_user_func_array(),
но как она должна выглядеть в данном случае не могу сообразить... я так понимаю, должно выглядеть приблизительно так: call_user_func_array('bind_result', array($col1, $col2, $col...)), НО в описании функции написано, что она вызывает пользовательскую функцию с массивом параметров, отсюда два вопроса: 1)если указать bind_result вызовется ли "родная" функция bind_result() или нужно писать свою и туда уже "впихивать" bind_result(); 2)как я понимаю, если просто написать array($col1, $col2, $col...) то передадутся значение $col1, $col2, $col..., а мне необходимо передать имена переменных $col1, $col2, $col...
Вообщем темный лес и ни одной светлой мысли(((

PS Просьба не отсылать читать документацию (я там был) примеры на разных ресурсах видел, пробовал под себя переписать, но увы не хватает знаний, поэтому ОГРОМНАЯ просьба, переписать нижеприведенный код, или привести пример рабочего(полного) кода.

Заранее благодарен!

$id = '1';
$stmt = $db_mysqli->prepare("SELECT `сolumn_name1`,`сolumn_name2`, `сolumn_name...` FROM `db_name_table` WHERE `id`=?"); //Отправляем шаблон
$stmt->bind_param("i",$id); //Устанавливаем параметры
$stmt->execute() or die("Запрос не выполнен!"); //Выполняем запрос
$stmt->bind_result($col1, $col2, $col...); //<-Вот как сюда передавать произвольное количество переменных???

while ($stmt->fetch())
{
echo"<br>$col1 $col2 $col..."; //Выводим результат пользователю.
}
$stmt->close(); //Удаляем шаблон из памяти.
2. _Evgenij_ - 14 Августа, 2017 - 09:27:02 - перейти к сообщению
Нашел решение при помощи eval(). Но буду очень благодарен, если кто-нибудь на вышеприведенном коде объяснит как использовать в такой ситуации функцию call_user_func_array().

Решение с помощью eval():

//создаем строку, генерируем необходимое количество $col...
$bindResult = '$stmt->bind_result($col1,$col2, $col3, $col....);';
//преобразуем строку в код
eval($bindResult);
3. Мелкий - 14 Августа, 2017 - 10:03:01 - перейти к сообщению
Если не ради спортивного интереса - то зачем вам вообще сдался bind_result?

Стандартные методы обхода результата выглядят вот так:
PHP:
скопировать код в буфер обмена
  1. foreach ($stmt as $row) { // емнип, начиная с php 5.4+
  2.     // массив $row со всеми данными этой строки
  3. }

PHP:
скопировать код в буфер обмена
  1. while ($row = $stmt->fetch_assoc()) {
  2.     // массив $row со всеми данными этой строки
  3.     echo " id = " . $row['id'] . "\n";
  4. }


Ну а для спортивного интереса см вот этот комментарий: http://www.php.net/manual/de/fun...-array.php#91503
4. _Evgenij_ - 14 Августа, 2017 - 10:26:19 - перейти к сообщению
Насколько я понимаю, в целях безопасности лучше использовать подготовленные запросы, а где подготовленный запрос, там и bind_result() ...
5. Мелкий - 14 Августа, 2017 - 10:43:35 - перейти к сообщению
Хм.
Вот за это я и ненавижу mysqli. Идиотский неудобный API, особенно в важнейшей чсти - в prepared statements. Для нормального fetch сначала надо дёргать http://php.net/manual/en/mysqli-...t.get-result.php

У PDO API куда более внятный. Куда и рекомендую уйти.

 

Powered by ExBB FM 1.0 RC1