嵌套while-> fetch

时间:2017-06-17 22:11:15

标签: php mysqli

大家好日子!

目前,我正在尝试为我的问题找到解决方法。就我而言,MySqli并不支持嵌套的fetch,因此我的功能并不是很有用。我试图找到一个修复,但没有运气。我目前的代码:

function viewQuestionnaire($id){

    $questionStmt = $this->connection->prepare("SELECT id, type, name FROM TAP_questions WHERE questionnaire_id=?;");
    $questionStmt->bind_param("i", $id);
    $questionStmt->bind_result($id, $type, $name);
    $questionStmt->execute();
    $result = array();

    while ($questionStmt->fetch()) {
        $questions = new StdClass();
        $questions->question_id = $id;
        $questions->question_type = $type;
        $questions->question_options = array();
        $questions->question_name = $name;
        if($questions->question_type=="2"){
            $stmtOptions= $this->connection->prepare("SELECT id, options FROM TAP_options WHERE question_id=?;");
            $stmtOptions->bind_param("i", $id);
            $stmtOptions->bind_result($qu_id, $qu_opt);
            $stmtOptions->execute();
            while ($stmtOptions->fetch()) {
                $options = new StdClass();
                $options->option_id = $qu_id;
                $options->option_name = $qu_opt;
                array_push($questions->question_options, $options);
            }

            $stmtOptions->close();
        }

        array_push($result, $questions);
    }

    $questionStmt->close();


    return $result;
}

正如您所看到的,我试图从数据库中获取值,具体取决于问题类型。如果问题类型是" 2",我需要抓住"额外的"来自另一个表的值。我该怎么做?

维拉德

2 个答案:

答案 0 :(得分:0)

两周前我或多或少地遇到了这个问题,并找到了两个有效的解决方案:

1。)嵌套查询,但为它们使用/初始化两个不同的连接(即使它是在同一个数据库中)

2。)首先执行一个查询,将结果保存在数组中,然后在另一个查询中使用该数组。

答案 1 :(得分:0)

如果缓冲结果,则可以运行第二个查询,而不会丢失第一个查询的结果。

在Mysqli中,您通过mysqli_stmt::store_result method缓冲已执行的预准备语句的结果(默认情况下是未缓冲的)。

...

$questionStmt = $connection->prepare(
    "SELECT id, type, name FROM TAP_questions WHERE questionnaire_id=?;"
);
$questionStmt->bind_param("i", $id);
$questionStmt->bind_result($id, $type, $name);
$questionStmt->execute();

/* store result */
$questionStmt->store_result();

...

/* free result */
$questionStmt->free_result();

$questionStmt->close();

...