Php 检查PDO执行的查询是否有要获取的结果
我有一个对象来运行我所有的数据库查询,在这个对象中,我有一个名为Php 检查PDO执行的查询是否有要获取的结果,php,mysql,pdo,Php,Mysql,Pdo,我有一个对象来运行我所有的数据库查询,在这个对象中,我有一个名为runQuery()的方法,可以为任何类型的查询调用该方法 这只是一个说明代码: public function runQuery($query){ $stmt->prepare($query); $stmt->execute(); return $stmt->fetchAll(); } 我的问题是当我运行$stmt->errorCode()时要查看是否一切正常,我收到错误代码:HY00
runQuery()
的方法,可以为任何类型的查询调用该方法
这只是一个说明代码:
public function runQuery($query){
$stmt->prepare($query);
$stmt->execute();
return $stmt->fetchAll();
}
我的问题是当我运行$stmt->errorCode()时代码>要查看是否一切正常,我收到错误代码:HY000
在一些搜索之后,我发现每当我对没有任何可提取内容的查询执行fetchAll()
时都会触发此错误,例如INSERT-INTO
、UPDATE
或DELETE
我的问题是,在不分解查询以查看第一个单词是否不是这三个单词之一的情况下,如何验证执行的查询是否有要获取的内容?您只是从该函数返回了错误的值
经常发生的情况是,学习者将代码过度复杂化,仅仅因为他们不知道正确的方法,这是非常简单和强大的。然后他们让问题变得更复杂,问一个问题如何解决最初错误的过度复杂的方法所导致的问题。但所有问题都可以用一种非常简单的方法解决:
您必须返回语句,而不是行。它将使我们的功能非常方便,而且更有用,但它将保持像这个“说明代码”一样简单。它会解决你的问题,只是一个副作用
public function runQuery($query, $data = array()){
$stmt->prepare($query);
$stmt->execute($data);
return $stmt;
}
是您需要的全部代码吗
要同时获取所有行吗?这样调用函数就行了
$obj->runQuery($sql)->fetchAll();
正如您所看到的,在这种情况下,fetch方法可以简单地“链接”到runQuery()
方法调用,这要归功于称为“方法链接”的非常简洁的OOP语法特性。您只需要返回语句,而不是结果
写得不多,但灵活性很大。现在,您可以获得任何想要的结果类型
事实上,您将自己限制为一种结果集类型,使得获得另一种类型变得复杂。但是PDO已经有数十亿种结果集类型——您只需要使用它们
比如说,你只需要一个用户名。您将如何处理您的功能?嵌套数组的麻烦?这个怎么样
$name = $obj->runQuery("SELECT name FROM users WHERE id=?",[$id])->fetchColumn();
听着,PDO已经有了一个方便的方法。单排怎么样
$user = $obj->runQuery("SELECT * FROM users WHERE email=?",[$email])->fetch();
或者,如果您想要获取一个列,但不是作为一个嵌套但简单的一维数组?PDO同样为您提供了一种方法:
$ids = $obj->runQuery("SELECT id FROM news WHERE date=?",[$date])->fetchAll(PDO::FETCH_COLUMN);
还有其他精彩的模式,我在我的文章中描述过。要把他们都扔了吗?真的吗
或者,以DML查询的初始问题为例。如果要获取受影响行的数量,该怎么办?瞧——
看-您只需要返回语句,然后使用方法链接以所需的形式获得结果
作为奖励,您甚至不需要重写使用内部fetchAll()调用的现有代码。如果使用foreach
循环返回的结果-仍然可以使用相同的代码,使用相同的返回语句:
$data = $obj->runQuery($sql);
foreach($data as $row) ...
--试试看,它行得通 通常是$stmt=$db->prepare()
,然后是$stmt->execute()
。
$data = $obj->runQuery($sql);
foreach($data as $row) ...