[英]PDO in PHP, how to improve this PDO mysql code
谢谢你检查。 所有有用的答案/评论都已经过投票。 我有以下代码,它完成了这项工作,但是imo效率不高。 我认为它不高效的原因是因为我使用fetchAll +循环, 即使我知道查询将返回1或没有记录。
//assume the usual new PDO, binding, and execute are up here
$myval = "somevalue";
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (!$res) {
//no record matches
//BLOCK A CODE HERE
} else {
//found matching record (but always going to be 1 record, no more)
foreach($res as $row) {
if ($myval == $row['val']){
//myval is the same as db
//BLOCK B CODE HERE
} else {
//myval is different from db
//BLOCK C CODE HERE
}
}//foreach
}
如何改进它以消除foreach和fetchAll的庞大外观(考虑到我知道它总是只有1或0记录)? 但是我仍然需要类似的检查点,所以我可以执行相同的BLOCK A
BLOCK B
BLOCK C
因为我当前的逻辑需要它。
$myval = "somevalue";
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$row) {
//no record matches
//BLOCK A CODE HERE
} else if ($myval == $row['val']) {
//myval is the same as db
//BLOCK B CODE HERE
} else {
//myval is different from db
//BLOCK C CODE HERE
}
我将按以下方式重写它:
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
$first_row = ( count($res) ? $res[0] : null );
if ( is_null($first_row) ) {
// nothing found code
}
else {
// we found something
if ($myval == $first_row['val']) {
// result is good
}
else {
// result is bad
}
}
此外,我将启用PDO
为所有错误抛出异常:
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
所以我不需要为每个PDO
结果检查错误。 只需在main函数中try/catch
块。 位于代码顶层的某个地方:
try {
// main script logic
}
catch (PDOException $e) {
// sql error appeared somewhere, we should save it for futher investigation
}
如果您希望处理的行数不超过一行,则可以使用fetch
而不是fetchAll
。
您只需要为您的语句使用本机SQL并准备它:
SELECT * FROM someTable WHERE specificVal = ?
如果你这样做,你可以使用->fetch
而不是->fetchAll
,也可以使用->bindParam
。 并且->prepare
可以轻松处理任何$myVa
l,因为您可以根据需要随时运行该语句。 你只需要机会了?
通过使用另一个参数。
例:
$stmt->prepare($yourQuery);
$stmt->bindParam($one,$two);
if($stmt->fetch(PDO::FETCH_ASSOC))
{
// here you can access $two (the result)
}
elseif(empty($two) || !checkForOtherComparisons($two))
{
// here you go if $two is not available or does not match to any other logic
}
尝试:
$stmt->fetch( PDO::FETCH_ASSOC );
这将只获取第一行。
由于您确定它只返回1或0行,因此使用它可能是安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.