0
$sql = 'SELECT id FROM question ORDER BY id';
    foreach ($dbh->query($sql) as $row) {
        $sql2 = 'SELECT id FROM answer WHERE question_id = ' . $row['id'];
        foreach ($dbh->query($sql2) as $row2) {
            $answers[] = array('ID' => $row2['id']);
        }
        $question[] = array('ID'=>$row['id'],
                            'answers' => $answers);
    }
    print_r($question);

使用 $sql2,当我运行它时,它会为我提供 question_id 中的每个 id,而不是选择它等于 $row['id'] 的位置。关于这是如何发生或发生了什么的任何想法?我难住了。

此外,问题具有唯一的 ID,并且 question_id 是答案中的外键,它映射到问题的 ID。Answer 也有唯一的 id 值。

4

3 回答 3

4
$answers = array();
foreach ($dbh->query($sql2) as $row2) {
    $answers[] = array('ID' => $row2['id']);
}

不相关,但这是准备好的语句的一个很好的用例。您的查询也应该为卫生参数化——是的,即使在这种情况下也是如此。

$sql1 = "SELECT...";
$sql2 = "SELECT id FROM answer WHERE question_id = ?";
$stmt2 = $dbh->prepare($sql2);
foreach ($dbh->query($sql) as $row) {
    foreach ($stmt2->execute($row['id']) as $row2) {
于 2013-05-07T18:43:22.660 回答
1

您从问题表中选择所有和每个 id,然后选择问题的所有和每个答案。这真的是你想要的吗?如果是,我建议这样做:

SELECT ASW.id AS 'AnswerID' FROM answer AS ASW
RIGHT OUTER JOIN question AS QNA
ON ASW.question_id=QNA.id
ORDER BY QNA.id

所以我会稍微优化一下 SQL,而不是构建嵌套的 foreach 语句。
或者,如果您有不同的目标(例如列出所有已回答的问题),请提供有关您的表结构的更多详细信息以及您想要做什么,因为这个特定问题很可能可以通过单个 SQL 语句来解决(编辑:而不是嵌套'for')。
我还建议使用Smarty作为从结果集中生成精美表格的简单方法;)

于 2013-05-07T18:53:07.953 回答
-1

如果您的 $row['id'] 不是数字,则应在 WHERE 子句中引用它。最好是单引号,虽然很多数据库系统也接受双引号。

 $sql2 = "SELECT id FROM answer WHERE question_id = '" . $row['id']' . "'";

来源:http ://www.w3schools.com/sql/sql_where.asp

于 2013-05-07T18:47:15.903 回答