php mysql select函数返回0但无错误

php mysql select函数返回0但无错误,php,mysql,arrays,pdo,inner-join,Php,Mysql,Arrays,Pdo,Inner Join,嗨,我想在php中选择2个数字之间的值,我想检查它们是否都存在于数据库中,并且没有错误,但当我转储时,它表示array=0 我尝试使用内部联接在单个查询中获取问题和选项,并在2个数字之间选择它们,我检查它们是否在db中,我获取第一个数字,然后向其中添加6个,然后生成它们之间的所有数字以用于in public function selectquestion($id){ $max = $id + 4;//max selected value for ($i=$id; $i<=

嗨,我想在php中选择2个数字之间的值,我想检查它们是否都存在于数据库中,并且没有错误,但当我转储时,它表示array=0

我尝试使用内部联接在单个查询中获取问题和选项,并在2个数字之间选择它们,我检查它们是否在db中,我获取第一个数字,然后向其中添加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));
公共功能选择问题($id){
$max=$id+4;//最大选定值
对于($i=$id;$ipdo->prepare(“选择questions.value,questions.file,questions.img,options.option1,options.option2,options.option3,options.option4,options.answer
从选项
内部连接问题
关于问题.id=options.q\u id
其中questions.id>=“$id”

和questions.id您需要在prepare语句之后调用execute。否则它将不会执行您的查询

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));
公共功能选择问题($id){
$max=$id+4;//最大选定值
$params=array();
$arr=array();
$count=1;

对于($i=$id;$ipdo->prepare(“选择questions.value,questions.file,questions.img,options.option1,options.option2,options.option3,options.options.4,options.answer FROM options内部连接questions.id=options.q_id WHERE questions.id>=:id AND questions.id您的主要问题是您从未执行过查询。您还应该使用准备好的语句将变量直接注入查询的方法

检查ID是否大于最小值、小于最大值以及是否在该范围内也没有什么意义。您可以简化查询,只需检查
之间的
即可使用适当的预处理语句。此外,使用别名可以缩短所选列

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);
}

为什么在(2,3,4,5,6)
中同时使用
id>=2和id这并不是测试是否所有的数字都存在,它只返回存在的数字。这是PDO?如果是这样的话
prepare
不会
execute
。您还误用了prepared语句,参数化。您没有调用
$sql->execute()
您是否尝试直接在数据库中运行该查询?如果是,它将返回您想要的数据?这不是使用正确的预处理语句!您使用了
prepare()
,但从未绑定值!大不不不!@Qirel您是对的。现在我更新了我的答案以绑定参数