За последние 24 часа нас посетили 17614 программистов и 1724 робота. Сейчас ищут 924 программиста ...

Выбор записи из базы данных по 'id', в зависимости от GET-параметра

Тема в разделе "PHP для новичков", создана пользователем Igorby, 10 июл 2016.

  1. Igorby

    Igorby Новичок

    С нами с:
    30 сен 2015
    Сообщения:
    34
    Симпатии:
    0
    Доброго всем дня.

    Возник вопрос по выборке данных из БД.

    PHP:
    1. ;mysqli->query("SELECT * FROM `zakazy` WHERE `idtovar` = '1'");
    В данном случае php-интерпретатор легко выведет запись(-и), у которых поле 'idtovar' = 1.
    Но как вместо статичной единицы (1), поставить динамическое значение, зависящее от GET-параметра?
    То есть, что-бы `idtovat`, брал значение от единицы (двойки, тройки) идущей от того, что идет в адресной строке, после 'id=' (пример ссылки: index.php?id=1).
    Пробовал изменить запрос всякими способами, не один не удался. Например вот эти:
    PHP:
    1. mysqli->query("SELECT * FROM `zakazy` WHERE `idtovar` = '$_GET["id"]'");
    PHP:
    1. mysqli->query("SELECT * FROM `zakazy` WHERE `idtovar` = '$_GET["index.php?id"]'");
    Подскажите, что я не так делаю и как решить эту задачу. Заранее всем благодарен :)
     
  2. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    А теперь прикинь, что у тебя с кавычками и как бьётся строка из-за них
     
  3. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ты передаёшь в метод query аргумент как строку, чтобы сделать правильную конкатенацию (соединить) с переменной, нужно следовать правильному синтаксису по работе со строками,
    его можно изучить тут https://secure.php.net/manual/ru/language.types.string.php так как $_GET это массив, ты можешь в документации вычитать как вставлять в строку данные из массива по ключу.

    Так как тебе выше подсказали, надо экранировать данные которые ты вставляешь в SQL запрос, чтобы не нарушить его синтаксис.
    Экранируй так:
    https://secure.php.net/manual/ru/mysqli.real-escape-string.php
    https://secure.php.net/manual/ru/mysqli.prepare.php
    https://secure.php.net/manual/ru/mysqli-stmt.bind-param.php
     
  4. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    PHP:
    1. $mysqli->query("SELECT * FROM `zakazy` WHERE `idtovar` = '" . (int)$_GET['id'] . "'");
     
  5. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Если 146% уверенность во входных данных, можно написать коротко и грязно:
    ... where idtovar = $_GET[id]
     
  6. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    очень вредный совет. параметрам из вне доверия меньше нуля
     
  7. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Я в исходном посте нигде не видел, что параметр именно извне. Может, это внутренний скрипт для служебного пользования.
     
  8. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    $_GET значит извне, https://secure.php.net/manual/ru/language.variables.external.php
    даже если можно по говнокодить или для внутреннего использования, то надо хотя бы к int привести, а то мало ли, что-то накроет если туда мусор попадёт.
     
  9. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Это вполне входит в "146% уверенности во входных данных". Т.е. есть четкое знание, что там инт, а не мусор или sql-инъекция
     
  10. Igorbay

    Igorbay Активный пользователь

    С нами с:
    9 апр 2015
    Сообщения:
    48
    Симпатии:
    0
    Спасибо, приму к сведению
    А если нужно будет отсортировать по названию товара, а не по его айди? И в качестве аргумента придет текст?
    PHP:
    1. mysqli->query("SELECT * FROM `zakazy` WHERE `nametovar` = 'Компьютер'");
    В данном случае скрипт:
    PHP:
    1. $mysqli->query("SELECT * FROM `zakazy` WHERE `nametovar` = '" . (int)$_GET['nametovar'] . "'");
    Не принесет пользы. Что делать в данном случае?
     
  11. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    тогда так:
    PHP:
    1. ... where nametovar like '%".mysql_real_escape_string($_GET['nametovar'])."%'
     
  12. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Igorbay, с типом string, лучше обратиться к экранированию mysqli_real_escape_string
    я привел к типу (int) так как там ожидается целое число.
     
  13. Scogzhe

    Scogzhe Зэк
    [ БАН ]

    С нами с:
    4 фев 2015
    Сообщения:
    109
    Симпатии:
    0
    Да, все верно.
     
  14. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Никто ещё не думал этого имбицила спамного забанить?)
     
    mkramer нравится это.