【问题标题】:MYSQL/PHP: Create an Array using FetchAll with PDOMYSQL/PHP:使用 FetchAll 和 PDO 创建一个数组
【发布时间】:2017-07-03 00:53:21
【问题描述】:

我是 PDO 新手,无法将提取结果放入数组中。

以下代码成功查询数据库。但是,我想将结果放入一个数组中,以便我可以单独处理数组的元素。我不确定下面的 $result 到底是什么。它已经是一个数组了吗?或者它是什么。我想我需要使用fetchAll 来获取数组。如果是这样,将不胜感激适当的代码来做到这一点。或者,如果下面的$results 已经是一个数组,那么它与我使用fetchAll 得到的有什么区别?

//USE PDO TO CONNECT TO DBASE
$hostdb = "my host";
$namedb = "mydb";
$passdb = "bypass";
$userdb = "myusername";

try {
  // Connect and create the PDO object
  $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8

  // Define and perform the SQL SELECT query
  $sql = "SELECT * FROM `comments` WHERE `userid` IN(118)";
  $result = $conn->query($sql); // THIS WORKS
// $result = $sql->fetchAll(PDO::FETCH_OBJ);  //THIS DOES NOT WORK
   if($result !== false) {

    // Parse the result set
    foreach($result as $row) {
      echo $row['id']. ' - '. $row['name']. ' - '. $row['category']. ' - '. $row['link']. '<br />';
    }
  }

  $conn = null;        // Disconnect
}
catch(PDOException $e) {
  echo $e->getMessage();
}

【问题讨论】:

  • 它返回一个对象,但你可以遍历一个对象或一个数组。对于 fetchall 你需要准备执行,RTFM.Didnt downvote 你顺便说一句
  • fetchAll 会将完整的结果集返回到一个变量中。该变量是一个数组,结果集中的每一行出现一次。根据您在 fetchAll 中使用的参数,它将是一个行数组或行对象数组
  • \PDO::FETCH_ASSOC 和 \PDO::FETCH_NUM 允许您定义获取模式。 \PDO::FETCH_ASSOC 将只返回字段 => 值数组,而 \PDO::FETCH_NUM 返回带有数字键的数组
  • 是的,我想我想获取所有。因为我想在循环外使用这个数组。我想对数组中的值进行一些数学运算,然后将它们存储到数组中的一个新变量中。但是,我要获取以上所有内容的一个班轮并没有运行: $result = $sql->fetchAll(PDO::FETCH_OBJ); //这不起作用

标签: php mysql pdo


【解决方案1】:

fetchAll 会将完整的结果集返回到一个变量中。该变量是一个数组,结果集中的每一行出现一次。根据您在 fetchAll 中使用的参数,它将是一个行数组或行对象数组。

但是你的语法有一些小错误

// Define and perform the SQL SELECT query
$sql = "SELECT * FROM `comments` WHERE `userid` IN(118)";

$result = $conn->query($sql); 
if($result !== false) {

    // use $result here as that you PDO::Statement object
    $allRows = $result->fetchAll(PDO::FETCH_OBJ); 

    // Parse the result set
    foreach($allRows as $row) {
        // also amend here to address the contents of the allRows i.e. $row as objects
      echo $row->id. ' - '. $row->name. ' - '. $row->category. ' - '. $row->link. '<br />';
    }

【讨论】:

  • 这是有道理的。它不会抛出错误。但是, $allRows 似乎是空的,无论是在您的代码中迭代还是使用 print_r 。在原始代码中,它回显了大约 10 行,因此它不是空的。
  • 我打错了 '$row>name' 应该是 $row-&gt;name 就这么简单吗?
  • 作为记录,fetchAll() 在代码立即迭代同一层中的结果集时不应使用(IIRC,这会导致不必要的内存使用)。相反,直接使用foreach() 遍历结果集对象($result)并使用数组语法访问行的数据。
【解决方案2】:

首先,要确定$result 是什么,使用var_dump($result),因为PDO::query 方法返回一个PDOStatement 对象。此外,在您的情况下,它不是数组,而是 PDOStatement 对象。请参阅http://php.net/manual/en/pdo.query.php。 之后,我建议使用PDO::prepare()PDO::execute() 方法来运行您的SQL 查询,因为它对性能友好,特别是如果您要多次运行它并且通过防止SQL 注入来更安全。请参阅http://php.net/manual/en/pdo.prepare.php。 毕竟,PDO::fetchAll() 将返回一个您已经想要的结果集数组。请参阅 PHP PDO::fetchAll() 手册。 所以我会做的是:

$sql = "SELECT * FROM `comments` WHERE `userid` IN(118)";

$statement = $conn->prepare($sql);
if($statement->execute())
{
    $results = $statement->fetchAll('Your prefered fetch style');

    foreach($results as $result) {
      ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 2013-08-20
    • 2012-06-23
    • 2011-08-28
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多