如何在PHP数组中存储和处理查询结果?

时间:2016-05-09 04:40:11

标签: php sqlite pdo

我在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)?

谢谢。

3 个答案:

答案 0 :(得分:2)

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

$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作为$ 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'];

答案 1 :(得分: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

答案 2 :(得分:-1)

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

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'];
}