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 :: вопрос по mysqli_stmt_bind_param [2]

 PHP.SU

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


 Страниц (3): « 1 [2] 3 »   

> Без описания
Мелкий Супермодератор
Отправлено: 02 Октября, 2014 - 18:17:05
Post Id



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


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


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




arimanecro пишет:
Вытекает след.вопрос: если препарированный запрос так удобен и безопасен, то почему не откажутся от mysqli_real_escape_string?

Вы ещё спросите, когда люди, наконец, насиловать mysql_query перестанут...

Зачем вообще эта функция сделана? Потому что когда mysqli делали (больше десяти лет назад уже релиз был!) - ещё надо было думать о древних версиях MySQL, которые препарированные запросы ещё не умели (то ли MySQL 3 версии, то ли ранние 4.х). А теперь не выкинешь, обратная совместимость же.


-----
PostgreSQL DBA
 
 Top
arimanecro
Отправлено: 03 Октября, 2014 - 09:35:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Мелкий благодарю за понятное разъяснение Здорово
п.с. не могу нажать кнопку спасибо, так как у меня недостаточное кол-во сообщений
(Добавление)
поэксперементировал и немного в ступоре...

убрал и препарированный запрос и mysqli_real_escape

if(isset($_POST['login'])) {
$login = $_POST['login'];
$query =
"INSERT INTO users888 SET
`name` = '$login'";
$query_run = mysqli_query($connection, $query);
if(mysqli_affected_rows($connection)) {
echo 'good';
} else {echo 'bad';}

все слова которые имеют одинарную кавычку, не заносятся в БД Что? это при том, что mysqli_affected_rows вернул true
а также, если введу, например: vasea; DROP TABLE users888
=====

ааа..понял, запрос из-за кавычки в логине становится некоррекнтым, но почему mysqli_affected_rows вернлу тру, если ничего не занеслось в БД?

и как мне правильно прописать в поле логина, инъекцию типа DROP TABLE users888

(Отредактировано автором: 03 Октября, 2014 - 11:17:02)

 
 Top
Sail
Отправлено: 03 Октября, 2014 - 12:20:43
Post Id



Участник


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


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




arimanecro пишет:
но почему mysqli_affected_rows вернлу тру, если ничего не занеслось в БД?

Написано ведь:
Цитата:
Возвращает количество измененных записей в случае успеха, и -1 в случае если последний запрос не удался.

А -1 - это ведь даже не 0!

(Отредактировано автором: 03 Октября, 2014 - 12:26:23)

 
 Top
arimanecro
Отправлено: 03 Октября, 2014 - 16:11:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Sail
спс, не знал, что функция кроме 0 и 1 может возвращать иное значение
 
 Top
arimanecro
Отправлено: 10 Июня, 2015 - 16:28:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Реанимирую темку...чтобы не создавать похожую.

Проблема в следующем:

PHP:
скопировать код в буфер обмена
  1. $category = $_GET['title'];
  2.  
  3. $q_goods_run = "SELECT id FROM gray_shop_goods WHERE cat = ? ";
  4.        
  5.          if($stmt = mysqli_prepare($connection, $q_goods_run)){
  6.            
  7.                 mysqli_stmt_bind_param($stmt, 's', $category);
  8.                 mysqli_stmt_execute($stmt);
  9.                 mysqli_stmt_bind_result($stmt, $log_id);
  10.  
  11.         while(mysqli_stmt_fetch($stmt)) {
  12.                 echo $log_id;
  13.                 }
  14.         }      
  15. else {
  16.                  echo 'error prepare';
  17.          }


могу ли я НЕ использую привязку mysqli_stmt_bind_param($stmt, 's', $category);, выводить данные из запроса в цикле?

То есть, в запросе я выбрал всё, но на деле буду использовать, например 5 полей из 10, чтобы не перечислять все эти 10 наименований в mysqli_stmt_bind_result, использовать методу как в не препарированном запросе:

while($row = mysqli_fetch_assoc($q)) {

}

Сразу говорю, что так не прокатит:

убираем строчку mysqli_stmt_bind_param($stmt, 's', $category); и меняем на:

PHP:
скопировать код в буфер обмена
  1. while($row = mysqli_stmt_fetch($stmt)) {
  2.                 echo $row['id'];
  3.                 }
 
 Top
Мелкий Супермодератор
Отправлено: 10 Июня, 2015 - 16:45:02
Post Id



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


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


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




Возьмите лучше PDO. Там удобнее сделано многое.


-----
PostgreSQL DBA
 
 Top
arimanecro
Отправлено: 10 Июня, 2015 - 17:17:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Мелкий
до изучения ООП, я ещё не добрался, пока набиваю руку на процедурном стиле
 
 Top
Sail
Отправлено: 10 Июня, 2015 - 17:28:21
Post Id



Участник


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


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




arimanecro, загляните хотя-бы в описание этой функции, ознакомьтесь с примерами...
Подобные вопросы пропадут.
 
 Top
Мелкий Супермодератор
Отправлено: 10 Июня, 2015 - 17:28:28
Post Id



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


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


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




И что?
Использование классов никак не мешает процедурному стилю программирования, равно как и языком без поддержки классов можно писать в объектном стиле.


-----
PostgreSQL DBA
 
 Top
arimanecro
Отправлено: 10 Июня, 2015 - 17:50:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Sail

я всегда, в первую очередь смотрю примеры в документации, потому что описание некоторых функций, не позволяет сразу понять, что там имеется в виду, а так, примеры помогают логически догнать смысл )

действительно, пропустил маленький параграф:

Цитата:
Связывает результаты подготовленного выражения с переменными, определенными с помощью mysqli_stmt_bind_result().


теперь понятно, что без mysqli_stmt_bind_result() никуда Недовольство, огорчение
 
 Top
arimanecro
Отправлено: 12 Июня, 2015 - 12:08:46
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Сегодня столкнулся с такой непоняткой...в документации я не нашел ни слова про данный случай.

Получается в что после начала препарирования, нельзя использовать ВНУТРИ никакой запрос( как препарированный, так и не препарированный) ???

Привожу пример:

PHP:
скопировать код в буфер обмена
  1.  
  2. $res = 'PC';
  3.  
  4. $ico_query = "SELECT ico FROM gray_ico WHERE cat_ico = ?";
  5.                        
  6.                         $stmt2 = mysqli_prepare($connection, $ico_query);
  7.                 mysqli_stmt_bind_param($stmt2, 's', $res);
  8.                 mysqli_stmt_execute($stmt2);
  9.                 mysqli_stmt_bind_result($stmt2, $ico);
  10.        
  11. $ico_query2 = mysqli_query($connection, "SELECT * FROM gray_ico");
  12.                         var_dump($ico_query2); // выдает false и естественно, while не работает
  13.                        
  14. while($row = mysqli_fetch_assoc($ico_query2)) {
  15.                                 echo $row['ico'].'<br>';
  16.                         }
  17.                        
  18. while(mysqli_stmt_fetch($stmt2)) {
  19.  echo $ico;
  20.  
  21.                         }


но, стоит теперь поднять второй запрос с циклом, выше строчки $stmt2 = mysqli_prepare($connection, $ico_query); и все работает.
Как это объяснить?
Спасибо.

(Отредактировано автором: 12 Июня, 2015 - 12:11:24)

 
 Top
Мелкий Супермодератор
Отправлено: 12 Июня, 2015 - 12:30:33
Post Id



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


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


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




Так спросите php, почему там false.
http://php.net/manual/en/mysqli.error.php


-----
PostgreSQL DBA
 
 Top
arimanecro
Отправлено: 12 Июня, 2015 - 13:08:56
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




PHP:
скопировать код в буфер обмена
  1. if (!mysqli_query($connection, $ico_query2 )) {
  2.     printf("Errormessage: %s\n", mysqli_error($connection));
  3. }


Вот что выдало:

Errormessage: Commands out of sync; you can't run this command now

погуглил, решение такое:
http://habrahabr[dot]ru/post/21326/

while($connection->next_result()) $connection->store_result();

как это записать в моем, процедурном стиле? Ниндзя
 
 Top
Sail
Отправлено: 12 Июня, 2015 - 19:10:36
Post Id



Участник


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


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




arimanecro пишет:
while($connection->next_result()) $connection->store_result();
как это записать в моем, процедурном стиле? Ниндзя

Это не Ваш случай. Надо просто разобрать результат первого запроса и закрыть...
 
 Top
arimanecro
Отправлено: 15 Июня, 2015 - 11:37:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


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




Sail

в результате первого запроса выводится хтмл блок, внутри которого выводится ещё один мини-блок, благодаря второму запросу.

Поэтому, если я закрою первый запрос, нарушится целостность верстки.
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB