2016-05-12 119 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