Функция выбора php mysql возвращает 0, но без ошибки

Привет, я хочу выбрать значения между двумя числами в php, и я хочу проверить, все ли они существуют в БД, и нет ошибки, но когда я сбрасываю, это говорит, что массив = 0

Я пытаюсь получить вопрос и параметры в одном запросе, используя внутреннее соединение, и выбираю их между двумя числами, я проверяю, находятся ли они в БД с IN, я получаю первое число, а затем добавляю к нему 6, а затем генерирую все числа между ними использовать для IN

public function selectquestion($id){
    $max = $id + 4;//max selected value

    for ($i=$id; $i<=$max; $i++) {
        $arr[] = $i;//generates all numbers between min and max 
    }
    $range = implode(",",$arr);
    $sql = $this->pdo->prepare("SELECT questions.value,questions.file,questions.img,options.option1,options.option2,options.option3,options.option4,options.answer 
                                FROM options 
                                INNER JOIN questions 
                                  ON questions.id = options.q_id 
                                WHERE questions.id >= '$id' 
                                  AND questions.id <= '$max' 
                                  AND questions.id IN ($range)");//selects all of questions and options where condition is true

    $row = $sql->fetchAll(PDO::FETCH_OBJ);
    return$row;
}

var_dump($options = $obj->selectquestion(2));

я хочу, чтобы он показывал все вопросы и варианты, но вывод 0

Почему вы используете и IN (2, 3, 4, 5, 6), и id >= 2 AND id <= 6? Они оба должны делать одно и то же.

Barmar 12.07.2019 17:46

Это не проверяет, существуют ли все числа, а просто возвращает те, которые существуют.

Barmar 12.07.2019 17:48

Это ПДО? Если так prepare нет execute. Вы также неправильно используете подготовленные операторы, параметризуйте.

user3783243 12.07.2019 17:48

Ты не звонишь $sql->execute()

Barmar 12.07.2019 17:49

Вы пытались запустить этот запрос непосредственно в своей базе данных? Если это так, он возвращает данные, которые вы хотите?

Caconde 12.07.2019 17:49

Также ваш for($i=$id; $i<=$max; $i++) { может быть просто range($id, $id + 4)

user3783243 12.07.2019 17:49

о боже, я работаю над этим уже 5 дней, я идиот, спасибо

user10260104 12.07.2019 17:50

К вашему сведению, если вы не привязываете параметры, вы можете использовать ->query, и он немедленно выполнит SQL. Но вы обязательно должны научиться использовать связанные параметры, а не подставлять переменные в SQL.

Barmar 12.07.2019 18:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны вызвать выполнение после оператора подготовки. В противном случае он не выполнит ваш запрос.

public function selectquestion($id){
    $max = $id + 4;//max selected value
    $params = array();
    $arr = array();
    $count = 1;
    for($i=$id; $i<=$max; $i++) {
        $arr[$count] = $i;//generates all numbers between min and max 
        $params[$count] = ':p_'.$count;
        $count++;
    }
    $range_param = implode(",",$params);
    $sql = $this->pdo->prepare("SELECT questions.value,questions.file,questions.img,options.option1,options.option2,options.option3,options.option4,options.answer FROM options INNER JOIN questions ON questions.id = options.q_id WHERE questions.id >= :id AND questions.id <= :max AND questions.id IN ($range_param)");//selects all of questions and options where condition is true
    $sql->bindParam(':id', $id, PDO::PARAM_INT);
    $sql->bindParam(':max', $max, PDO::PARAM_INT);
    foreach($arr as $key => $a){
        $sql->bindParam(':p_'.$key, $arr[$key], PDO::PARAM_INT);
    }
    $sql->execute();
    $row = $sql->fetchAll(PDO::FETCH_OBJ);
    return$row;
}
var_dump($options = $obj->selectquestion(2));

Это не использование надлежащего подготовленного оператора! Вы используете prepare(), но никогда не связываете значения! Большое нет-нет!

Qirel 12.07.2019 18:03

@Qirel, ты прав .. Теперь я обновил свой ответ, чтобы связать параметры

Ashok Gadri 12.07.2019 19:00
Ответ принят как подходящий

Ваша главная проблема в том, что вы никогда не выполняете запрос. Вы также должны использовать подготовленный оператор вместо того, чтобы вводить свои переменные непосредственно в запрос.

Также не имеет смысла проверять, чтобы идентификатор был больше минимального или меньше максимального а также в этом диапазоне. Вы можете упростить свой запрос и использовать правильно подготовленный оператор, просто проверив вместо этого BETWEEN. Кроме того, используя псевдонимы, вы можете сократить выбранные вами столбцы.

public function selectquestion($id){
    $max = $id + 4; //max selected value

    $sql = $this->pdo->prepare("SELECT q.value, q.file, q.img, 
                                       o.option1, o.option2, o.option3, o.option4, o.answer 
                                FROM options o
                                INNER JOIN questions q
                                    ON q.id = o.q_id 
                                WHERE q.id BETWEEN ? AND ?");
    $sql->execute([$id, $max]);
    return $sql->fetchAll(PDO::FETCH_OBJ);
}

Другие вопросы по теме