使用mysqli处理错误

时间:2016-05-12 21:40:13

标签: php mysqli

我正在修改一些旧代码,我正在创建一个带有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);

2 个答案:

答案 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"]);

通常情况下,您应该在将数据传递给较低级别​​的函数之前检查传递到函数中的无效数据,这意味着不需要@,因为不会调用较低级别的函数在错误的情况下。