Привет, я хочу выбрать значения между двумя числами в 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
Это не проверяет, существуют ли все числа, а просто возвращает те, которые существуют.
Это ПДО? Если так prepare нет execute. Вы также неправильно используете подготовленные операторы, параметризуйте.
Ты не звонишь $sql->execute()
Вы пытались запустить этот запрос непосредственно в своей базе данных? Если это так, он возвращает данные, которые вы хотите?
Также ваш for($i=$id; $i<=$max; $i++) { может быть просто range($id, $id + 4)
о боже, я работаю над этим уже 5 дней, я идиот, спасибо
К вашему сведению, если вы не привязываете параметры, вы можете использовать ->query, и он немедленно выполнит SQL. Но вы обязательно должны научиться использовать связанные параметры, а не подставлять переменные в SQL.






Вы должны вызвать выполнение после оператора подготовки. В противном случае он не выполнит ваш запрос.
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, ты прав .. Теперь я обновил свой ответ, чтобы связать параметры
Ваша главная проблема в том, что вы никогда не выполняете запрос. Вы также должны использовать подготовленный оператор вместо того, чтобы вводить свои переменные непосредственно в запрос.
Также не имеет смысла проверять, чтобы идентификатор был больше минимального или меньше максимального а также в этом диапазоне. Вы можете упростить свой запрос и использовать правильно подготовленный оператор, просто проверив вместо этого 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);
}
Почему вы используете и
IN (2, 3, 4, 5, 6), иid >= 2 AND id <= 6? Они оба должны делать одно и то же.