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) ...