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

时间:2015-03-29 18:50:21

标签: php drop-down-menu foreach

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

<?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>";

?>

2 个答案:

答案 0 :(得分:0)

鉴于您当前的代码,我们可以说明

  1. 您没有对$genre 做任何事情 - 您正在输出<option>元素
  2. 可能没有任何类型(即$genre未设置)
  3. 如果1为真,考虑将explode&#39; d / $genre的值加入封闭的<select> {{ 3}} 标签。

    如果是2,则选择将为空。由于您的问题不包括输出选择的特定代码,因此很难说出真正的问题是什么。你的问题表明&#34;我无法选择(放弃)&#34;所以甚至可能有JavaScript改变了(如果有的话)输出选择的enabled属性。

答案 1 :(得分:0)

正如comments中所述,您使用setAttribute()设置了默认提取模式。因此,您将数据作为对象获取,而不是像正常那样将数据作为数组获取,其中包含:

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

也是来自manual的引用,其中说明哪种模式是默认模式:

  

PDO :: FETCH_BOTH(默认值):返回在结果集中返回的数组,该数组由列名和0索引列号索引

所以不是这个结构:

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

您会收到如下错误:

  

致命错误:无法使用stdClass类型的对象作为数组

我会建议您enable error mode获取PDO连接(只需在连接语句之后立即):

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

然后你也可以将你的数据库内容放在try & catch块中以捕获PDOExceptions:

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