更快捷的方式

时间:2013-01-22 19:18:19

标签: php

我正在使用PDO从我的数据库中获取一系列关系。

$dbRelaties = $dbh->query("SELECT pkRelatieId,naam,email FROM relaties");

在另一个函数中,我需要访问此数组中的一个特定行。我设法这样做了:

$klant = array();
foreach($dbRelaties as $dbRelatie)
{
    if($dbRelatie["pkRelatieId"] == $relatie){ $klant = $dbRelatie; break; }
}
sendMail("Subject",$klant);

以上代码有效。但我正在寻找一个更简洁的解决方案和更快的解决方案,上面的代码在函数中调用,该函数在循环内调用。因此,每次执行时都必须循环$dbRelaties以获得正确的关系。

有人能让我朝着正确的方向前进吗?

2 个答案:

答案 0 :(得分:3)

假设pk表示主键,则

while($row = mysql_fetch_assoc($result)) {
    $dbRelatie[$row['pkRelatieID']] = $row;
}

会生成一个用主键字段键入的数组,所以

$dbRelatie[$pk]['naam'] 

会给你特定的pk的naam值。

答案 1 :(得分:1)

显示Marc B答案的PDO特定版本。

假设通过PDO执行查询,如下所示:

$sql = "SELECT pkRelatieId,naam,email FROM relaties";
$resultSet = $pdo->query($sql);

可以使用PDO的fetch方法将结果读入PHP数组。

$dbRelaties = array();
while ($row = $resultSet->fetch(PDO::FETCH_ASSOC)) {
    $dbRelaties[$row['pkRelatieID']] = $row;
}

然后可以使用它来根据行的PK访问值。

sendMail("Subject", $dbRelaties[$relatie]['naam']);

此外。 PDO允许您为每个PDO实例分配默认提取模式,并且PDOStatement类是Traversable,因此您实际上不必在while循环中调用fetch()方法来遍历结果集。

如果要在查询之前对PDO对象执行此操作:(理想情况下,只需在创建对象后立即执行一次。)

$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

然后,您可以在结果集上使用foreach循环来获取具有字段名称的行数组,而不是使用while循环。

$dbRelaties = array();
foreach ($stmt as $row) {
    $dbRelaties[$row['pkRelatieID']] = $row;
}