我有一个对象来运行我所有的数据库查询,在这个对象中,我有一个名为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);还有其他一些很棒的模式,我在文章中描述过,The only proper guide on PDO。要把它们都扔了吗?真的?或者,以DML查询的初始问题为例。如果要获取受影响的行数,该怎么办?瞧-$inserted = $obj->runQuery($insertQuery,$insertData)->rowCount();你只需要返回语句,然后使用方法链接以获得所需形式的结果。作为奖励,您甚至不需要重写使用内部调用的现有代码。如果使用fetchAll()-循环返回的结果,您仍然可以使用相同的代码,使用返回的语句完全相同:$data = $obj->runQuery($sql);foreach($data as $row) ...--试试看,行得通!关于php - 检查PDO执行的查询是否有要提取的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32877056/
10-09 08:59