| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

19-10-2008, 13:12
|
|
fritzje610
Registrierter Benutzer
|
|
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 311
|
|
doppelte Datensätze unterbinden
Hallo zusammen,
ich lasse den User über mehrere Seiten Daten eingeben, um diese dann am Ende gesammelt in verschiedene Tabellen zu schreiben.
Dieses schreiben soll aber nur einmal möglich sein, sprich der Reloadbutton des Browsers soll ignoriert werden, da bei dem schreiben eine eindeutige Nummer erzeugt wird.
Momentan wird bei jedem aktualisieren im Browser um eins erhöht und geschrieben. Mein Gedanke war es, über den SQL-FEhler 1062 das abzufanken, aber das haut gar nicht hin. Wie mache ich das am beten??? Hab schon nach reloadsperre gesucht. Da bin ich aber nicht wirklich fündig geworden. Hier das Script dazu:
PHP-Code:
require_once($root . "/functions/db_connection.php");
$letzte_au_nr = "";
$error = array();
$query = "SELECT * FROM auftraege ORDER BY au_nr DESC LIMIT 1";
$result = mysql_query($query);
if (!$result)
{
die ('Ungültige Abfrage: ' . mysql_error());
}
while($row = mysql_fetch_assoc($result))
{
$letzte_au_nr = $row['au_nr'];
}
$query = "INSERT INTO auftraege SET au_nr='" . $neue_au_nr ."'";
$result = mysql_query($query);
if (!$result)
{
if(mysql_errno() == 1062)
{
array_push($error, "AU-Nr schon vorhanden");
}
else
{
die ('Ungültige Abfrage: ' . mysql_error());
}
}
$neue_au_nr = $letzte_au_nr + 1;
if(count($error) == 0)
{
....Hier kommen die ganzen INSERT INTO .....
}
else
{
echo "<div id='fehler'>";
if (isset($error) && count($error) > 0) //Prüfen ob array $error da ist UND ob es einen Eintrag hat.
{
for ($i=0; $i < count($error); $i++) //Ausgabe aller Einträge des Arrays $error
{
echo $error[$i] . "<br />";
}
}
echo "</div>";
}
Über Hilfe und Unterstützung würde ich mich freuen
Gruß
Michael
__________________
Gruß
Michael
|

19-10-2008, 13:56
|
|
mcmurphy
PHP Junior
|
|
Registriert seit: Aug 2003
Ort: Berlin
Beiträge: 888
|
|
Zitat:
|
Hab schon nach reloadsperre gesucht.
|
http://www.contentmanager.de/magazin...erhindern.html
Vielleicht hilft dir das
__________________
"I don't want to belong to any club that would accept me as a member."
Groucho Marx
|

19-10-2008, 14:10
|
|
Griecherus
PHP Senior
|
|
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
|
|
Hm, also nur dafür eine Klasse finde ich etwas oversized. Das Prinzip, das dahinter steckt, soll dabei nicht kritisiert sein.
|

19-10-2008, 18:10
|
|
fritzje610
Registrierter Benutzer
|
|
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 311
|
|
Hmm, dass ist wirklich etwas zu dick aufgetragen. Das geht doch auch sicherlich einfacher/anders.
Ich hab zwar jetzt die Kiste ein paar Stunden aus gehabt, aber irgendwie keine neuen Ansätze entwickeln können.
Wie kann ich das am besten lösen, zumal ich kein form habe. D.h. sobald das Script startet muss geprüft werden, ob es den Satz schon gibt und wenn nein eintragen (Script wird von der vorigen Seite aufegerufen so wie es sein soll) , ansonsten eine Fehlermeldung in das error-array pushen (Reload-Fall)
Danke und Gruß
Michael
__________________
Gruß
Michael
|

19-10-2008, 18:20
|
|
Blackgreetz
PHP Junior
|
|
Registriert seit: Oct 2005
Beiträge: 901
|
|
Bis auf die Tatsache, dass du $neue_au_nr erst nach der Benutzung definierst, sieht es für mich danach aus, als ob dein feld au_nr unique sein müsste. Klick
Dann könntest du das zumindest überprüfen.
Ansonsten empfielt sich für sowas immer der Typ "primary Key" mit "auto_increment".. Dann brauchst du nicht die letzte Abfragen..
mfg
|

19-10-2008, 18:37
|
|
fritzje610
Registrierter Benutzer
|
|
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 311
|
|
Das Feld au-nr ist unique und in en entsprechenden Tabellen gibt es jeweils ein Feld id, das den primärKey bildet und auto_increment ist.
Die id kann ich aber nicht als au_nr heranziehen, denn sollte mal ein Satz gelöscht werden, stimmt die Reihenfolde der au_nr nicht mehr.
Deshalb muss diese von Hand, sprich vom Script, erzeugt werden.
Gruß
Michael
__________________
Gruß
Michael
|

19-10-2008, 18:48
|
|
Blackgreetz
PHP Junior
|
|
Registriert seit: Oct 2005
Beiträge: 901
|
|
Zitat:
|
Die id kann ich aber nicht als au_nr heranziehen, denn sollte mal ein Satz gelöscht werden, stimmt die Reihenfolde der au_nr nicht mehr.
|
Da du ID ja Auto_increment gesetzt hast, wird weiter gezählt. Löscht du einen, entsteht eine Lücke in der ID-Reihenfolge, aber sie wird nicht aufgefüllt. (soweit ich weiß)
mfg
|

19-10-2008, 19:25
|
|
fritzje610
Registrierter Benutzer
|
|
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 311
|
|
Wie dem auch immer sein mag (ich glaub Du hast recht, ich war da jetzt falsch), aber wie kann ich das unter den gegebenen Voraussetzungen angehen ?
Gruß
Michael
__________________
Gruß
Michael
|

19-10-2008, 19:53
|
|
Blackgreetz
PHP Junior
|
|
Registriert seit: Oct 2005
Beiträge: 901
|
|
Da ist deine Methode schon recht sinnvoll..
Also gucken, ob bei unique ne Dopplung auftritt und Fehler abfangen.
mfg
|

19-10-2008, 19:56
|
|
fritzje610
Registrierter Benutzer
|
|
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 311
|
|
Ich kümmere mich morgen weiter drum. Heute gönne ich mir einen freien Abend.
Gruß
Michael
__________________
Gruß
Michael
|

20-10-2008, 08:48
|
|
fritzje610
Registrierter Benutzer
|
|
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 311
|
|
Guten Morgen,
was so ein freier Abend doch bewirkt. Heute morgen kam mir dann die Eingebung wie ich das ganz einfach lösen kann. Und zwar so:
PHP-Code:
if(isset($_SESSION['is_saved']) && $_SESSION['is_saved'] == "gespeichert")
{
array_push($error, "Datensatz wurde bereits gespeichert");
}
else
{
$query = "SELECT * FROM auftraege ORDER BY au_nr DESC LIMIT 1";
$result = mysql_query($query);
if (!$result)
{
die ('Ungültige Abfrage: ' . mysql_error());
}
while($row = mysql_fetch_assoc($result))
{
$letzte_au_nr = $row['au_nr'];
}
$neue_au_nr = $letzte_au_nr + 1;
}
if(count($error) == 0)
{
$_SESSION['is_saved'] = "gespeichert";
... alle Querys werden ausgeführt ...
}
else
{
echo "<div id='fehler'>";
if (isset($error) && count($error) > 0) //Prüfen ob array $error da ist UND ob es einen Eintrag hat.
{
for ($i=0; $i < count($error); $i++) //Ausgabe aller Einträge des Arrays $error
{
echo $error[$i] . "<br />";
}
}
echo "</div>";
}
Wenn die Session-Variable gesetzt ist, sind die querys bereits durchgeführt worden. Beim Reload wird in der ersten if geprüft, ob die Session-Variable gesetzt ist. Sollte dem so sein, wird ins array gepusht und somit kann nicht mehr neu in die Tabellen geschrieben werden.
Ist die Variable nicht gesetzt, wird eine neue au_nr erzeugt und die querys werden durchgeführt.
Gruß
Michael
__________________
Gruß
Michael
|

20-10-2008, 13:07
|
|
Griecherus
PHP Senior
|
|
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
|
|
Noch ein kleiner Hinweis zur Optimierung:
Zitat:
PHP-Manual:
Note: If you use array_push() to add one element to the array it's better to use $array[] = because in that way there is no overhead of calling a function.
|
Grüße
Geändert von Griecherus (20-10-2008 um 13:18 Uhr)
|

20-10-2008, 13:13
|
|
fritzje610
Registrierter Benutzer
|
|
Registriert seit: Mar 2004
Ort: Nahe der schönen Loreley
Beiträge: 311
|
|
Ok, wird noch nachgerüstet. Danke !
gruß
Michael
__________________
Gruß
Michael
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|