Php 使用mysqli处理错误
我正在修改一些旧代码,并创建一个带有插入函数的数据库类。为了测试的目的,我把它放在了类之外,想让它处理错误 我想删除php错误并返回我自己的错误。目前,我有以下功能,可以在重复键上插入,但当我测试从bind_参数中删除类型参数时,我会出现以下错误: 警告:mysqli_stmt::bind_param():第17行的/home/matt500b/csgoberry/public/catch.php中指定的类型无效或没有指定类型 执行语句失败:未为已准备语句中的参数提供数据 如何删除警告问题并仅保留返回的字符串?或者,对于生产服务器,执行此类操作的最佳方法是什么 对于mysqli查询,我还可以模拟哪些其他错误Php 使用mysqli处理错误,php,mysqli,Php,Mysqli,我正在修改一些旧代码,并创建一个带有插入函数的数据库类。为了测试的目的,我把它放在了类之外,想让它处理错误 我想删除php错误并返回我自己的错误。目前,我有以下功能,可以在重复键上插入,但当我测试从bind_参数中删除类型参数时,我会出现以下错误: 警告:mysqli_stmt::bind_param():第17行的/home/matt500b/csgoberry/public/catch.php中指定的类型无效或没有指定类型 执行语句失败:未为已准备语句中的参数提供数据 如何删除警告问题并仅保
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去做