За последние 24 часа нас посетили 64019 программистов и 1740 роботов. Сейчас ищут 875 программистов ...

Переменные в запросах Mysqli

Тема в разделе "PHP для новичков", создана пользователем Journalist, 21 авг 2020.

  1. Journalist

    Journalist Новичок

    С нами с:
    21 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    подскажите пожалуйста. стоит такая задача.

    Напишите форму, которая принимает от пользователя имя и возраст. По нажатию кнопки выводятся все пользователи из users которые совпадают по имени и возрасту.

    файл index.php

    Код (Text):
    1. echo '<form action="output.php" method="GET">
    2. <p>Введите имя <input type="text" name="n1"></p>
    3. <p>Введите возраст <input type="text" name="n2"></p>
    4. <input type="submit" value="Вывести">
    5. </form>
    6. ';
    файл output.php

    Код (Text):
    1. <?php
    2.  
    3. require_once 'config.php';
    4.  
    5. $n1 = $_GET['n1'];
    6. $n2 = $_GET['n2'];
    7.  
    8. $conn = mysqli_connect(SERVERNAME, USERNAME, PASSWORD, DBNAME);
    9. $sql = "SELECT name FROM users WHERE name=".$n1;
    10.  
    11. $result = mysqli_query($conn, $sql);
    12. $b = array();
    13.  
    14. if(mysqli_num_rows($result) > 0) {
    15. while($row = mysqli_fetch_assoc($result)) {
    16.  
    17. $b[] = $row;
    18. }
    19. }
    20. else {
    21.  
    22. echo 'Нет таких данных';
    23. }
    24.  
    25.  
    26.  
    27. echo '<pre>';
    28. print_r($b);
    29. echo '</pre>';
    30.  
    31. mysqli_close($conn);
    32.  
    33.  
    34. ?>
    НО выдает такую ошибку: Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /home/users/s/sharipov-r/domains/ostagroup.ru/kurs/unit_11/dz_unit_11/output.php on line 17

    В чем дело, почему не получается работать с переменной? (база подключена нормально, проверено. если не через form, то все выводит).
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    1. это не ошибка - предупреждение
    2. скорее всего результат запроса пустой
    3. $sql = "SELECT name FROM users WHERE name='$n1'"; ведь это строка
    ну и конечно же SQL иньекция нарантирована
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    По сути ошибка. Даже если добавить кавычки, текст запроса может биться значением переменной. Даже если добавить фильтрацию или экранирование, все равно при выполнении запроса может возникать сбой.
     
  4. Journalist

    Journalist Новичок

    С нами с:
    21 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    @ADSoft работает спасибо! а я курс смотрел, там препод сделал по другому =".$n1; у него все работало.... может быть есть нюансы синтаксиса?
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Руки бы ему оторвать
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Journalist, большинство тырнет-преподов хуже норм. новичков. От них ничего кроме вреда нет.
     
  7. Journalist

    Journalist Новичок

    С нами с:
    21 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    может все-таки есть какие-то нюансы, использования. я же повторял за ним это код, писал, все работало. правда там не было формы запроса. один файл, где показывал работу с бд
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Нет, для $n1 без вариантов. Для $n2 еще возможно так сделать, если заранее проверить, что эта строка содержит число.

    Новое P.S. Если вы все повторяли за преподом, то пошлите его нафиг. В коде с самого начала идет полная хрень.
     
  9. Journalist

    Journalist Новичок

    С нами с:
    21 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    то есть для числа можно и по-другому написать. в курсе препод как раз работал с числом.
     
  10. Journalist

    Journalist Новичок

    С нами с:
    21 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    А почему хрень?
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Webdev сразу предполагает контроль входных данных, обработку ошибок и т.п. Это в школе вы могли писать так:
    Код (Text):
    1. readln(a, b);
    2. r:= a + b;
    3. writeln(r);
    --- Добавлено ---
    Уже вот это хрень:
    PHP:
    1. $n1 = $_GET['n1'];
    2. $n2 = $_GET['n2'];
    3. $conn = mysqli_connect(SERVERNAME, USERNAME, PASSWORD, DBNAME);
    К первой команде (подключению конфига) тоже есть вопросы.
     
  12. Journalist

    Journalist Новичок

    С нами с:
    21 авг 2020
    Сообщения:
    22
    Симпатии:
    0
    Благодарю!!!