Php PDO execute返回1但不影响行?
我在使用PDO delete方法时遇到了一些奇怪的行为,我希望能找到一些原因的答案。出于某种原因,当我执行删除(在本例中,表为空)时,查询返回1。根据文档,如果未修改任何行,则应返回0。这是代码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
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()
的简写,当您实际上不需要一条已准备好的语句时,因为您没有查询的参数。