PHP PDO返回单行


113

更新2:

那么这是它可以获得的最优化的吗?

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetch();

echo $result ["figure"];

$DBH = null;

更新1:

我知道我可以为sql查询增加限制,但是我也想摆脱foreach循环,这不是我所需要的。

原始问题:

我有以下脚本,由于“ foreach”部分的缘故,它是从数据库返回许多行的良好IMO。

如果我知道我将永远只从数据库中获得1行,该如何优化它。如果我知道我只会从数据库中获得1行,我不明白为什么需要foreach循环,但是我不知道如何更改代码。

$DBH = new PDO( "connection string goes here" );

$STH = $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH -> fetchAll();

foreach( $result as $row ) {
    echo $row["figure"];
}

$DBH = null;

2
$STH - $DBH -> prepare 应该 $STH = $DBH -> prepare在此页面上的几个地方。
符文2015年

您可以在中断时
EgoistDeveloper

Answers:


206

只是获取。只得到一排。所以不需要foreach循环:D

$row  = $STH -> fetch();

示例(ty northkildonan):

$dbh = new PDO(" --- connection string --- "); 
$stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); 
$stmt->execute(); 
$row = $stmt->fetch();

12
如果在prepare语句中使用“ LIMIT 1”,则将进行最优化。
mjspier 2011年

2
很棒,请举一个完整的例子。在上面的示例中,不仅仅是一行必须走到哪儿。
andrebruton

3
@andrebruton $dbh = new PDO(" --- connection string --- "); $stmt = $dbh->prepare("SELECT name FROM mytable WHERE id=4 LIMIT 1"); $stmt->execute(); $row = $stmt->fetch();
low_rents 2014年

2
fetch(PDO::FETCH_ASSOC)如果只需要键值数组,则会将返回的数组切成两半。
rybo111

您真的一直LIMIT 1都需要吗?知道您正在选择一个UNIQUE价值。
超级猫

15
$DBH = new PDO( "connection string goes here" );
$STH - $DBH -> prepare( "select figure from table1 ORDER BY x LIMIT 1" );

$STH -> execute();
$result = $STH -> fetch();
echo $result ["figure"];

$DBH = null;

您可以将fetch和LIMIT一起使用。LIMIT的作用是数据库仅返回一个条目,因此PHP必须处理少得多的数据。使用fetch,您将从数据库响应中获得第一个(也是唯一一个)结果条目。

您可以通过设置访存类型来进行更多优化,请参阅http://www.php.net/manual/de/pdostatement.fetch.php。如果仅通过列名访问它,则需要给数组编号。

请注意ORDER子句。使用ORDER或WHERE获取所需的行。否则,您将始终获得表中的第一行。


13

你试过了吗:

$DBH = new PDO( "connection string goes here" );
$row = $DBH->query( "select figure from table1" )->fetch();
echo $row["figure"];
$DBH = null;

4
实际上,您可以走得更远$row = $DBH->query($query)->fetch()['figure']。如果由于没有结果而fetch返回false,则PHP将静默忽略无效的键引用。如果出现问题query,具体取决于您对错误处理的设置方式,它将抛出Exception(在我看来是所期望的),或者您将收到Invalid object method reference "fetch" on "false"....错误,无论如何您都会得到一种错误的形式,因为查询显然失败了。
kael

9

如果只需要一个字段,则可以使用fetchColumn而不是fetch- http: //www.php.net/manual/zh/pdostatement.fetchcolumn.php


8

您可以使用PDO对基于用户输入的数据库SELECT查询进行尝试:

$param = $_GET['username'];

$query=$dbh->prepare("SELECT secret FROM users WHERE username=:param");
$query->bindParam(':param', $param);
$query->execute();

$result = $query -> fetch();

print_r($result);

3
我认为您今天过得不好,或者您只是想突出个人资料。我的答案在使用PDO查询的SELECT函数的变量的情况下也得到了证实。我将从我的答案中删除sql注入注释,只是为了让您度过愉快的一天。
user3162468 2014年

4

如何limit 0,1用于mysql优化

关于您的代码:

$DBH = new PDO( "connection string goes here" );

$STH - $DBH -> prepare( "select figure from table1" );

$STH -> execute();

$result = $STH ->fetch(PDO::FETCH_ASSOC)

echo $result["figure"];

$DBH = null;

3

多亏了史蒂文(Steven)建议使用fetchColumn,这是我的建议,以减少代码中的一行。

$DBH = new PDO( "connection string goes here" );
$STH = $DBH->query( "select figure from table1" );
$result = $STH->fetchColumn();
echo $result;
$DBH = null;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.