Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: bind_result и подготовленный запрос произвольным количеством переменных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
_Evgenij_
Отправлено: 14 Августа, 2017 - 01:03:25
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Доброго времени суток!

Прошу помочь готовым кодом, поскольку с 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(); //Удаляем шаблон из памяти.

(Отредактировано автором: 14 Августа, 2017 - 08:03:58)

 
 Top
_Evgenij_
Отправлено: 14 Августа, 2017 - 09:27:02
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Нашел решение при помощи eval(). Но буду очень благодарен, если кто-нибудь на вышеприведенном коде объяснит как использовать в такой ситуации функцию call_user_func_array().

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

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



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если не ради спортивного интереса - то зачем вам вообще сдался 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


-----
PostgreSQL DBA
 
 Top
_Evgenij_
Отправлено: 14 Августа, 2017 - 10:26:19
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Авг. 2017  


Помог: 0 раз(а)




Насколько я понимаю, в целях безопасности лучше использовать подготовленные запросы, а где подготовленный запрос, там и bind_result() ...
 
 Top
Мелкий Супермодератор
Отправлено: 14 Августа, 2017 - 10:43:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Хм.
Вот за это я и ненавижу mysqli. Идиотский неудобный API, особенно в важнейшей чсти - в prepared statements. Для нормального fetch сначала надо дёргать http://php.net/manual/en/mysqli-...t.get-result.php

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


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB