За последние 24 часа нас посетили 18546 программистов и 1619 роботов. Сейчас ищут 1100 программистов ...

PHP + API передача нескольких значений одного параметра

Тема в разделе "PHP и базы данных", создана пользователем AB_Nab, 4 июл 2023.

  1. AB_Nab

    AB_Nab Гость

    С нами с:
    4 июл 2023
    Сообщения:
    2
    Симпатии:
    0
    Добрый день! Не нашел ни чего подходящего из тем на форуме.

    Есть SQL запрос 'select name from table where id in (?)' если его выполнить в студии и подставить в in id 2 и 3 то запрос выполняется правильно и выдает результат с id 2 и 3.

    сама функция выглядит так:
    public function read_single_post2($id)
    {

    $this->id = $id;

    $query = '
    select name from table where id in (?)

    ';

    $post = $this->connection->prepare($query);
    $post->bindValue(1, $this->id, PDO::pARAM_INT);
    $post->execute();

    return $post;
    }

    если запустить через http://localhost/api/v1/GetFile.php?id=2,3 выдает только первое значение
    пробовал так: http://localhost/api/v1/GetFile.php?id=14020&id=14021 выдает только второе значение

    как правильно передать значения параметра чтоб запрос выполнился как в студии?
     
  2. AB_Nab

    AB_Nab Гость

    С нами с:
    4 июл 2023
    Сообщения:
    2
    Симпатии:
    0
    Может кто с этим столкнется... Переделал немного функцию и заработало...

    public functionread_single_post2($id)
    {
    $idArr = explode(',', $id);
    $idArr = array_map(function($item) {
    return"'".trim($item)."'";
    }, $idArr);
    $idStr = implode(',', $idArr);

    $query = 'SELECT name
    FROM table

    WHEREidIN ('.$idStr.')
    ';

    $post = $this->connection->prepare($query);
    $post->execute();
    return$post;
    }
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @AB_Nab, в выражении in(?) знак вопроса нужен для каждого элемента из $idArr (если $idArr передаём как аргумент в метод execute)
    Например, одним из вариантов:
    PHP:
    1. $idArr = [1,2,3,4,5];
    2. $str1 = str_pad('?', count($idArr)*2-1, ',?');
    3. $str2 = '?' . str_repeat(',?', count($idArr) - 1);
    Конечно, перед применением надо убедиться, что $idArr содержит хотя бы один элемент.
    Метод execute выполнять с параметром $idArr (Массив значений, содержащий столько элементов, сколько параметров заявлено в SQL-запросе - тех самых вопросительных знаков)
    PS: целые числа безопасны для вставки в тело запроса, но при этом надо убедиться, что это именно целые числа.
    Иначе - убиваете безопасность применения подготовленных запросов :)
    PPS: термин 'API' тут абсолютно ни при чём...
     
    artoodetoo нравится это.
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    Зачем велосипед изобретать в кол-ве 5ти значений ? Вернитесь в начало и подумайте.
    Второе - какой смысл использовать prepare, когда у вас значения с типом integer ?
    Просто используйте синтаксис для убедительности данных и отправляйте простой запрос без prepare.

    PHP:
    1. <?php
    2.  
    3. function buildQueryFromInteger( string $query, int ...$ids ): string
    4. {
    5.     return sprintf ( $query, implode ( ', ', $ids ) );
    6. }
    7.  
    8. // SELECT * FROM tb WHERE id IN( 1, 2, 3, 4, 5 )
    9. echo buildQueryFromInteger( 'SELECT * FROM tb WHERE id IN( %s )', ...[ 1,2,3,4,5 ] );