Fehlermeldung bei einem doppeltem Eintrag in MSSQL mit PHP
Hallo,
Ich habe ein Formular wo ich Daten in eine MSSQL DB schreibe.
Jetzt hätte ich gern das wenn ich in dem Feld Auftragsnummer schon eine Nummer
vergeben wurde oder schon existiert. Dann sollte ein Fenster kommen mit Auftragsnummer schon
vergeben.
Wie macht man das am besten? Oder
nach welchen funktionen sucht man da im Internet?
Ich habe ein Formular wo ich Daten in eine MSSQL DB schreibe.
Jetzt hätte ich gern das wenn ich in dem Feld Auftragsnummer schon eine Nummer
vergeben wurde oder schon existiert. Dann sollte ein Fenster kommen mit Auftragsnummer schon
vergeben.
Wie macht man das am besten? Oder
nach welchen funktionen sucht man da im Internet?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 172454
Url: https://administrator.de/forum/fehlermeldung-bei-einem-doppeltem-eintrag-in-mssql-mit-php-172454.html
Ausgedruckt am: 10.04.2025 um 01:04 Uhr
5 Kommentare
Neuester Kommentar
Moin helmuthelmut2000,
das ist wie im richtigen Leben eher eine Frage der Strategie und der persönlichen Vorlieben.
Grundsätzlich gibt es für dein Problem je nach Charakter des zusammenschroters die Varianten:
a) "der kleine Postbeamte" -> das Feld "Auftragsnummer" bei Eingabe eines neuen Satzes einzeln vorab eingeben lassen, sofort danach in der DB-Tabelle danach suchen und ggf eine "Diese Nummer gibt es schon!" -Meldung bringen - und das Eingeben in einer Endlosschleife, bis eine gültige nummer eingegeben wurde
b) "Versuch macht klug" -> den kompletten neuen Satz erfassen lassen und zur Datenbank schicken --> wenn von der eine Primary-Key-Constraintverletzung (also eine abprüfbare Fehlernummer) kommt --> dann halt eine Meldung "Doppelte Nummer"
c) "Bitte eine Nummer ziehen" -> Du (bzw dein Programm) ermittelt die nächste "freie" Nummer (höchste vorhandene plus 1 oder so) und zeigt sie als "nur-Lese-Feld" an.
Zu welcher Strategie würdest du denn am Ehesten neigen?
Grüße
Biber
das ist wie im richtigen Leben eher eine Frage der Strategie und der persönlichen Vorlieben.
Grundsätzlich gibt es für dein Problem je nach Charakter des zusammenschroters die Varianten:
a) "der kleine Postbeamte" -> das Feld "Auftragsnummer" bei Eingabe eines neuen Satzes einzeln vorab eingeben lassen, sofort danach in der DB-Tabelle danach suchen und ggf eine "Diese Nummer gibt es schon!" -Meldung bringen - und das Eingeben in einer Endlosschleife, bis eine gültige nummer eingegeben wurde
b) "Versuch macht klug" -> den kompletten neuen Satz erfassen lassen und zur Datenbank schicken --> wenn von der eine Primary-Key-Constraintverletzung (also eine abprüfbare Fehlernummer) kommt --> dann halt eine Meldung "Doppelte Nummer"
c) "Bitte eine Nummer ziehen" -> Du (bzw dein Programm) ermittelt die nächste "freie" Nummer (höchste vorhandene plus 1 oder so) und zeigt sie als "nur-Lese-Feld" an.
Zu welcher Strategie würdest du denn am Ehesten neigen?
Grüße
Biber
@helmuthelmut2000,
Hi,
Mal im Ernst. Ich würde die manuelle Eingabe einer Nummer durch Anwender nicht zulassen, sondern entweder die AutoWert-Funktion einer DB verwenden,
oder eine eigene Funktion schreiben, die Auftragsnummern generiert.
Siehe => Tabellen IDs validieren und generieren mit dem MODULO10-Verfahren
Das Script holt die letzte(höchste) Nummer einer Tabelle, schneidet die Prüfziffer (letzte Ziffer) ab, generiert eine neue Nummer, berechnet die
Prüfziffer und hängt diese an die neue Nummer dran. Das Textfeld, das die neue Nummer anzeigt, wird beim Laden disabled, so dass die
Nummer nicht verändert werden kann. Zusätzlich ist eine Testfunktion eingebaut: Man gibt eine Nummer ein und das Script berechnet die erwartete
Prüfziffer. Ist diese falsch, so bräuchte z.B. eine DB-Abfrage gar nicht erst gestartet werden, weil die Nummer ungültig ist.
Mehr über Prüfziffern und deren Berechnung => http://www.bundesbank.de/download/zahlungsverkehr/zv_pz200909.pdf
Viel Erfolg
Gruß
Günni
Jetzt hätte ich gern das wenn ich in dem Feld Auftragsnummer schon eine Nummer
vergeben wurde oder schon existiert. Dann sollte ein Fenster kommen mit Auftragsnummer schon
vergeben.
vergeben wurde oder schon existiert. Dann sollte ein Fenster kommen mit Auftragsnummer schon
vergeben.
Hi,
Also ich hätte gerne eine Anwendung, mit der man effizient arbeitet, und nicht eine, die Rate mal mit Rosenthal mit mir spielt.
Mal im Ernst. Ich würde die manuelle Eingabe einer Nummer durch Anwender nicht zulassen, sondern entweder die AutoWert-Funktion einer DB verwenden,
oder eine eigene Funktion schreiben, die Auftragsnummern generiert.
Siehe => Tabellen IDs validieren und generieren mit dem MODULO10-Verfahren
Das Script holt die letzte(höchste) Nummer einer Tabelle, schneidet die Prüfziffer (letzte Ziffer) ab, generiert eine neue Nummer, berechnet die
Prüfziffer und hängt diese an die neue Nummer dran. Das Textfeld, das die neue Nummer anzeigt, wird beim Laden disabled, so dass die
Nummer nicht verändert werden kann. Zusätzlich ist eine Testfunktion eingebaut: Man gibt eine Nummer ein und das Script berechnet die erwartete
Prüfziffer. Ist diese falsch, so bräuchte z.B. eine DB-Abfrage gar nicht erst gestartet werden, weil die Nummer ungültig ist.
Mehr über Prüfziffern und deren Berechnung => http://www.bundesbank.de/download/zahlungsverkehr/zv_pz200909.pdf
Viel Erfolg
Gruß
Günni
@helmuthelmut2000,
Na klar. Du sorgst dafür, dass in der entspr. Spalte nur eindeutige Werte vorkommen dürfen.
Bei MySQL z.B. "Alter table 'tabellenname' add unique 'keyname' ('spaltenname')". Für MSSQL
such also mal nach der Syntax.
Gibt die DB dann einen Fehler zurück, so kannst du eine entspr. Meldung ausgeben. Z.B. so:
Viel Erfolg
Gruß
Günni
Geht so was oder nicht?
Na klar. Du sorgst dafür, dass in der entspr. Spalte nur eindeutige Werte vorkommen dürfen.
Bei MySQL z.B. "Alter table 'tabellenname' add unique 'keyname' ('spaltenname')". Für MSSQL
such also mal nach der Syntax.
Gibt die DB dann einen Fehler zurück, so kannst du eine entspr. Meldung ausgeben. Z.B. so:
<?php
/*
* Die Funktion legt einen neuen Datensatz an.
* Bei Mißerfolg wird eine Exeption "geworfen" und false zurückgegeben.
*/
function neuer_wert($param) {
$query="insert into test2 values('$param')";
$result=@mysql_query($query);
if (!$result) {
throw new Exception("Auftragsnummer $param konnte nicht angelegt werden.");
return false;
}
return true;
}
/*
* Versuche (try) neuen Datensatz anzulegen
*/
$neu=817;
try {
if(neuer_wert($neu)){
echo "Auftragsnummer $neu wurde angelegt";
}
}
/*
* Bei Mißerfolg wird die in der Funktion erzeugte Exception ausgegeben.
*/
catch (Exception $fehler) {
echo $fehler->getMessage();
}
?>
Viel Erfolg
Gruß
Günni