无法访问从 PDO 查询中获取的数据

Can't access fetched data from PDO query

我正在尝试使用我的数据库中的选项(流派)创建一个下拉列表。例如,如果我的数据库中有喜剧、惊悚片和动作片,这些类型将作为选项出现在我的下拉列表中。基本上发生的事情是我得到一个没有选项的空白列表,我想知道我的代码是否有任何问题。提前致谢。

<?php

    $sql = 'SELECT DISTINCT Genre.name FROM (Genre JOIN Movie2Genre ON Genre.id = Movie2Genre.idGenre)';
    $stmt = $db3->prepare($sql);
    $stmt->execute();

    $allGenre = $stmt->fetchAll();


    echo "<select>";
    foreach ($allGenre as $val){
        echo "<option value='{$val["name"]}'>{$val["name"]}</option>";
    }
    echo "</select>";

?>

根据您当前的代码,我们可以声明

  1. 你没有对 $genre 做任何事情 - 你正在输出 <option> 元素
  2. 可能没有任何流派(即 $genre 未设置)

如果 1 为真, 考虑将 $genreexplode'd/joined 值放在封闭的 <select>docs 标签.

如果是 2,select 将为空。因为你的问题没有包含输出select的具体代码,很难说到底是什么问题。您的问题表明 "I can't select (drop)" 因此甚至可能 JavaScript 更改输出的(如果有)的启用属性 select.

正如 you set your default fetch mode with setAttribute() 中所证明的那样。因此,您将数据作为对象获取,而不是像通常那样作为数组获取:

$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

还有来自 manual 的引述,其中说明了默认模式:

PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your result set

所以不是这个结构:

    Array
(
    [0] => Array
        (
            [id] => 1
            [0] => 1
            [number] => 3234
            [1] => 3234
            [text] => sdfdsf
            [2] => sdfdsf
            [texttext] => sdfsdf
            [3] => sdfsdf
        )
    //...

你有这样的结构:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [number] => 3234
            [text] => sdfdsf
            [texttext] => sdfsdf
        )
    //...

所以你需要像这样使用->来访问对象属性:

$val->name

旁注:

此外,如果您要添加 error reporting(仅在暂存期间,从不在生产中!):

<?php
    ini_set("display_errors", 1);
    error_reporting(E_ALL);
?>

你会收到这样的错误:

Fatal error: Cannot use object of type stdClass as array

我建议您 enable error mode 用于 PDO 连接(只需将其放在连接语句之后):

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后您还可以将您的数据库内容放入 try & catch 块中以捕获 PDOExceptions:

try {
    //db stuff
} catch(PDOException) {
    echo $e->getMessage();
}