无法访问从 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>";
?>
根据您当前的代码,我们可以声明
你没有对 $genre
做任何事情 - 你正在输出 <option>
元素
- 可能没有任何流派(即
$genre
未设置)
如果 1 为真, 考虑将 $genre
的 explode
'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();
}
我正在尝试使用我的数据库中的选项(流派)创建一个下拉列表。例如,如果我的数据库中有喜剧、惊悚片和动作片,这些类型将作为选项出现在我的下拉列表中。基本上发生的事情是我得到一个没有选项的空白列表,我想知道我的代码是否有任何问题。提前致谢。
<?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>";
?>
根据您当前的代码,我们可以声明
你没有对做任何事情 - 你正在输出$genre
<option>
元素- 可能没有任何流派(即
$genre
未设置)
如果 1 为真, 考虑将 $genre
的 explode
'd/joined 值放在封闭的 <select>
docs 标签.
如果是 2,select 将为空。因为你的问题没有包含输出select的具体代码,很难说到底是什么问题。您的问题表明 "I can't select (drop)" 因此甚至可能 JavaScript 更改输出的(如果有)的启用属性 select.
正如 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();
}