Probleme bei der PHP und SQL Programmierung

ThePretender

Cadet 2nd Year
Registriert
Sep. 2008
Beiträge
26
Servus,

ich möchte für meinen kleinen Sportverein eine Tabelle mit Hilfe von PHP und SQL darstellen, so dass unser Pressewart die Änderungen einfach in einem Formular einträgt und sie gleich auf unserer Seite dargestellt werden.

Folgenden Code habe ich:

Tabelle erfolgreich wie folgt erstellt:
PHP:
<?php
require_once('db.php');

$query = mysql_query('CREATE TABLE `tabellesued`
(
	`id` int(10) NOT NULL AUTO_INCREMENT,
	`platz` varchar(128) NOT NULL,
	`mannschaft` varchar(128) NOT NULL,
	`punkte` varchar(128) NOT NULL,
	`durchgang` varchar(128) NOT NULL,
	`gesamt` varchar(128) NOT NULL,
	`durchschnitt` varchar(128) NOT NULL,
	PRIMARY KEY (`id`)
);');

echo $query ? 'Die Tabelle wurde erstellt!' : 'Die Tabelle konnte nicht erstellt werden!<br />&nbsp;&nbsp;&nbsp;'.mysql_error();
?>

Dann wollte ich einen Testeintrag machen.
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Tabelle</title>

<link rel="stylesheet" href="styls.css" type="text/css">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body>

<div id="Inhalt">
  	<div id="Überschrift">

	</div>

<?php

if(isset($_POST['button']))
{
	require_once('db.php');
	
	$query = mysql_query('INSERT INTO `tabellesued` (`platz`, `mannschaft`, `punkte`, `durchgang`, `gesamt`, `durchschnitt`) VALUES (
			"'.mysql_real_escape_string($_POST['platz']).'",
			"'.mysql_real_escape_string($_POST['mannschaft']).'",
			"'.mysql_real_escape_string($_POST['punkte']).'",
			"'.mysql_real_escape_string($_POST['durchgang']).'",
			"'.mysql_real_escape_string($_POST['gesamt']).'",
			"'.mysql_real_escape_string($_POST['durchschnitt']).'",
		)') or die(mysql_error());

	echo $query ? '<div id="Fenster"><div id="Betreff">Die Tabelle wurde aktualisiert.<meta http-equiv="refresh" content="2; URL=admin_tabelle_verwaltung.php"></div>' : '<div id="Fenster"><div id="Betreff">Die Tabelle konnte nicht aktualisiert werden.<meta http-equiv="refresh" content="2; URL=admin_tabelle_verwaltung.php"></div>';
}
else
{
?>

<div id="Fenster">
	<form method="post" action="admin_tabelle_eintragen.php?id=<?PHP echo $id; ?>">
    	<div id="Text">
		<input type="text" name="platz" value="Platz">
	</div>

    	<div id="Text">
		<input type="text" name="mannschaft" value="Mannschaft">
	</div>

    	<div id="Text">
		<input type="text" name="punkte" value="Punkte">
	</div>

    	<div id="Text">
		<input type="text" name="durchgang" value="Durchgang">
	</div>

    	<div id="Text">
		<input type="text" name="gesamt" value="Gesamt">
	</div>

    	<div id="Text">
		<input type="text" name="durchschnitt" value="Durchschnitt">
	</div>

</div>
<div id="Verwaltung">
<input type="submit" name="button" value="OK"> <input type="button" onclick="window.location.href = 'admin_tabelle_verwaltung';" value="Abbrechen">
</div>

<?php
}
?>

</div>

</body>

</html>

In der .css Datei sind nur ein paar Farben und so hinterlegt. Folgenden Fehler bekomme ich beim eintragen in die Tabelle.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 8

Ich finde weder in Zeile 8 noch bei der suche nach ')' etwas. Zumal ich den Code bereits für eine kleine News Funktion nutze und dort alles funktioniert. Habe nur kleine Teile (Spalten) entfernt und andere (Spalten) hinzugefügt.

Ich stehe gerade auf dem schlauch, vielleicht hat hier ja jemand eine Idee.

Gruß daMeier
 
ThePretender schrieb:
$query = mysql_query('INSERT INTO `tabellesued` (`platz`, `mannschaft`, `punkte`, `durchgang`, `gesamt`, `durchschnitt`) VALUES (
"'.mysql_real_escape_string($_POST['platz']).'",
"'.mysql_real_escape_string($_POST['mannschaft']).'",
"'.mysql_real_escape_string($_POST['punkte']).'",
"'.mysql_real_escape_string($_POST['durchgang']).'",
"'.mysql_real_escape_string($_POST['gesamt']).'",
"'.mysql_real_escape_string($_POST['durchschnitt']).'",
)') or die(mysql_error());
Das Problem sollte an dem rot markierten Komma liegen.
 
Zeile 8 in deinem SQL-Code! Von dem PHP-Code hat der SQL-Server doch keine Ahnung.
Code:
	"'.mysql_real_escape_string($_POST['durchschnitt']).'",
)')
Evtl. siehst du den Fehler ja gleich.
 
Hey,

gleich 2 mal die gleiche Info! Hab es nicht gesehen, wohl vor lauter Kommas den Kommawald übersehen.

Danke!

gruß
 
ThePretender schrieb:
Hab es nicht gesehen, wohl vor lauter Kommas den Kommawald übersehen.
Typisches Copy&Paste-Problem bei PHP ;-)

Überlege dir bitte, bei deinem Skript auf Prepared Statements zu wechseln. Ich weiß nicht, wie dein Code bzw. der Zugang zum Update-Formular ansonsten gesichert ist, aber so, wie er momentan ist, ist er anfällig für SQL Injection.
 
Dann wäre es wohl gut, gleich einen besseren und übersichtlicheren Stil zu finden. ;)

Bspw.:
Code:
<?php

$platz = mysql_real_escape_string( $_POST['platz'] );
$mannschaft = mysql_real_escape_string( $_POST['mannschaft'] );
$punkte = mysql_real_escape_string( $_POST['punkte'] );
$durchgang = mysql_real_escape_string( $_POST['durchgang'] );
$gesamt = mysql_real_escape_string( $_POST['gesamt'] );
$durchschnitt = mysql_real_escape_string( $_POST['durchschnitt'] );

$q = <<<SQL
INSERT INTO `tabellesued` (`platz`, `mannschaft`, `punkte`, `durchgang`, `gesamt`, `durchschnitt`)
VALUES (
'$platz',
'$mannschaft',
'$punkte',
'$durchgang',
'$gesamt',
'$durchschnitt',
)
SQL;
$q = mysql_query( $q );
Oder du liest dich am besten gleich in die PDO ein, dann hast du keine Probleme mit SQL Injections und etliche Sicherheitslücken weniger (Steuerung und Daten werden getrennt übertragen und Parameter grundsätzlich automatisch escaped.
Code:
<?php

$q = $db->prepare( <<<SQL
INSERT INTO `tabellesued` (`platz`, `mannschaft`, `punkte`, `durchgang`, `gesamt`, `durchschnitt`)
VALUES (
:platz,
:mannschaft,
:punkte,
:durchgang,
:gesamt,
:durchschnitt,
)
SQL
);
$q->bindValue( ':platz', $_POST['platz'] );
$q->bindValue( ':mannschaft', $_POST['mannschaft'] );
$q->bindValue( ':punkte', $_POST['punkte'] );
$q->bindValue( ':durchgang', $_POST['durchgang'] );
$q->bindValue( ':gesamt', $_POST['gesamt'] );
$q->bindValue( ':durchschnitt', $_POST['durchschnitt'] );
$q->execute();
 
Hey,

ein weites Problemchen. Er gibt mir nur meinen Code aus
Die News konnte nicht bearbeitet werden
. Ich weiß einfach nicht wo mein Fehler ist.

Das Formular geht auf ich kann die Daten ändern, wenn ich es dann "Abschicke" sagt er das es nicht geht.

Seht ihr mein Fehler?


PHP:
<?php 
session_start(); 
?> 
 
<?php 
if(!isset($_SESSION["benutzername"])) 
   { 
   echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"2; URL=admin_index.php\">"; 
   exit; 
   } 
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Adminbereich</title>

<link rel="stylesheet" href="styls.css" type="text/css">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body>

<div id="Inhalt">
  	<div id="Überschrift">

	</div>

<?php
require_once('db.php');

$id = (int)$_GET['id'];

if(isset($_POST['button']))
{
	$query = mysql_query('UPDATE `begegnungennord` SET
				`date` = STR_TO_DATE("'.mysql_real_escape_string($_POST['date']).'", "%d.%m.%Y"),
				`heim` = "'.mysql_real_escape_string($_POST['heim']).'",
				`gast1` = "'.mysql_real_escape_string($_POST['gast1']).'",
				`gast2` = "'.mysql_real_escape_string($_POST['gast2']).'",
				`ergebnis` = "'.mysql_real_escape_string($_POST['ergebnis']).'",
				`durchgaenge` = "'.mysql_real_escape_string($_POST['durchgaenge']).'"
				`punkte` = "'.mysql_real_escape_string($_POST['punkte']).'"
			WHERE `id` = '.$id);

	echo $query ? '<div id="Fenster"><div id="Betreff">Die News wurde bearbeitet.<meta http-equiv="refresh" content="2; URL=admin_nord_verwaltung.php"></div>' : '<div id="Fenster"><div id="Betreff">Die News konnte nicht bearbeitet werden.<meta http-equiv="refresh" content="2; URL=admin_nord_verwaltung.php"></div>';
}
else
{
	$query = mysql_query('SELECT `id`, DATE_FORMAT(`date`, "%d.%m.%Y") AS `datum`, `heim`, `gast1`, `gast2`, `ergebnis`, `durchgaenge`, `punkte` FROM `begegnungennord` WHERE `id` = '.$id.' LIMIT 1');
	$line = mysql_fetch_assoc($query);
?>

<div id="Fenster">
	<form method="post" action="admin_nord_begegnungen_bearbeiten.php?id=<?PHP echo $id; ?>">
    	<div id="Text">
		<input type="text" name="date" value="<?PHP echo $line['datum']; ?>">
	</div>

    	<div id="Text">
		<input type="text" name="heim" value="<?PHP echo $line['heim']; ?>">
	</div>

    	<div id="Text">
		<input type="text" name="gast1" value="<?PHP echo $line['gast1']; ?>">
	</div>

    	<div id="Text">
		<input type="text" name="gast2" value="<?PHP echo $line['gast2']; ?>">
	</div>

    	<div id="Text">
		<input type="text" name="ergebnis" value="<?PHP echo $line['ergebnis']; ?>">
	</div>

    	<div id="Text">
		<input type="text" name="durchgaenge" value="<?PHP echo $line['durchgaenge']; ?>">
	</div>

    	<div id="Text">
		<input type="text" name="punkte" value="<?PHP echo $line['punkte']; ?>">
	</div>
</div>
<div id="Verwaltung">
<input type="submit" name="button" value="OK"> <input type="button" onclick="window.location.href = 'admin_nord_verwaltung';" value="Abbrechen">
</div>

<?php
}
?>

</div>



</body>

</html>
 
Hallo,

um welches Datenbank-Managementsystem geht es hier?

Fröhliche Weihnachten und Grüße aus Berlin,

caro
 
Also meiner Meinung nach sind Zeilen wie $line = mysql_fetch_assoc($query); hinsichtlich dieser Frage sehr aufschlussreich...

Aber diese Codesuppe zu analysieren ist ziemlich viel Aufwand. Hier sollte erst einmal sauber zwischen Template und Programmlogik unterschieden werden.
Tja, und wenn ich hier sehe, wie oft <div id="Text"> im Code steht, dann wundert mich da kein einziger Fehler. ID... was könnte eine ID wohl sein... ach ja, genau EINDEUTIG!

Und ansonsten gilt das, was IMMER gilt: Bei jeder sich bietenden Gelegenheit sollte man Debug-Code einbauen. Ein paar print_r() oder echo hier und da haben noch niemandem geschadet, genauso wenig wie ein console.log() im JavaScript. Und auch ein Blick in die tatsächlichen Netzwerk-Aktivitäten schadet nie.
 
Zurück
Oben