【问题标题】:PDO: row name as index of result arrayPDO:行名作为结果数组的索引
【发布时间】:2012-05-18 16:59:32
【问题描述】:

我有这个“旧式”的非 PDO MySQL 查询(代码没有收紧,只是为了准确说明我的意思):

<?php
include('db_conn.php'); //Contains the connection info.

$category = 'cars';
$q = "SELECT * FROM `photos` WHERE `category` = '$category'";
$qResult = mysql_query($q);
$Numq = mysql_numrows($qResult);

$count = 0;
while ($count < $Numq)
{
$ThisID = mysql_result($qResult,$count,"id");
$ThisCaption = mysql_result($qResult,$count,"caption");
echo '<img src="images/'.$ThisID.'.jpg" alt="" />';
echo '<br />'.$ThisCaption.'<br /><br />';
$count++;
}
?>

我想以 PDO 形式重新转换查询(我正在学习)。我写了这个:

<?php
//I've set out the connection info format in case there's anything wrong with it...
$db = new PDO('mysql:host=my_host;dbname=my_db_name;charset=UTF-8', 'db_user', 'user_password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); //I prefer to throw PHP errors.
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$category = 'cars';
$statement = $db->prepare("SELECT * FROM `photos` WHERE `category`=?");
$statement->execute(array($category));
$statement->setFetchMode(PDO::FETCH_BOTH);

while ($result = $statement->fetch()) {
//$result[0] = the ID, $result[1] = the caption...
echo '<img src="images/'.$result[0].'.jpg" alt="" />';
echo '<br />'.$result[1].'<br /><br />';
}
?>

...在“旧”非 PDO 表单中,我只需指定列名即可捕获 ID 和标题。 ...但在 PDO 表单中,我必须指定 $result[0] 和 $result[1]。 ...如何更改 PDO 表单,以便不必显式指定(“记住”)数组的哪个成员是 ID,哪个是标题等(因为“旧”方法允许) ?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您可能希望使用 PDO::FETCH_ASSOC 来获取数据,而不是使用 PDO::FETCH_BOTH 作为关联数组。 p>

    然后可以通过$result['id']$result['caption']等方式访问数组的成员


    PDO 支持几种有趣的获取模式;包括

    • associative-array :数组的键将是从数据库返回的列名;这可能是你习惯的
    • 对象;包括您指定的类的实例

    要了解可能的情况,您可能需要查看不同的 PDO::FETCH_* 常量 - 可以在此处找到列表:Predefined Constants

    【讨论】:

    • @Travesty3 感谢您的编辑 :-) 我同时在编辑,您的修改已经丢失了几秒钟——但我已经手动恢复了它们(希望我没有忘记任何事情),感谢历史^^
    • 没问题。只是想指出这一点可能会有所帮助。
    • 啊哈!所以应该是:&lt;?php //(Earlier code, same as before). $statement-&gt;setFetchMode(PDO::FETCH_ASSOC); while($result = $statement-&gt;fetch()) { $ThisID = $result['id']; $ThisCaption = $result['caption']; echo '&lt;img src="images/'.$ThisID.'.jpg" alt="" /&gt;'; echo '&lt;br /&gt;'.$ThisCaption.'&lt;br /&gt;&lt;br /&gt;'; } ?&gt;
    • 很高兴我能帮上忙 :-) 玩得开心!
    • 好吧,您正在使用准备好的语句,而不是自己将任何类型的数据 (而不是转义) 注入到 SQL 查询中,所以我会说您的代码看起来不错,在“sql注入”方面。 ;;;您可能想要转义您正在输出的 HTML,尽管 (例如使用 htmlspecialchars),尤其是如果您不确定标题可以包含什么
    【解决方案2】:
    $statement->setFetchMode(PDO::FETCH_ASSOC);
    

    指定here

    【讨论】:

      【解决方案3】:

      PDO::FETCH_BOTH 应该允许您以关联数组和迭代器的形式访问结果,这样应该可以工作。您可以尝试将其更改为 PDO::FETCH_ASSOC 并查看是否可行,但也可以尝试明确说明查询中的列,而不是使用 *

      【讨论】:

      • 使用 * 不会阻止 PDO 以 OP 想要的形式返回结果(以列名作为键的关联数组),至少不使用 FETCH_ASSOC。
      • @octern:同意,这与回答问题没有任何关系,但我确实认为最好避免使用*,而是尽可能明确说明列/实用。
      猜你喜欢
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2014-03-23
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      相关资源
      最近更新 更多