Php PDO execute返回1但不影响行?

Php PDO execute返回1但不影响行?,php,mysql,class,pdo,Php,Mysql,Class,Pdo,我在使用PDO delete方法时遇到了一些奇怪的行为,我希望能找到一些原因的答案。出于某种原因,当我执行删除(在本例中,表为空)时,查询返回1。根据文档,如果未修改任何行,则应返回0。这是代码 protected function dsn() { return 'mysql:host=' . $this->host . ';dbname=' . $this->db . ';charset=' . $this->charset; } //my PDO attribut

我在使用PDO delete方法时遇到了一些奇怪的行为,我希望能找到一些原因的答案。出于某种原因,当我执行删除(在本例中,表为空)时,查询返回1。根据文档,如果未修改任何行,则应返回0。这是代码

protected function dsn() {
    return 'mysql:host=' . $this->host . ';dbname=' . $this->db . ';charset=' . $this->charset;
}

//my PDO attribute options//
protected $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ];
//I have separate connections for different queries with different permissions
depending on what I need to do//
protected function connectDelete() {
    $dsn = $this->dsn();
    $this->pdo = new PDO($dsn, $this->userDelete, $this->passDelete, $options);

    return $this->pdo;
}

function deleteQuery($query, $values = []) {

    $prepare = $this->connectDelete()->prepare($query);
    $result = $prepare->execute($values);

    return $result;
}
排除所有相关代码后,下面是查询

require_once $root.'/classes/userDB.php';
$db = new userDB();

$query = "DELETE FROM table WHERE primaryKey = ? AND user_id = ?";
$values = [$pk_id,$user_id];
$result = $db->deleteQuery($query, $values);

echo $result;
returns 1
我做错什么了吗

编辑#1:
所以我试着
rowCount()
看看结果会是什么,我得到了以下错误

致命错误:对非对象调用成员函数rowCount()

看来查询失败了

编辑#2:
下面是将返回受影响行的新函数

function deleteQuery($query, $values = []) {

    $prepare = $this->connectDelete()->prepare($query);
    $prepare->execute($values);
    $result = $prepare->rowCount();

    return $result;
}

成功时返回
TRUE
,失败时返回
FALSE

true
输出为字符串变为
1
。这并没有说明删除了多少行,只是说明查询成功(即语法正确且执行时没有错误)。如果您想知道有多少行受到影响,您需要查找

成功时返回
TRUE
,失败时返回
FALSE


true
输出为字符串变为
1
。这并没有说明删除了多少行,只是说明查询成功(即语法正确且执行时没有错误)。如果您想知道有多少行受到影响,您需要查找。

如何调用
rowCount
?@danronmoon-
$count=$result->rowCount();echo$count主题外:将connect语句包装在try catch块中。如果由于某种原因您的连接失败,每个人都可以通过跟踪堆栈跟踪来查看应用程序的密码(假设此处为生产)。除非你和HHVM合作@RichardA这实际上是全局异常处理程序和/或生产机器上适当的错误报告/显示设置的工作。不要为了避免信息泄漏而将所有内容都包装在
try..catch
块中,这是疯狂的,并且否定了使用异常进行错误处理。@deceze这是非常正确的,但总比连接失败并将密码提供给所有人要好(假设由于某种原因在生产环境中出现错误报告),正确的错误处理应该是非做的。考虑这是处理它的一个极小的例子。您如何调用<代码> ROUNTUCT??;echo$count;
脱离主题:将您的connect语句包装在try catch块中。如果由于某种原因您的连接失败,每个人都可以通过跟踪堆栈跟踪(假设此处为生产)来查看应用程序的密码。除非您使用HHVM。@RichardA,否则这实际上是全局异常处理程序和/或生产计算机上适当的错误报告/显示设置的工作。不要为了避免信息泄漏而将所有内容都包装在
try..catch
块中,这是疯狂的行为,也否定了使用异常进行错误处理@deceze这是非常正确的,但它仍然比连接失败并向所有人提供密码要好(假设由于某种原因在生产环境中启用了错误报告)正确的错误处理应该是非做的。考虑这是处理它的一个很小的例子。我看到了不同的文档。我有一个这样的想法。你能告诉我<代码> PDO::Exc/<代码>(我指的是什么)和<代码> PDONECTR::执行< /代码>?文档中说:“
exec
:执行SQL语句并返回受影响的行数”。它是
prepare()
Execute()
rowCount()的缩写
当您真的不需要准备好的语句时,因为您没有查询的参数。我知道了,我在看不同的文档。我想是这样的。您能告诉我
PDO::exec
(我引用的内容)和
PDOStatement::execute
)之间的区别吗?正如文档所说:
exec
:执行一条SQL语句并返回受影响的行数”。它是
prepare()
Execute()
rowCount()
的简写,当您实际上不需要一条已准备好的语句时,因为您没有查询的参数。