我在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
应该是当前迭代中Location的单个记录 - 如果我引用了一个单独的记录,比如使用像
records[0]
这样的数组,我将如何访问该记录的字段(如L_Name或L_ID)
谢谢。
首先,您的代码是不正确的。正确的版本如下:
$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
}
如果我引用了一个单独的记录,比如使用像records[0]这样的数组,我将如何访问该记录的字段(如L_Name或L_ID)?
只要引用它。任何时候你得到一行,你都可以用的方式来寻址它的元素
echo $row['L_name'];
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
以下是在查询结果中循环的基本代码,允许您引用每个返回记录中的字段:
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'];
}