Php 使用mysqli处理错误

Php 使用mysqli处理错误,php,mysqli,Php,Mysqli,我正在修改一些旧代码,并创建一个带有插入函数的数据库类。为了测试的目的,我把它放在了类之外,想让它处理错误 我想删除php错误并返回我自己的错误。目前,我有以下功能,可以在重复键上插入,但当我测试从bind_参数中删除类型参数时,我会出现以下错误: 警告:mysqli_stmt::bind_param():第17行的/home/matt500b/csgoberry/public/catch.php中指定的类型无效或没有指定类型 执行语句失败:未为已准备语句中的参数提供数据 如何删除警告问题并仅保

我正在修改一些旧代码,并创建一个带有插入函数的数据库类。为了测试的目的,我把它放在了类之外,想让它处理错误

我想删除php错误并返回我自己的错误。目前,我有以下功能,可以在重复键上插入,但当我测试从bind_参数中删除类型参数时,我会出现以下错误:

警告: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);
函数插入($link,$sql,$args=null){
如果($stmt=$link->prepare($sql)){
对于($i=0;$ibind_参数($args[$i][“type”],$args[$i][“value”]);
}
如果(!$stmt->execute()){
返回“执行语句失败:”.htmlspecialchars($stmt->error);
退出();
}
}
否则{
返回“准备语句失败:”.htmlspecialchars($link->error);
退出();
}
返回“已完成”;
}
$query=“插入insertTest(`value`)值(?”;
$queryArgs[]=array(“type”=>,“value”=>“test1”);
回显插入($link、$query、$queryArgs);

如果要禁止警告,可以将@operator放在引起警告的函数或方法调用前面:

@$stmt->bind_param($args[$i]["type"], $args[$i]["value"]);

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

如果要禁止警告,可以将@运算符放在函数或方法调用c的前面发出警告:

@$stmt->bind_param($args[$i]["type"], $args[$i]["value"]);

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

坦率地说,错误处理的整个想法是错误的。返回错误消息的函数是deadly sin。函数应返回与其用途相关的内容。例如,insert函数应返回语句,以允许您使用,例如,受影响的行变量

而错误必须以完全不同的方式处理

此外,您使用mysqli的方式是错误的,而且该代码无论如何都不会工作

假设您重构是出于某种原因,并且可以使用已经稍微过时的PHP版本5.6,下面是运行任何查询的函数,而不仅仅是插入:

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");
现在,转到错误报告这一激动人心的话题。只需按照中的说明操作即可


简而言之:mysqli已经可以报告它的错误了,而且可以比您的代码做得更好。因此,让它自己去处理,让PHP来处理所有的错误。

坦率地说,错误处理的整个想法都是错误的。返回错误消息的函数是致命的错误。函数应该返回与其用途相关的内容。例如,insert函数应该返回一条语句,以允许您使用,例如,来自它的
受影响的行
变量

而错误必须以完全不同的方式处理

此外,您使用mysqli的方式是错误的,而且该代码无论如何都不会工作

假设您重构是出于某种原因,并且可以使用已经稍微过时的PHP版本5.6,下面是运行任何查询的函数,而不仅仅是插入:

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");
现在,转到错误报告这一激动人心的话题。只需按照中的说明操作即可


简而言之:mysqli已经可以报告它的错误了,而且可以比你的代码做得更好。所以,让它自己去处理所有的错误吧。

试试catch
?我正在模拟错误来捕获并正确显示所有的错误。我故意留下了
“type”=>“
empty。因此,关于如何处理此类错误的问题没有重复,在执行过程中尝试/捕获,但是我的自定义错误没有显示,只有php警告错误showsTry/catch用于异常,而不是php警告或错误。不要认为你可以用MySqli类实现这一点,但你肯定可以用PDO class.Pr实现生产服务器通常会关闭错误报告,因此您不会在那里看到警告。如果您同意的话。
尝试捕获
?我正在模拟错误,以便捕获并正确显示所有错误。我故意留下了
“type”=>“”
empty。因此,关于如何处理此类错误的问题没有重复,在执行过程中尝试/捕获,但是我的自定义错误没有显示,只有php警告错误showsTry/catch用于异常,而不是php警告或错误。不要认为你可以用MySqli类实现这一点,但你肯定可以用PDO class.Pr实现生产服务器通常会关闭错误报告,因此您不会在那里看到警告。如果您同意的话。无需手动测试输入数据,因为mysqli已经有了所有的检查例程,您可以设计更多的例程。因此,实际上应该让mysqli检查并告诉您错误是什么。此外,@是邪恶的。不,eXcuss.Yes,@是邪恶的。我在回答这个问题(OP想要禁止警告)并解释说,自己进行错误检查比使用@要好。不需要手动测试输入数据,因为mysqli已经有了所有的检查例程,你可以设计更多的例程。因此,实际上应该让mysqli去做