Frage

Ich habe es mit einer MySQL-Tabelle zu tun, die die JobName-Spalte als UNIQUE definiert.Wenn jemand versucht, einen neuen Job in der Datenbank zu speichern und dabei einen JobNamen verwendet, der bereits in der Datenbank vorhanden ist, gibt MySQL eine Warnung aus.

Ich möchte diese Warnung, genau wie einen Fehler, in meinem PHP-Skript erkennen und entsprechend damit umgehen können.Idealerweise würde ich gerne wissen, welche Art von Warnung MySQL ausgegeben hat, damit ich den Code verzweigen kann, um damit umzugehen.

Ist das möglich?Wenn nicht, liegt es daran, dass MySQL nicht über diese Fähigkeit verfügt, PHP nicht über diese Fähigkeit verfügt oder beides?

War es hilfreich?

Lösung

Damit Warnungen nativ an PHP „gekennzeichnet“ werden können, wären Änderungen am MySQL/MySQLI-Treiber erforderlich, was offensichtlich den Rahmen dieser Frage sprengt.Stattdessen müssen Sie grundsätzlich jede Abfrage, die Sie in der Datenbank durchführen, auf Warnungen überprüfen:

$warningCountResult = mysql_query("SELECT @@warning_count");
if ($warningCountResult) {
    $warningCount = mysql_fetch_row($warningCountResult );
    if ($warningCount[0] > 0) {
        //Have warnings
        $warningDetailResult = mysql_query("SHOW WARNINGS");
        if ($warningDetailResult ) {
            while ($warning = mysql_fetch_assoc(warningDetailResult) {
                //Process it
            }
        }
    }//Else no warnings
}

Offensichtlich wird die massenhafte Anwendung sehr kostspielig sein, daher müssen Sie möglicherweise sorgfältig darüber nachdenken, wann und wie Warnungen auftreten können (was dazu führen kann, dass Sie eine Umgestaltung vornehmen, um sie zu beseitigen).

Als Referenz, MySQL zeigt Warnungen an

Natürlich können Sie auf die anfängliche Abfrage verzichten SELECT @@warning_count, was Ihnen eine Abfrage pro Ausführung ersparen würde, aber ich habe es der pedantischen Vollständigkeit halber eingefügt.

Andere Tipps

Erstens sollten Sie Warnungen ausschalten damit Ihre Besucher Ihre nicht sehen MySQL Fehler.Zweitens, wenn Sie anrufen mysql_query(), sollten Sie prüfen, ob es „false“ zurückgegeben hat.Wenn ja, rufen Sie an mysql_errno() um herauszufinden, was schief gelaufen ist.Ordnen Sie die zurückgegebene Nummer den Fehlercodes zu diese Seite.

Es sieht so aus, als ob dies die Fehlernummer ist, nach der Sie suchen:

Fehler:1169 SQLSTATE:23000 (ER_DUP_UNIQUE)

Nachricht:Aufgrund der Eindeutigkeitsbeschränkung kann nicht in die Tabelle „%s“ geschrieben werden.

ini_set('mysql.trace_mode', 1)

könnte das sein, wonach Sie suchen.

Die PHP-Fehler können dann mit einem benutzerdefinierten PHP-Fehlerbehandler behandelt werden. Sie können die Anzeige von PHP-Fehlern aber auch einfach deaktivieren, da diese normalerweise in einer Protokolldatei protokolliert werden (abhängig von Ihrer PHP-Konfiguration).

Abhängig davon, welches Framework (falls vorhanden) Sie verwenden, empfehle ich Ihnen, eine Abfrage durchzuführen, um selbst nach dem Jobnamen zu suchen und die richtigen Informationen für den Benutzer zusammen mit den restlichen Validierungen für das Formular zu erstellen.

Abhängig von der Anzahl der Jobnamen können Sie die Namen an die Ansicht senden, die das Formular enthält, und Javascript verwenden, um mitzuteilen, welche verwendet wird.

Wenn das für Sie keinen Sinn ergibt, dann ist es, um meine Meinung zusammenzufassen, Folgendes:Gestalten Sie Ihr Programm und/oder Ihren Benutzer nicht so, dass er versucht, illegale Dinge zu tun und dabei die Fehler erkennt und sie dann behandelt.Meiner Meinung nach ist es viel besser, Ihr System so zu gestalten, dass es keine Fehler verursacht.Beschränken Sie die Fehler auf tatsächliche Bugs :)

Aktualisiert, um die Informationen zu Errno-Funktionen zu entfernen, von denen ich jetzt weiß, dass sie in Ihrer Situation nicht zutreffen ...

Eine Sache in MySQL, vor der Sie vorsichtig sein sollten UPDATE Aussagen: mysqli_affected_rows() wird Null zurückgeben, auch wenn die WHERE Klausel stimmte mit Zeilen überein, aber die SET Die Klausel hat die Datenwerte nicht wirklich geändert.Ich erwähne dies nur, weil dieses Verhalten einen Fehler in einem System verursachte, das ich mir einmal angesehen habe – der Programmierer verwendete diesen Rückgabewert, um nach einem Update nach Fehlern zu suchen, wobei er davon ausging, dass eine Null bedeutete, dass ein Fehler aufgetreten war.Es bedeutete lediglich, dass der Benutzer keine vorhandenen Werte geändert hat, bevor er auf die Schaltfläche „Aktualisieren“ geklickt hat.

Ich vermute also, dass ich es benutze mysqli_affected_rows() Man kann sich auch nicht darauf verlassen, solche Warnungen zu finden, es sei denn, man hat so etwas wie eine update_time Spalte in Ihrer Tabelle, der bei Aktualisierung immer ein neuer Zeitstempelwert zugewiesen wird.Diese Art der Problemumgehung scheint allerdings etwas umständlich zu sein.

Sie können Verstöße gegen eindeutige Schlüssel mithilfe der MySQL-Anweisung Fehler Nr. erkennen.Die MySQLi-Anweisung gibt den Fehler 1062 zurück, also ER_DUP_ENTRY.Sie können nach Fehler 1062 suchen und eine entsprechende Fehlermeldung ausdrucken.Wenn Sie Ihre Spalte (JobName) auch als Teil Ihrer Fehlermeldung drucken möchten, sollten Sie die Fehlerzeichenfolge der Anweisung analysieren.

  if($stmt = $mysqli->prepare($sql)){
            $stmt->bind_param("sss",
            $name,
            $identKey,
            $domain);


            $stmt->execute();
            if($mysqli->affected_rows != 1)  {
                        //This will return errorno 1062
                trigger_error('mysql error >> '.$stmt->errno .'::' .$stmt->error, E_USER_ERROR);
                exit(1);
            }
            $stmt->close();
        } else {

            trigger_error('mysql error >> '. $mysqli->errno.'::'.$mysqli->error,E_USER_ERROR);
        }

Es ist möglich, die Warnungen zu erhalten, und zwar mit MySQL auf effizientere Weise als mit MySQL.

Hier ist der im Handbuch vorgeschlagene Code Seite auf php.net für die Eigenschaft mysqli->warning_count:

$mysqli->query($query);

if ($mysqli->warning_count) {
    if ($result = $mysqli->query("SHOW WARNINGS")) {
        $row = $result->fetch_row();
        printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
        $result->close();
    }
}

Hinweis zur Unterdrückung von Warnungen:Im Allgemeinen ist es keine gute Idee, die Anzeige von Warnungen zu verhindern, da Ihnen möglicherweise etwas Wichtiges entgeht.Wenn Sie Warnungen aus irgendeinem Grund unbedingt ausblenden müssen, können Sie dies individuell tun, indem Sie eine platzieren @ unterschreiben Sie vor der Erklärung.Auf diese Weise müssen Sie nicht alle Warnberichte deaktivieren und können sie auf eine bestimmte Instanz beschränken.

Beispiel:

 // this suppresses warnings that might result if there is no field titled "field" in the result
 $field_value = @mysql_result($result, 0, "field");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top