Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WHERE в библиотеке MySQLi, Выбор конкретного поля в MySQLi 
V
    Опции темы
0Z0NE
Дата 5.4.2013, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


HEY4
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 25.4.2012

Репутация: нет
Всего: нет



Доброго времени суток Уважаемые Знатоки, с Вашего позволения немного предыстории.
В одной моей теме закидали меня некоторые пользователи всякими невкусностями по поводу использования MySQL библиотеки, пробую понять синтаксис и принцип работы MySQLi, и вот первые непонятки.

Есть таблица в ней аж smile 2 записи, и 3 полея id | login | password, пока вытягивал всё и сразу работало хорошо, однако как говориться хорошего по маленьку, стоило добавить WHERE как всё поломалось ... Вот собственно код:
Код

    $db = mysqli_connect('localhost', 'root', '', 'main');// Подключение к БД и(!) выборка таблицы
    if(!$db){ // проверка соединения
       printf("Невозможно подключиться к базе данных. Код ошибки: %s\n", mysqli_connect_error()); 
       exit;
    }
    $query = mysqli_prepare($db,"SELECT `login` FROM `user` WHERE `id`=?");// mysqli_prepare() - Подготавливает SQL выражение к выполнению
    mysqli_stmt_execute($query);// Отправка на сервер для подготовки к выполнению
    $user_id=1;// определение значения переменных, mysqli_stmt_bind_result() не понимает указания в качестве аргумента данные в открытом виде.
    mysqli_stmt_bind_result($query, $user_id);//подстановка переменных в шаблон
    mysqli_error($db);//вывод ошибки не отображенной в браузере(если функция не работает но ошибки нет)
    $user_id = mysqli_stmt_fetch($query);
    print_r($user_id);
    mysqli_close($db);// закрытие соединения с БД

Просьба тыкнуть носом в ошибку...

З.Ы. комментарии далел для себя посему на них не обращайте внимания, хотя если в них уложен не правильный смысл то скажите об этом, буду презнателен.

Это сообщение отредактировал(а) 0Z0NE - 5.4.2013, 23:24
PM MAIL   Вверх
Arantir
Дата 6.4.2013, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Неужели слово "result" в функции mysqli_stmt_bind_result() вам ни о чем не говорит? Особенно то, что некий "result" случается еще до запроса в базу, как такового.

Параметры в подготовленній запрос вставляются функций mysqli_stmt_bind_param(), а bind_result — это для привязки переменных. В переменные, указанные в bind_result, будут помещены значения полей из результата запроса (полей текущей строки при переборе через fetch).

Ошибка возникала потому, что вы не задали значения через bind_param при присутствующем в запоросе вопросительном знаке (с которым СУБД, очевидно, не в курсе что делать).

Добавлено через 3 минуты и 54 секунды
Код

mysqli_stmt_bind_result() не понимает указания в качестве аргумента данные в открытом виде.
Не "не понимает", а "аргумент должен быть ссылкой на переменную". Ибо в эту переменную, как уже выяснилось, что-то должно положиться. 
В bind_param можно вставлять данные напрямую.

Это сообщение отредактировал(а) Arantir - 6.4.2013, 00:20


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
skyboy
Дата 6.4.2013, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



хм. ну, обычный путь: prepare + bind_param + execute. не уверен, что stmt_execute хоть в каком-то виде будет оправлять на сервер для подготовки.
не, серьезно, ты что-то наплутал.
bind_result — это указать в какие переменные запихивать поля каждой записи результата после очередного fetch.
то есть так:
prepare + bind_param + execute + bind_result + fetch

Добавлено через 22 секунды
долго писал  smile 
PM MAIL   Вверх
Arantir
Дата 6.4.2013, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Да, точно, при исправлении bind_result на bind_param надо не забыть поместить его до execute.
В общем, вот http://www.php.net/manual/ru/mysqli-stmt.bind-param.php (на русском даже)


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
0Z0NE
Дата 6.4.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


HEY4
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 25.4.2012

Репутация: нет
Всего: нет



Хм ... переделал вот так, и всеравно без результатно... выводит 1, что есть данными переменной $user_id...
Код

    $user_id=1;// определение значения переменных, mysqli_stmt_bind_result() требует только переменные(не данные в чистом виде).
    
    $query = mysqli_prepare($db,"SELECT `user_login` FROM `login_date` WHERE `user_id`=?");// mysqli_prepare() - Подготавливает SQL выражение к выполнению
    
    mysqli_stmt_bind_param($query, 'i',$user_id);//подстановка переменных в шаблон
    
    mysqli_stmt_execute($query);// Отправка на сервер для подготовки к выполнению
    mysqli_error($db);//вывод ошибки не отображенной в браузере(если функция не работает но ошибки нет)
    
    mysqli_stmt_bind_result($query, $user_id);//подстановка переменных в шаблон
    
    $user_id = mysqli_stmt_fetch($query);
    print_r($user_id);
    mysqli_close($db);// закрытие соединения для экономии памяти и кеша


Кстати насколько я понял бинд парам какраз таки для записи в БД, и подтвердили мои подозрения обязательность указания типа переменных ... Хотя могу ошибаться...

Это сообщение отредактировал(а) 0Z0NE - 6.4.2013, 13:36
PM MAIL   Вверх
Arantir
Дата 6.4.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Что-то вы сильно все напутали. Даже хуже, чем в первом посте. 

Цитата(0Z0NE @  6.4.2013,  12:32 Найти цитируемый пост)
выводит 1, что есть данными переменной $user_id...

1 — это булевое TRUE, которое вы сами же запихнули в эту переменную вот тут:
Код

$user_id = mysqli_stmt_fetch($query);


Цитата(0Z0NE @  6.4.2013,  12:32 Найти цитируемый пост)
подтвердили мои подозрения обязательность указания типа переменных

Отправка в базу — это только execute. Типы переменных указываются для их правильной фильтрации. Ведь строку нельзя записать числом, double нельзя записать в integer, а двоичные данные только как двоичные и можно записать. Чтобы база лишний раз не ругалась на все это, то тип указывается еще до отправки данных.

Код

mysqli_stmt_bind_result($query, $user_id);//подстановка переменных в шаблон
$user_id = mysqli_stmt_fetch($query);
bind_result указывает переменные, в которые будут помещены данные, а не из которых данные будут взяты. А fetch вообще возвращает true/false (1 или 0) для использованная в while. Применение bind_result не обязательно (можно так же, как и в старой версии mysql), хотя может быть более удобным в некоторых случаях.

Код

<?php
// подключение
$db = mysqli_connect('localhost', 'root', '', 'main');

// подготовка
$stmt = mysqli_prepare($db, "SELECT `user_login` FROM `login_date` WHERE `user_id` = ?");

// вставка данных
mysqli_stmt_bind_param($stmt, 'i', 1);

// запрос
mysqli_stmt_execute($stmt);

// связывание переменных с получаемым результатом
mysqli_stmt_bind_result($stmt, $user_login);

// перебор полученных строк
while (mysqli_stmt_fetch($stmt))
{
    // данные находятся в привязанных переменных
    var_dump($user_login);
}

// закрытие соединения
mysqli_close($db);

Получение данных в старом стиле:
Код
<?php
// подключение
$db = mysqli_connect('localhost', 'root', '', 'main');

// подготовка
$stmt = mysqli_prepare($db, "SELECT `user_login` FROM `login_date` WHERE `user_id` = ?");

// вставка данных
mysqli_stmt_bind_param($stmt, 'i', 1);

// запрос
mysqli_stmt_execute($stmt);

// получение результата
$result = mysqli_stmt_get_result($stmt);

// перебор полученных строк
while ($row = mysqli_fetch_array($result))
{
    $user_login = $row['user_login'];
    var_dump($user_login);
}

// закрытие соединения
mysqli_close($db);

Как видно из последнего примера, все различия, помимо названий функций, только в prepare и bind_param. Остальные действия точно такие же, как при использовании mysql.

Это сообщение отредактировал(а) Arantir - 6.4.2013, 15:54


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
0Z0NE
Дата 6.4.2013, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


HEY4
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 25.4.2012

Репутация: нет
Всего: нет



Arantir, Спасибо что-то потихоньку проясняеться, только вот не понял за что ругаеться на второй пример РНР ... почему-то ругаеться на строчку $result = mysqli_stmt_get_result($stmt); почитал требует идентификатор который возвращает  mysqli_stmt_init(), пробовал конструкцию типа:
Код

  $idd = mysqli_stmt_init($db);
  $result = mysqli_stmt_get_result($idd);

 но не помогло, пробовал подставить вместо $db переменную $query но тож не помогло (Дааа .. танцы с бубном вокруг новых функций всегда были неотъемлемым ритуалом обучения новичков  smile )

Пересмотрел оба варианты, Ваш и свой, функции те-же переменные ... почти те-же .. разница получеться лишь в том что в mysqli_stmt_bind_result($stmt, $user_login); у меня просто переприсваиваеться $user_id ...  smile ого какая нежная библиотека, кстати даже mysqli_stmt_bind_param() (у меня по крайней мере) всёравно отплёвываеться от данные в чистом виде, только  переменные  smile 

Всем спасибо пойду дальше пробовать, если у кого есть учебничек а-ля MySQLi с нуля прошу кинуть в личку)) ато зафлужу глупыми вопросами весь форум smile 

Это сообщение отредактировал(а) 0Z0NE - 6.4.2013, 18:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0724 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.