【问题标题】:How to store and process result of a query in PHP array?如何在 PHP 数组中存储和处理查询结果?
【发布时间】:2016-05-09 04:40:10
【问题描述】:

我在 PHP 中的 SQLite 查询是这样的:

function getTableData($l_name) {
   $db = new PDO("sqlite:../db/mydb.sqlite");
   $results = $db->exec("SELECT * FROM Locations WHERE L_ID = '" . $l_name; . "');";
   .......
}

我的问题是:

  • 如何获得基于$results 的位置数组?我可以写$results[0]$results[$results.length] 来分别引用第一条和最后一条记录吗?
  • 如何使用 foreach 循环遍历所有记录?我可以有foreach ($results as $record),其中$record 应该是当前迭代中的单个位置记录吗?
  • 如果我要引用单个记录,比如使用像 records[0] 这样的数组,我将如何访问该记录的字段(例如 L_Name 或 L_ID)?

谢谢。

【问题讨论】:

  • 看起来你想要PDOStatement::fetchAll()。你可以做$records = $results->fetchAll();。然后你可以遍历那个数组,即。 foreach($records as $records){ $record['L_Name'] },或者直接选择,即。 $records[0]['L_Name']

标签: php sqlite pdo


【解决方案1】:

首先,您的代码不正确。这是正确的版本:

$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$db = new PDO("sqlite:../db/mydb.sqlite", $opt);
$stmt = $db->prepare("SELECT * FROM Locations WHERE L_ID = ?");
$stmt->execute([$l_name]);

现在您可以在第二个问题中使用 $stmt 变量代替 $results:

如何使用 foreach 循环遍历所有记录?我可以有 foreach ($results as $record),其中 $record 应该是当前迭代中 Location 的单个记录吗?

是的,你可以。

$stmt = $db->prepare("SELECT * FROM Locations WHERE L_ID = ?");
$stmt->execute([$l_name]);
foreach ($stmt as $row)
{
    // do whatever
}

但是,此方法不适用于您的其他要求。

如何根据 $results 获取位置数组?我可以只写 $results[0] 或 $results[$results.length] 来分别引用第一条和最后一条记录吗?

要得到一个真正的数组,你需要PDOStatement::fetchAll()‌​方法。但是,要获取最后一个元素,语法会有所不同:

$stmt = $db->prepare("SELECT * FROM Locations WHERE L_ID = ?");
$stmt->execute([$l_name]);
$results = $stmt->fetchAll();
$first = $results[0];
$last = $results[count($results)-1];

foreach ($results as $row)
{
    // do whatever
}

如果我要引用单个记录,比如使用像这样的记录[0] 的数组,我将如何访问该记录的字段(例如 L_Name 或 L_ID)?

只是参考它。任何时候你得到一行,你都可以这样处理它的元素

echo $row['L_name'];

【讨论】:

    【解决方案2】:

    PDO::exec 没有收到查询返回的结果集。您想要的是使用PDO::query 方法或PDO::prepare 方法,这两种方法都可以为您提供PDOStatement。这反过来又是可遍历的,允许您执行以下操作:

    $statement = $dbh->prepare("SELECT * FROM Locations WHERE L_ID = :id");
    $statement->bindParam(':id', $l_name);
    $statement->execute();
    
    // Traverse the result set
    while ($row = $statement->fetch()) {
        // Do something with each $row here
    }
    
    // Alternatively, you can load all results into an array:
    $results = $statement->fetchAll();
    

    还请注意,上面的示例使用PDOStatement::bindParam 将您的变量用于查询。这对于防止 SQL 注入攻击至关重要。你可以在这里阅读更多信息:http://php.net/manual/en/security.database.sql-injection.php

    【讨论】:

      【解决方案3】:

      以下是循环查询结果的基本代码,允许您引用返回的每条记录中的字段:

      foreach ($db->$query("SELECT * FROM Locations WHERE L_ID = '" . $l_name . "'") as $row)
      {
          // $row will contain an array to the current record
          // Address fields using the field name in quotes inside the brackets next to $row
          $variable1 = $row['field1name'];
          $variable2 = $row['field2name'];
      }
      

      【讨论】:

        猜你喜欢
        • 2012-11-05
        • 2021-12-28
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        相关资源
        最近更新 更多