Php 在rowCount中使用OR运算符

Php 在rowCount中使用OR运算符,php,pdo,Php,Pdo,我有一个查询,当我运行它时,我使用rowCount检查它是否返回结果。如果有,我会回一些文字。如果没有,我重定向用户-这工作正常,直到。。。。我试图检查rowCount是否在同一行代码中返回结果,如下所示: $id = '1'; $check1 = $stmt = $con->prepare("SELECT * FROM table1 WHERE ID=:id"); $stmt->bindParam(':id', $id); $stmt->execute(); $check2

我有一个查询,当我运行它时,我使用
rowCount
检查它是否返回结果。如果有,我会回一些文字。如果没有,我重定向用户-这工作正常,直到。。。。我试图检查
rowCount
是否在同一行代码中返回结果,如下所示:

$id = '1';
$check1 = $stmt = $con->prepare("SELECT * FROM table1 WHERE ID=:id");
$stmt->bindParam(':id', $id);
$stmt->execute();

$check2 = $stmt = $con->prepare("SELECT * FROM table2 WHERE ID=:id");
$stmt->bindParam(':id', $id);
$stmt->execute();

if($check1->rowCount() > 0 || $check2->rowCount() > 0) {
echo 'Hello';
}else{
header('Location: index.php');
exit();
}
我已经手动进入了
table1
table2
,那里有一个结果,但是当我执行上面的脚本时,我被引导到index.php,因为显然没有结果

我想知道这行代码是否有语法错误:


如果($check1->rowCount()>0 |$check2->rowCount()>0)
PDOStatement::rowCount()
不返回从
选择
查询返回的行数。它用于计算受
UPDATE
DELETE
查询影响的行数


您应该使用表1中的
选择COUNT(*),其中ID=?
来获得您想要的内容,正如文档所说()

更好的方法是使用两个标量COUNT(*)子查询并相加

SELECT (SELECT COUNT(*)
    FROM `table`
    WHERE `ID` = 1
   ) +
   (SELECT COUNT(*)
    FROM  `table1`
    WHERE `ID` = 1
   ) AS Result
如果表中的任何一个显示结果,则结果将>1,因此您可以对其进行测试

使用PDO,在可能的情况下,使用带有“惰性”绑定的常规、未命名占位符-将数据传递到execute中更易于使用&将大大缩短代码。注意execute()中传递的参数必须与query中的参数匹配,因此$id必须传递两次

我修改了你的密码

$id = '1';
$stmt = $con->prepare("SELECT (SELECT COUNT(*)FROM `search`WHERE `ID` = ?)
+ (SELECT COUNT(*) FROM `search1`WHERE `ID` = ?) AS Result");
$stmt->execute(array($id,$id));
if($stmt->fetchColumn() > 0){
echo 'Hello';
}else{
header('Location: index.php');
exit();
}

您没有执行
$check1
$check2
,您正在执行
$stmt
。。。为什么
$stmt
甚至存在?@MarkBaker我知道PDO查询需要
$stmt
。而且,当查询只是其中一个时,它工作得很好。。。这就是为什么我认为问题在于
如果($check1->rowCount()>0 |$check2->rowCount()>0)
那么,隐式地,您也在执行check1和check2,因为它们是对同一语句的引用(对象就是这样工作的)。这样复制代码更容易,但确实不需要,您需要一个变量来存储语句对象,这样您就可以执行它,但该变量不必被称为
$stmt
。它只是在示例中常用。额外的
$stmt
变量只会使代码更加混乱。PDO不可能知道您使用的是哪种类型的变量,因此额外的变量是多余的。@MattiVirkkunen所以在任何查询中都不需要$stmt
?我可以直接转到
$con->prepare
如果关联的PDO语句执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。然而,并非所有数据库都能保证这种行为,便携式应用程序也不应依赖这种行为。
是的,显然MySQL不是其中之一,我相信我们在这里谈论的是MySQL……无论如何,选择所有东西只是为了检查行数是非常低效的。我同意。尽管如此,MySQL并没有通过PDO的
rowCount()