2016-05-12 128 views
0

我对我的一些旧代码进行了重构,并使用INSERT函数创建了一个数据库类。为了测试的目的,我把它留在了课堂之外,并且想让它处理错误。使用mysqli处理错误

我想删除php错误并返回自己的错误。目前,我有以下和正常工作与重复键插入,但是当我试从bind_param我收到以下错误删除类型参数:

Warning: mysqli_stmt::bind_param(): Invalid type or no types specified in /home/matt500b/csgoberry/public/catch.php on line 17

Executing the statement failed: No data supplied for parameters in prepared statement

如何删除警告问题,并保持只是我回来串?或者对于生产服务器,这种类型的操作的最佳方法是什么。

还有什么其他错误可以模拟关于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

'try catch'? http://stackoverflow.com/questions/17549584/how-to-efficiently-use-try-catch-blocks-in-php –

+0

我模拟错误,以捕获所有错误并正确显示。我故意留下''type“=>”“'空。因此,投票不重复,因为有关如何处理此类错误 – Matt

+0

试图尝试/抓住周围的执行问题,但我的自定义错误不显示,只有PHP警告错误显示 – Matt

回答

2

坦率地说,错误处理的整个想法是错误的。返回错误消息的函数是一个致命的错误。函数应该返回与其目的相关的内容。例如,插入函数应返回声明,以便让您使用例如affected_rows变量。

虽然错误必须以完全不同的方式处理。

此外,你使用mysqli的方式是错误的,而且这些代码永远不会工作。

假设你重构是有原因的,并且可以使用5.6的已经略显陈旧 PHP版本,这里是运行任何查询功能,不仅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处理所有错误。

0

如果要抑制的警告,你可以把@运算符的函数或方法调用的前面引起警告:

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

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

+0

不需要手动测试输入数据,因为mysqli已经有了所有的检查程序,你可以设计更多。所以实际上应该让mysqli来检查并告诉你什么是错误。此外,@是邪恶的。没有理由。 –

+0

是的,@是邪恶的。我正在回答这个问题(OP想要禁止警告),并解释说你自己的错误检查比使用@好。 – Keiji