PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Weiterleitung nach mysql_error()


webgoddess
28.08.2007, 14:22:40
Hallo ich habe folgendes Problem.
Ich habe eine sql Abfrage die von einem mysql_error() abgefangen wird, wenn ein doppelter Eintrag vorliegt. Das funktioniert auch.
Wenn das passiert, steht auf der Seite dann "Insert-Fehler: Duplicate entry 'k@w.de' for key 2". Ich möchte aber dass in diesem Fall wieder automatisch die Seite mit dem Startformular erscheint.
Die soll natürlich nicht erscheinen, wenn die sql-Abfrage durchgeht.

Wahrscheinlich mal wieder ganz einfach und ich seh den Baum vor lauter Wäldern nicht :-)

Gruß webgoddess

feuervogel
28.08.2007, 14:32:53
wenn du probleme mit deinem fahrrad hast, tauchst du dann auch ohne rad in der betreffenden werkstatt auf?

webgoddess
28.08.2007, 14:43:38
Ich habe die letzten 2 Stunden damit verbracht in diesem Forum nach einem ähnlichen Beitrag zu suchen, weil ich niemandem auf die Nerven gehen wollte.
Solche nichtssagenden Bemerkungen kannst du dir sparen. Sie bringen mich nicht weiter und füllen nur unnötig das Forum.
Irgendwelche konstruktiven Vorschläge? Oder kannst du vielleicht in Klartext erklären was du meinst?

z0iD
28.08.2007, 14:53:10
Der Beitrag von feuervogel ist sogar hoch konstruktiv. Was er versucht Dir diskret zu sagen ist, dass wir Dir alle nicht sagen können was da falsch läuft, wenn Du nicht Deinen Quelltext veröffentlichst. Genausowenig wie die Fahrradwerkstatt Dein Rad nicht reparieren kann, wenn Du es nicht dabei hast.

Raketenmann
28.08.2007, 15:09:48
Ich habe eine sql Abfrage die von einem mysql_error() abgefangen wird, wenn ein doppelter Eintrag vorliegt. Das funktioniert auch.


Schön, dass es funktioniert, aber wäre es nicht irgendwie cleverer, doppelte Einträge gar nicht erst entstehen zu lassen, wenn sie sowie einen Fehler auslösen?

Zu deiner Frage:
mysql_error() fängt nix ab, sondern gibt etwas aus. Der Programmteil in dem sich mysql_error() befindet, fängt etwas ab und kann somit auch irgendwas anderes machen als den Fehler auszugeben...

webgoddess
28.08.2007, 15:19:17
Na wenn's nur das ist... warum sagt er das denn nicht. Ich dachte dass Weiterleitung von php-Seiten nach sql error eine Standardanwendung ist. Bin mir nicht sicher, ob mein Quelltext hier weiterhilft. Aber hier isser:
$eingabefehler = false;
$author = $_POST["author_add"];
$name = $_POST["name"];
$email = $_POST["email"];
$password = $_POST["password"];
$password2 = $_POST["password2"];

if(isset($author)){
include('account_add.php');
}

echo <<<HTMLCODE
<h3>Neuen Familienaccount erstellen</h3>
<form action="$PHP_SELF" method="POST">
<input type="hidden" name="author_add" value="1">
<table border="0" width="600">
<tr>
<td width="25%" align="left">Familienname:&nbsp;</td>
<td width="75%"><input type="text" name="name" value="$name" size="20" maxlength="100"></td>
</tr>
<tr>
<td width="25%" align="left">Email:&nbsp;</td>
<td width="75%"><input type="text" name="email" value="$email" size="20" maxlength="50">
</td>
</tr>
<tr>
<td width="25%" align="left">Passwort:&nbsp;</td>
<td width="75%"><input type="password" name="password" value="$password" size="20" maxlength="20">
</td>
</tr>
<td width="25%" align="left">Passwort wiederholen:&nbsp;</td>
<td width="75%"><input type="password" name="password2" value="$password2" size="20" maxlength="20">
</td>
</tr>
<td width="25%" align="right">&nbsp;</td>
<td width="75%"><input type="submit" name="submit" value="Account anlegen">
</td>
</tr>
</table>
</form>;
Das ist die Datei mit dem Formular. Wenn das Formular abgeschickt wird, und author gesetzt ist, wird account_add.php aufgerufen.

Die siht so aus
//vorher sind Abfragen leere Felder usw. Wenn alles ausgefüllt ist kommt
if($eingabefehler == false)
{
$name = htmlentities($name);
$email = htmlentities($email);
$password = htmlentities($password);
$sql = "INSERT INTO familie VALUES (0, '$name', '$email', '$password')";
mysql_query($sql) or die ("Insert-Fehler: " . mysql_error());
unset($author_add, $name, $email, $password, $password2);
echo "<meta http-equiv='refresh' content='1;URL=member_new.php?name=$name'>";
}

Funktioniert auch einwandfrei. Wenn aber die übergebene Email schon in DB vorhanden ist (Feld ist Unique) bekomme ich die Fehlermeldung:
Insert-Fehler: Duplicate entry 'k@w.de' for key 2
Das ist auch noch richtig.
Jetzt das Problem. Ich möchte nicht dass der User, dem das passiert auf der Seite mit der Fehlermeldung hängen bleibt, sondern dass die Seite nach Erscheinen der Fehlermeldung wieder zurück auf die Formularseite umgeleitet wird.
Hoffe ich konnte das einigermaßen erklären.
Gibt's da irgendein Standardbefehl in PHP oder Mysql? Ich kenne leider keinen.
Gruß webgoddess

webgoddess
28.08.2007, 15:25:06
Hallo Raketenmann,
du hast mich auf die Idee gebracht. Hatte mich total in dem mysl_error verrannt.
Ich werde mal ausprobieren das vorher auszuschließen. Falls ich dort nicht weiterkomme melde ich mich nochmal.
Danke für den Hinweis.
webgoddess

webgoddess
28.08.2007, 15:39:16
... wäre es nicht irgendwie cleverer, doppelte Einträge gar nicht erst entstehen zu lassen, wenn sie sowie einen Fehler auslösen?


Spitze, funktioniert. Hätte ich auch selber drauf kommen können.
Trotzdem würde mich nochmal interessieren, ob ich nach "or die" wenn es denn passiert sagen kann wenn "die" dann mach dies, oder so ähnlich?

Für die die es interessiert, wie ich mein Problem gelöst habe:

$sql = "SELECT * FROM familie";
$result = mysql_query($sql) or die ("Select-Fehler: " . mysql_error());
$row = mysql_fetch_array($result);
while($row = mysql_fetch_array($result))
{
if ($row[email] == $email)
{
echo "Email ist schon in der Datenbank vorhanden<br>";
$eingabefehler = true;
}
}



Danke nochmal,
webgoddess

z0iD
28.08.2007, 15:39:33
Dein Quelltext (der zweite) hilft hier ungemein. Du beendest das Skript ja abrupt mit einem die();. Da ist es klar, dass die Seite unverändert bleibt. Zur Lösung bleiben Dir zwei Möglichkeiten (auch wenn die erste stümperhaft ist, soll sie der Vollständigkeit halber erwähnt werden);
Mgk 1: Eine HTML Seite mit der Fehlermeldung im <body> ausliefern. In einem <meta> einstellen, dass nach einer bestimmten Zeit zum Formular zurückgesprungen wird.
Mgk 2: Mit einem header('Location: bla.php?errormsg='.$fehler); zur Formularseite zurückkehren und erst dort die Fehlermeldung ausgeben.

Möglichkeit 1 ist allein schon aus Gründen der Barrierefreiheit (http://de.wikipedia.org/wiki/Barrierefreiheit) nicht zu empfehlen. Woher willst Du wissen wie lange Dein Besucher zum lesen braucht? Allgemein ist von dem allseits beliebten "refresh" Befehl im <meta> Element abzuraten. Nicht nur, dass er total nervig ist, nein, er zerstört den Zurückknopf des Browsers was zu erheblicher Verwirrung des Benutzers führen kann.

webgoddess
28.08.2007, 15:47:59
Hi z0iD,

tschuldigung dass ich so blöd frage, aber wie schreibe ich das denn?
Statt
mysql_query($sql) or die ("Insert-Fehler: " . mysql_error());
einfach
mysql_query($sql) or header('Location: bla.php?errormsg='.$fehler); ?
Und wo kriege ich $fehler her?

z0iD
28.08.2007, 16:02:09
Naja $fehler ist ja die Zeichenkette die Du als Fehlermeldung anzeigen willst. Also in Deinem Falle das mysql_error(). Ansonsten müsste der Ausdruck den Du da formuliert hast hinhauen falls Du vorher kein einzies Byte gesendet hast.

z0iD
28.08.2007, 16:13:45
Nachtrag;
An die Fehlermeldung kommst Du dann mit htmlentities($_GET['errormsg']).

Allerdings ist natürlich der Nachteil dieser Lösung, dass ein gescheiter Benutzer in die Adressleiste eigene Zeichenketten schreiben kann, die Deine Seite dann ausgibt. Das hat zwar keine sicherheitsrelevanten Nachteile, könnte aber seltsam wirken. Solche Dinge lassen Seiten für Nutzer unsicher erscheinen.
Eine Lösung könnte sein die Daten per POST zu übertragen (da weiß ich derzeit nicht auswendig wie das auf HTTP Ebene funktioniert) oder ganz abgefahren: per SESSION. Das ist dann aber schon die Kür :)

Raketenmann
28.08.2007, 22:45:26
Für die die es interessiert, wie ich mein Problem gelöst habe:


Noch ein bißchen schöner gelöst, wäre es aber so


$sql = "SELECT * FROM familie WHERE email='$email'";
$result = mysql_query($sql) or die ("Select-Fehler: " . mysql_error());
if (mysql_num_rows($result)>0)
{
echo "Email ist schon in der Datenbank vorhanden<br>";
$eingabefehler = true;
}



So sparst du es dir, immer die ganze Familie mit einer Schleife durchzulaufen, nur weil du eine Emailadresse vergleichen willst. Naja und dann halt die Fehlerausgabe hinzufügen, die du mit z0iD diskutierst.

Habe ich grad Familie geschrieben? ...scheint ja ne große Familie zu sein, wenn man da doppelte Emailadressen abfangen muß! ;-)
Kelly Family? Mafia?

webgoddess
29.08.2007, 11:04:57
Hi Raketenmann,

deine Lösung ist in der Tat viel schöner *vor den Kopf schlag* und funktioniert einwandfrei :-)
Danke auch nochmal an dich. Von euch kann man so viel lernen. Das ist toll!

Jetzt hab ich gerade noch ein Problem mit htmlentities aber dafür mache ich lieber einen neuen Fred auf.

Aber jetzt wo du's sagst - gut dass ich nicht aus Duisburg komme. Da könnte man ja auf komische Gedanken kommen ;-)

Gruß webgoddess