web-dev-qa-db-ger.com

PHP Try and Catch für SQL Insert

Ich habe auf meiner Website eine Seite (hoher Traffic), die bei jedem Laden der Seite eine Einfügung vornimmt.

Ich bin neugierig auf den schnellsten und sichersten Weg, einen Fehler zu finden und fortzufahren, wenn das System das Einfügen in MySQL nicht durchführen kann. Sollte ich versuchen versuchen/fangen oder sterben oder etwas anderes. Ich möchte sicherstellen, dass die Einfügung erfolgt, aber wenn es aus irgendeinem Grund nicht möglich ist, möchte ich die Seite trotzdem weiter laden.

...
$db = mysql_select_db('mobile', $conn);
mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'") or die('Error #10');
mysql_close($conn);
...
22
meme

Die Überprüfung der documentation zeigt, dass ihre false bei einem Fehler zurückgegeben wird. Verwenden Sie also den Rückgabestatus anstelle von or die(). Es wird false zurückgegeben, wenn es fehlschlägt, was Sie protokollieren können (oder was immer Sie möchten) und dann fortfahren.

$rv = mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'");
if ( $rv === false ){
     //handle the error here
}
//page continues loading
25
Yacoby

Das kann den Trick tun,

function createLog($data){ 
    $file = "Your path/incompletejobs.txt";
    $fh = fopen($file, 'a') or die("can't open file");
    fwrite($fh,$data);
    fclose($fh);
}
$qry="INSERT INTO redirects SET ua_string = '$ua_string'"   
$result=mysql_query($qry);
if(!$result){
    createLog(mysql_error());
}
10
VKGS

Sie können auslösende Ausnahmen für die mysql-Abfrage auf eigene Faust implementieren. Sie müssen einen Wrapper für die mysql_query-Funktion schreiben, z.

// user defined. corresponding MySQL errno for duplicate key entry
const MYSQL_DUPLICATE_KEY_ENTRY = 1022;

// user defined MySQL exceptions
class MySQLException extends Exception {}
class MySQLDuplicateKeyException extends MySQLException {}

function my_mysql_query($query, $conn=false) {
    $res = mysql_query($query, $conn);
    if (!$res) {
        $errno = mysql_errno($conn);
        $error = mysql_error($conn);
        switch ($errno) {
        case MYSQL_DUPLICATE_KEY_ENTRY:
            throw new MySQLDuplicateKeyException($error, $errno);
            break;
        default:
            throw MySQLException($error, $errno);
            break;
        }
    }
    // ...
    // doing something
    // ...
    if ($something_is_wrong) {
        throw new Exception("Logic exception while performing query result processing");
    }

}

try {
    mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'")
}
catch (MySQLDuplicateKeyException $e) {
    // duplicate entry exception
    $e->getMessage();
}
catch (MySQLException $e) {
    // other mysql exception (not duplicate key entry)
    $e->getMessage();
}
catch (Exception $e) {
    // not a MySQL exception
    $e->getMessage();
}
7
Nemoden

wenn Sie den Fehler protokollieren möchten, sollten Sie try/catch verwenden, wenn Sie dies nicht tun. Geben Sie einfach @ vor mysql_query ein

edit: Sie können try catch so verwenden; So können Sie den Fehler protokollieren und das Laden der Seite fortsetzen 

function throw_ex($er){  
  throw new Exception($er);  
}  
try {  
mysql_connect(localhost,'user','pass'); 
mysql_select_db('test'); 
$q = mysql_query('select * from asdasda') or throw_ex(mysql_error());  
}  
catch(exception $e) {
  echo "ex: ".$e; 
}
5
engvrdr

Um auf die Antwort von yasaluyari einzugehen, würde ich bei so etwas bleiben:

Wir können unsere mysql_query einfach wie folgt ändern:

function mysql_catchquery($query,$emsg='Error submitting the query'){
    if ($result=mysql_query($query)) return $result;
    else throw new Exception($emsg);
}

Jetzt können wir es einfach so verwenden, ein gutes Beispiel:

try {
    mysql_catchquery('CREATE TEMPORARY TABLE a (ID int(6))');
    mysql_catchquery('insert into a values(666),(418),(93)');
    mysql_catchquery('insert into b(ID, name) select a.ID, c.name from a join c on a.ID=c.ID');
    $result=mysql_catchquery('select * from d where ID=7777777');
    while ($tmp=mysql_fetch_assoc($result)) { ... }
} catch (Exception $e) {
    echo $e->getMessage();
}

Beachten Sie, wie schön es ist. Immer wenn ein qq ausfällt, geben wir unsere Fehler an. Und Sie können auch feststellen, dass wir den Status der Schreibabfragen jetzt nicht zur Verifizierung in eine $result-Variable speichern müssen, da unsere Funktion dies nun selbst erledigt. Auf dieselbe Weise wie bei der Auswahl wird das Ergebnis genauso wie bei der normalen Funktion einer Variablen zugewiesen, die Fehler werden jedoch selbst verarbeitet.

Beachten Sie auch, dass wir nicht die tatsächlichen Fehler anzeigen müssen, da sie ein enormes Sicherheitsrisiko darstellen, insbesondere bei dieser veralteten Erweiterung. Aus diesem Grund wird unser Standard meistens gut sein. Wenn wir den Benutzer jedoch über einen bestimmten Abfragefehler benachrichtigen möchten, können wir immer den zweiten Parameter übergeben, um unsere benutzerdefinierte Fehlermeldung anzuzeigen.

2
Anonymous
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Ich bin nicht sicher, ob es eine MySQL-Version davon gibt, aber durch das Hinzufügen dieser Codezeile kann man mysqli_sql_exception auslösen.
Ich habe viel Zeit vergangen und die Frage ist bereits geprüft, aber ich habe eine andere Antwort erhalten und kann hilfreich sein.

1
starkm
    $sql = "INSERT INTO   customer(FIELDS)VALUES(VALUES)";
    mysql_query($sql);
    if (mysql_errno())
    {
            echo "<script>alert('License already registered');location.replace('customerform.html');</script>";
    }   
0
Vishal
$new_user = new User($user);
$mapper = $this->spot->mapper("App\User");

try{
    $id = $mapper->save($new_user);     
}catch(Exception $exception){

    $data["error"] = true;
    $data["message"] = "Error while insertion. Erron in the query";
    $data["data"] = $exception->getMessage();

    return $response->withStatus(409)
    ->withHeader("Content-Type", "application/json")
    ->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));        
}

wenn ein Fehler auftritt, erhalten Sie so etwas wie->

{
    "error": true,
    "message": "Error while insertion. Erron in the query",
    "data": "An exception occurred while executing 'INSERT INTO \"user\" (...) VALUES (...)' with params [...]:\n\nSQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for integer: \"default\"" }

mit Statuscode: 409.

0
Bharat Chhabra