【问题标题】:php mysql select function returning 0 but no errorphp mysql select函数返回0但没有错误
【发布时间】:2019-11-22 09:50:34
【问题描述】:

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

我正在尝试使用内部连接在单个查询中获取问题和选项,并在 2 个数字之间选择它们,我检查它们是否在带有 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 &gt;= 2 AND id &lt;= 6?他们都应该做同样的事情。
  • 这不会测试是否所有的数字都存在,它只是返回存在的任何一个。
  • 这是PDO?如果是这样prepare 不是execute。您还滥用了准备好的语句,参数化。
  • 你没有打电话给$sql-&gt;execute()
  • 您是否尝试直接在数据库中运行该查询?如果是,它返回你想要的数据?

标签: php mysql arrays pdo inner-join


【解决方案1】:

你需要在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));

【讨论】:

  • 这不是使用正确的准备好的语句!您使用prepare(),但您从不绑定值!大禁忌!
  • @Qirel 你说得对。现在我已经更新了我的答案来绑定参数
【解决方案2】:

您的主要问题是您从不执行查询。您还应该使用准备好的语句,而不是将变量直接注入到查询中。

同时检查 ID 是否大于最小值、小于最大值 和 在该范围内也没有什么意义。您可以通过检查 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);
}

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2015-07-27
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2011-11-01
    相关资源
    最近更新 更多