我想为数据库查询创建一个通用函数。我在下面的函数非常适合 SELECT 查询。但是,我希望它能够正常工作以进行插入,更新,DROP 和其他查询不返回任何内容。有人可以告诉我吗为什么对此类查询使用 mysqli_fetch_all 会打印警告?如何妥善处理?如何获取此类查询的状态?
function cms_query($sql_query)
{
// Object returned by mysqli_connect
global $cms_db;
// Perform query
$result = mysqli_query($cms_db, $sql_query);
if(!$result) {
print("ERRORnFAILED_TO_QUERYn");
return;
}
// Obtain results
$rows = mysqli_fetch_all($result, MYSQL_ASSOC);
if(!$rows) {
print("OKn0n0n");
return;
}
// Print result array keys
$keys = array_keys($rows[0]);
print("OKn" . count($keys) . "n");
foreach($keys as $key)
print($key . "n");
// Print result rows
print(count($rows) . "n");
foreach($rows as $row)
foreach($row as $value)
print($value . "n");
}
嗯,拥有这样一个函数本身是个好主意,但有一件事是你的函数极度缺乏的——对预准备语句的支持。
因此,要使您的函数以当前形式工作,这没什么大不了的:
function cms_query($sql_query)
{
// Object returned by mysqli_connect
global $cms_db;
// Perform query
$result = mysqli_query($cms_db, $sql_query);
if(!$result) {
trigger_error(mysqli_error($cms_db));
}
// if it was a DML query
if (if $result === true)
{
return;
}
// Obtain results
return mysqli_fetch_all($result, MYSQL_ASSOC);
}
但是您必须了解这样的函数应该支持预准备语句。为了获得这样的支持,最好使用 PDO。我写了这样一个函数,或者更确切地说,是一个PDO包装器,我强烈建议您考虑。请注意本文的示例部分 - 如您所见,此函数可以运行任何类型的查询。
从手册:
mysqli_query
失败时返回
FALSE
。对于成功的选择、显示、描述或解释查询mysqli_query()
将返回一个mysqli_result
对象。对于其他成功的查询mysqli_query()
将返回 TRUE。
因此,当您执行数据修改查询(例如 INSERT(时,您将获得布尔值。当您尝试将其作为mysqli_fetch_all()
的参数传递时,会出现错误,因为此函数需要mysqli_result
类的实例。