感谢您的检查。所有有用的答案/评论都已经过投票。 我有以下代码,它完成了这项工作,但是imo效率不高。我认为它效率不高的原因是因为我使用fetchAll + loop ,即使我知道查询将返回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
,因为我当前的逻辑需要它。
答案 0 :(得分:6)
$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
}
答案 1 :(得分:3)
我会按照以下方式重写它:
$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
}
}
此外,我enable PDO
会为所有错误抛出异常:
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
因此,我不需要为每个PDO
结果检查错误。主函数中只有try/catch
块。位于代码顶层的某处:
try {
// main script logic
}
catch (PDOException $e) {
// sql error appeared somewhere, we should save it for futher investigation
}
答案 2 :(得分:1)
如果您希望处理的行不超过一行,则可以使用fetch
代替fetchAll
。
答案 3 :(得分:1)
您只需要为您的语句使用本机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
}
答案 4 :(得分:1)
尝试:
$stmt->fetch( PDO::FETCH_ASSOC );
这将只获取第一行。
由于您确定它只返回1行或0行,因此使用它可能是安全的。