За последние 24 часа нас посетили 22358 программистов и 1026 роботов. Сейчас ищут 662 программиста ...

Переменные в запросах 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.822
    Симпатии:
    736
    Адрес:
    Татарстан
    1. это не ошибка - предупреждение
    2. скорее всего результат запроса пустой
    3. $sql = "SELECT name FROM users WHERE name='$n1'"; ведь это строка
    ну и конечно же SQL иньекция нарантирована
     
  3. miketomlin

    miketomlin Старожил

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

    Journalist Новичок

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

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

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

    miketomlin Старожил

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

    Journalist Новичок

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

    miketomlin Старожил

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

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

    Journalist Новичок

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

    Journalist Новичок

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

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    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
    Благодарю!!!