2016-05-12 16 views
0

Ich repariere etwas von meinem alten Code und ich erstelle eine Datenbankklasse mit einer INSERT-Funktion. Zu Testzwecken habe ich es außerhalb der Klasse gelassen und möchte es mit Fehlern umgehen lassen.Fehlerbehandlung mit mysqli

Ich möchte die PHP-Fehler entfernen und meine eigenen Fehler zurückgeben. Im Moment habe ich die unten und arbeitet mit einem Einsatz auf doppelten Schlüssel in Ordnung, aber wenn ich aus dem bind_param den Typ Argument testen Entfernen ich die folgende Fehlermeldung erhalten:

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

Wie kann ich die Warnung Problem entfernen und halten nur meine zurück Schnur? Oder für Produktionsserver, was ist die beste Methode für diese Art von Aktion.

Auch welche anderen Fehler kann ich in Bezug auf mysqli Abfragen simulieren?

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

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

+0

Ich simuliere Fehler, um alle Fehler gefangen und richtig angezeigt werden. Ich habe absichtlich "type" => "" leer gelassen. Also Abstimmung nicht doppelt wie das Problem, wie mit solchen Fehlern umgehen – Matt

+0

versucht versuchen/fangen um die Ausführung, aber meine benutzerdefinierte Fehler zeigt nicht und nur die PHP-Warnung zeigt – Matt

Antwort

2

Um ehrlich zu sein, ist die ganze Idee der Fehlerbehandlung falsch. Eine Funktion, die eine Fehlermeldung zurückgibt, ist eine Todsünde. Eine Funktion sollte etwas zurückgeben, das ihrem Zweck entspricht. Beispielsweise sollte eine Einfügefunktion eine Anweisung zurückgeben, damit Sie beispielsweise affected_rows Variable davon verwenden können.

Während Fehler komplett anders behandelt werden müssen.

Außerdem ist die Art, wie Sie mysqli verwenden falsch, und dieser Code wird sowieso nie funktionieren.

Angenommen, Sie aus einem bestimmten Grund sind Refactoring und kann eine bereits etwas veraltet PHP-Version 5.6 verwenden, hier ist die Funktion jeder Abfrage ausführen können, nicht nur 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; 
} 

Und so es kann

$query = "INSERT INTO insertTest (`value`) VALUES (?)"; 
query($link, $query, ['test1']); 

oder, falls verwendet werden Sie Typen festlegen möchten,

$query = "INSERT INTO insertTest (`value`) VALUES (?)"; 
query($link, $query, ['test1'], "s"); 

Jetzt zum spannenden Thema der Fehlerberichterstattung. Tun Sie es einfach so, wie es in this answer erklärt wurde.

Kurz gesagt: mysqli kann seine Fehler bereits melden und kann es viel besser als Ihr Code. Lassen Sie es einfach und lassen Sie PHP alle Fehler behandeln.

0

Wenn Sie die Warnungen hemmen möchten, können Sie den Operator @ vor der Funktion oder Methodenaufruf legen Sie die Warnung verursachen:

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

Normalerweise obwohl, sollten Sie für ungültige Daten werden überprüft in Ihre Funktion übergeben vor Weitergabe dieser Daten zu einer niedrigeren Ebene Funktion, Bedeutung @ ist nicht erforderlich, da die untere Ebene Funktion würde in einer Fehlersituation aufgerufen werden.

+0

Keine Notwendigkeit, die Eingabedaten manuell zu testen, da mysqli ALLE Prüfroutinen bereits haben, viel mehr können Sie jemals entwickeln. Also sollte man eigentlich nur mysqli überprüfen lassen und sagen, was der Fehler war. Außerdem ist @ böse. Keine Ausreden. –

+0

Ja, @ ist böse. Ich beantwortete die Frage (OP wollte Warnungen abstellen) und erklärte, dass es besser ist, eine eigene Fehlerprüfung durchzuführen, als mit @. – Keiji