我正在修改一些旧代码,我正在创建一个带有INSERT函数的数据库类。为了测试的目的,我把它留在了课堂之外,并且想让它处理错误。
我想删除php错误并返回我自己的错误。目前我有以下,并在复制键上插入工作正常,但当我测试从bind_param中删除类型参数时,我得到以下错误:
警告:mysqli_stmt :: bind_param():第17行/home/matt500b/csgoberry/public/catch.php中指定的类型无效或没有类型
执行语句失败:没有为预准备语句中的参数提供数据
如何删除警告问题并保留我返回的字符串?或者对于生产服务器来说,这种行动的最佳方法是什么。
还有哪些其他错误可以模拟mysqli查询?
function INSERT($link, $sql, $args=null) {
if ($stmt = $link->prepare($sql)) {
for($i=0; $i<count($args); $i++) {
$stmt->bind_param($args[$i]["type"], $args[$i]["value"]);
}
if(!$stmt->execute()) {
return 'Executing the statement failed: ' . htmlspecialchars($stmt->error);
exit();
}
}
else {
return 'Preparing the statement failed: ' . htmlspecialchars($link->error);
exit();
}
return 'Finished';
}
$query = "INSERT INTO insertTest (`value`) VALUES (?)";
$queryArgs[] = array("type"=>"", "value"=>"test1");
echo INSERT($link, $query, $queryArgs);
答案 0 :(得分:2)
坦率地说,错误处理的整个想法是错误的。返回错误消息的函数是致命的罪。函数应返回与其目的相关的内容。例如,插入函数应该返回一个语句,以允许您使用例如affected_rows
变量。
虽然必须以完全不同的方式处理错误。
此外,你使用mysqli的方式是错误的,而且这段代码无论如何都不会工作。
假设您因为某种原因而进行重构,并且可以使用已经稍微过时的 PHP版5.6,这里是运行ANY查询的函数,而不仅仅是INSERT:
function query($link, $query, $params = NULL, $types = NULL)
{
if (!$params)
{
return $link->query($query);
}
$statement = $link->prepare($select);
$types = $types ?: str_repeat('s', count($params));
$statement->bind_param($types, ...$params);
$statement->execute();
return $statement;
}
这就是它的使用方式
$query = "INSERT INTO insertTest (`value`) VALUES (?)";
query($link, $query, ['test1']);
或者,如果你想设置类型,
$query = "INSERT INTO insertTest (`value`) VALUES (?)";
query($link, $query, ['test1'], "s");
现在,关于错误报告的令人兴奋的话题。就像在this answer中解释的那样去做。
简而言之:mysqli已经可以报告错误,并且可以比您的代码更好地报告。所以不要管它,让PHP处理所有错误。
答案 1 :(得分:0)
如果要禁止警告,可以将@运算符放在函数或方法调用的前面,从而产生警告:
@$stmt->bind_param($args[$i]["type"], $args[$i]["value"]);
通常情况下,您应该在将数据传递给较低级别的函数之前检查传递到函数中的无效数据,这意味着不需要@,因为不会调用较低级别的函数在错误的情况下。