Ich versuche grad mit MySQL und PHP etwas zu programmieren. Und zwar gibt es ein Formular, über das man sich einschreiben kann, die Informationen werden dann in der Datenbank gespeichert.
Es handelt sich um “Pferdeturniere” und das Formular (und die datenbank) haben die Felder Pferd, Disziplin, Reiter und Hof. Ich möchte nun, dass nicht mehr als 20 Leute pro Disziplin mitmachen können. Dazu möchte ich ne if Schleife einbauen, die checkt, wieviele Zeilen es mit der Disziplin mit der Variablen $disziplin gibt.
Das ganze funktioniert aber leider nicht und ich weiss nicht wo der Fehler ist. Kann man überhaupt eine if Schleife in eine if Schleife einbauen??!?
Hier ist der Code:
$reiter = $_POST["reiter"];
$pferd = $_POST["pferd"];
$hof = $_POST["hof"];
$disziplin = $_POST["disziplin"];
$eintrag = "INSERT INTO turnier1 (reiter, pferd, hof, disziplin) VALUES ('$reiter', '$pferd', '$hof', '$disziplin')";
$eintragen = mysql_query($eintrag);
$maximaleteilnehmer = mysql_query("SELECT COUNT(*) AS maximal FROM turnier1 WHERE Disziplin = $disziplin");
$maximal = mysql_result($maximaleteilnehmer, 0, "maximal");
if($maximal == 20)
{
echo "Die maximale Anzahl $maximal von Startern wurde erreicht. Melde dich das nächste Mal früher an, dann hat es Platz für dich! <a href=\"http://fuerstenstein.bplaced.net/Turniere/1.php\">Zurück</a>";
}
else
{
if($eintragen == true)
{
echo "Dein Pferd <b>$pferd</b> wurde beim Turnier erfolgreich genannt. <a href=\"http://fuerstenstein.bplaced.net/Turniere/1.php\">Zurück</a>";
}
else
{
echo "Fehler beim Eintragen deines Pferdes. <a href=\"http://fuerstenstein.bplaced.net/Turniere/1.php\">Zurück</a>";
}
}
Ich wäre echt froh, wenn mir jemand einen Tipp geben könnte
Was heißt „funktioniert nicht“? Hast du überprüft, ob die MySQL-Abfragen funktionieren?
In der If-Expression überprüfst du, ob $maximal genau zwanzig ist - solltest du nicht überprüfen, ob $maximal größer als 20 ist, nachdem du den neuen Eintrag bei ausgebuchten Startpläzen nicht zu löschen scheinst.
Obligatorisches Dingens: Ungeprüft/ungefilterte Eingaben in einer Datenbankabfrage zu verwenden erlaubt SQL-Injections und befördert deine Seite beizeiten mal ins Jenseits.
also an deinem geposteten Codeauszug liegt der Fehler nicht – den habe ich getestet. Übergibst du die Formulardaten sauber? Steht die Verbindung zur Datenbank überhaupt?
Hier ist das Formular:
[code]
Turnier
Reiter
Pferd
Hof
Disziplin
[/code]
Und hier die Logik:
[code]
Turnier
<?
$user='Ximena';
$paswd='ximi';
$con_mysql = mysql_connect("IP", $user, $paswd) or die ("Verbindung zum Datenbankserver fehlgeschlagen!");
mysql_select_db("horses") or die ("Auswahl der Datenbank fehlgeschlagen!");
$reiter = $_POST["reiter"];
$pferd = $_POST["pferd"];
$hof = $_POST["hof"];
$disziplin = $_POST["disziplin"];
$eintrag = "INSERT INTO turnier1 (reiter, pferd, hof, disziplin) VALUES ('$reiter', '$pferd', '$hof', '$disziplin')";
$eintragen = mysql_query($eintrag);
$maximaleteilnehmer = mysql_query("SELECT COUNT(*) AS maximal FROM turnier1 WHERE Disziplin = $disziplin");
$maximal = mysql_result($maximaleteilnehmer, 0, "maximal");
if($maximal == 20)
{
echo "Die maximale Anzahl $maximal von Startern wurde erreicht. Melde dich das nächste Mal früher an, dann hat es Platz für dich! <a href='index.php'>Zurück</a>";
}
else
{
if($eintragen == true)
{
echo "Dein Pferd <b>$pferd</b> wurde beim Turnier erfolgreich genannt. <a href='index.php'>Zurück</a>";
}
else
{
echo "Fehler beim Eintragen deines Pferdes. <a href='index.php'>Zurück</a>";
}
}
?>
</div>
[/code]
Macht eigentlich alles, was du bezweckst. Mgier hat dich bereits auf den Logikfehler mit der 20 hingewiesen.
Ein Tipp von mir noch: Wenn du eh neu anfängst, dann schau dir bitte PDO an, mysql wird in zukünftigen PHP-Versionen nicht mehr unterstützt.
Ahhh… Ich sollte abfragen ob es grösser als 20 ist und wenn ja muss ich den Eintrag löschen! Was ist genau der Befehl zum löschen eines Eintrags?
[quote]Obligatorisches Dingens: Ungeprüft/ungefilterte Eingaben in einer Datenbankabfrage zu verwenden erlaubt SQL-Injections und befördert deine Seite beizeiten mal ins Jenseits.
[/quote]
Was ist damit gemeint? Das verstehe ich nicht ganz…
Ja, ich stelle vorher eine Verbindung her und wenn ich die äussere if Selektion (:D) weglasse funktioniert es auch super!
Okay wird das auch von bplaced unterstützt?
Danke nochmal für eure Hilfe und ich wäre froh, wenn ihr nochmals helfen könntet
Liebe Grüsse Ximi
Aber vermutlich wird’s daran liegen, dass die Query davor fehlgeschlagen ist – kein Wunder, $disziplin enthält ja vermutlich nicht nur Ziffern, aber die Hochkommata fehlen.
Davon abgesehen ist die Logik natürlich verkehrt herum – du machst erst mal den Eintrag, und gibst danach ggf. die Meldung aus, dass die maximale Teilnehmerzahl erreicht wurde … und was passiert beim nächsten Benutzer, der das Formular abschickt? Genau, du machst erst mal wieder einen neuen Eintrag, und prüfst wenn überhaupt danach erst …
Danach den Eintrag wieder löschen zu wollen, ist unsinnig. Wenn die maximale Teilnehmerzahl schon erreicht ist, sollte erst gar kein neuer Eintrag möglich sein.
und auf line 16 steht: [quote]$maximal = mysql_result($maximaleteilnehmer, 0, „maximal“);
[/quote]
Eigentlich sollte $dsiziplin nur E Dressur, A Dressur, L Dressur, M Dressur oder S Dressur beinhalten. Im Formular gibt es auch nur diese Auswahl! Wo fehlen die Hochkommata?
Das heisst ich muss erst mit if schauen, ob überhaupt ein Eintrag möglich ist und dann muss ich ihn entweder zulassen und eintragen lassen. Meinst du das so?
Na die Datenbank-Abfrage die du machen willst … SQL ist die Sprache, in der man mit der Datenbank spricht – so viel Grundwissen solltest du aber wenigstens mitbringen, wenn du damit arbeiten willst.
Natürlich weiss ich dass das die Sprache ist. Aber deine Aussage bedeutet dann “Deiner Sprache fehlen die Hochkommata” und ich möchte wissen wo genau! Bei einem Wort? Überall? In einer Zeile?!?!?
Nicht nur weil ich keine Ahnung von Datenbanken habe, würde ich dazu raten, das Problem in
zwei Teile zu separieren.
Erstmal den Datenbankkram ausklammern und gucken, was geht oder auch nicht, wenn man die
von dort stammenden Werte provisiorisch explizit angibt.
Wenn man sich so überzeugt hat, daß man bei bei der if-Konstruktion wirklich das hingeschrieben
hat, was man erreichen will, kann man ja damit beginnen, Daten aus der Datenbank zu nehmen,
beziehungsweise eventuell erstmal mit einem Testskript ermitteln, was man da wirklich drinstehen
hat oder was man da ein- und ausliest und ob das wie beabsichtigt funktioniert.
So kann man solche Probleme meist in kleinere, besser überschaubare Teilprobleme separieren,
wo man dann den Fehler oder das Problem einfacher lokalisieren kann.
hm ja das klingt nach einer sehr vernünftigen vorgehensweise! dann werde ich mich demnächst ans schritt für schritt machen und wie schon gesagt, wenn ich die äussere if konstruktion weglasse, dann funktionierts soweit
Also, ich hab mich nochmals dran gesetzt und jetzt funktioniert das ganze. Ich habe die if-Konstruktionen umgekehrt, damit es mehr Sinn gibt und der Fehler, den es mir im Skript ausgegeben hat, war das Fehlen eines Hochkommas!
Hier ist der nun funktionierende Code und markiert (mit nem Pfeil) der Fehler! (für alle die diesen Beitrag vielleicht googeln xD)
Ganz liebe Grüsse
Ximi
[code]<?php
$verbindung = mysql_connect("***", “***” , “***”)
or die(“Verbindung zur Datenbank konnte nicht hergestellt werden”);
mysql_select_db("***") or die (“Datenbank konnte nicht ausgewählt werden”);
$teilnehmer = mysql_query(“SELECT COUNT(*) AS maximal FROM turnier1 WHERE Disziplin = '$disziplin '”); <====== HIER SIND DIE ZWEI FEHLENDEN EINZEL-HOCHKOMMATA
$maximal = mysql_result($teilnehmer, 0, “maximal”);
if($maximal >=10)
{
echo “Die maximale Anzahl $maximal an Startern wurde erreicht. Melde dich das nächste Mal früher an, dann hat es Platz für dich! <a href=“http://fuerstenstein.bplaced.net/Turniere/1.php”>Zurück”;
exit;
}
else
{
$eintrag = “INSERT INTO turnier1 (reiter, pferd, hof, disziplin) VALUES (’$reiter’, ‘$pferd’, ‘$hof’, ‘$disziplin’)”;
$eintragen = mysql_query($eintrag);
if($eintragen == true)
{
echo "Dein Pferd <b>$pferd</b> wurde beim Turnier erfolgreich genannt. <a href=\"http://fuerstenstein.bplaced.net/Turniere/1.php\">Zurück</a>";
}
else
{
echo "Fehler beim Eintragen deines Pferdes. <a href=\"http://fuerstenstein.bplaced.net/Turniere/1.php\">Zurück</a>";
}
}