3.4k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Seit mehreren Stunden beschäftige ich mich nun damit - leider ohne Erfolg. Wenn ich gemäss diesem Tutorial www.traum-projekt.com/forum/73-workshops-und-tutorials/103272-tutorial-formulare-verarbeiten-php-mysql.html vorgehe, kann ich keine Daten in die Tabelle schreiben.

Ich gehe folgend vor:

1. Ich erstelle die Tabelle mit

CREATE TABLE `rs_sort` (
`id` INT( 7 ) NOT NULL AUTO_INCREMENT ,
`artikel` VARCHAR( 50 ) NOT NULL ,
`preis` VARCHAR( 20 ) NOT NULL ,
`menge` VARCHAR( 20 ) NOT NULL ,
`einheit` VARCHAR( 20 ) NOT NULL ,
`kategorie` VARCHAR( 20 ) NOT NULL ,
`alter` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = MYISAM


2. passe ich das Formular (folgend) an



<?php
$db_host = "localhost";
$db_user = "web***";
$db_pass = "******";
$db_name = "usr_web***_*";

if (isset( $_POST['eintragen'] ))
{
// Maskierende Slashes aus POST entfernen
$_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;

// Inhalte der Felder aus POST holen
$artikel = $_POST['artikel'];
$preis = $_POST['preis'];
$menge = $_POST['menge'];
$einheit = $_POST['einheit'];
$kategorie = $_POST['kategorie'];
$alter = $_POST['alter'];

/* ************************************************************************************************ */
/* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
/* ************************************************************************************************ */

// Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
// Verbindung oeffnen und Datenbank ausweahlen
$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
mysql_select_db( $db_name, $conID );
}

// Anfrage zusammenstellen der an die DB geschickt werden soll
$sql = "INSERT INTO `rs_sort`
(`artikel`, `preis`, `menge`, `einheit`, `kategorie`, `alter`)
VALUES(
'" .mysql_real_escape_string( $artikel ). "',
'" .mysql_real_escape_string( $preis ). "',
'" .mysql_real_escape_string( $menge ). "',
'" .mysql_real_escape_string( $einheit ). "',
'" .mysql_real_escape_string( $kategorie ). "',
'" .mysql_real_escape_string( $alter ). "',
)";
// Schickt die Anfrage an die DB und schreibt die Daten in die Tabelle
mysql_query( $sql );
// Pruefen ob der neue Datensatz tatsaechlich eingefuegt wurde
if (mysql_affected_rows() == 1)
{
echo "<h3>Der Datensatz wurde hinzugefügt!</h3>";
// Hier kann weiterer Code stehen der ausgefuehrt werden soll
// wenn ein Eintrag erfolgreich war. z.B. Email an den Admin schicken
// der ueber den neuen Eintrag informiert
}
else
{
echo "<h3>Der Datensatz konnte <strong>nicht</strong> hinzugefügt werden!</h3>";
// Hier koennen Massnahmen ergriffen werden die ueber den Misserfolg informieren
// wie z.B. den Benutzer darueber zu informieren, dem Admin eine Mail schicken
// damit er sich um den Fehler kuemmern kann, etc pp
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formularinhalt in eine Datenbank schreiben</title>
</head>

<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="formular" id="formular">
Vorname: <input type="text" name="artikel" id="artikel" /><br />
Vorname: <input type="text" name="preis" id="preis" /><br />
Vorname: <input type="text" name="menge" id="menge" /><br />
Vorname: <input type="text" name="einheit" id="einheit" /><br />
Vorname: <input type="text" name="kategorie" id="kategorie" /><br />
Vorname: <input type="text" name="alter" id="alter" /><br />
<input type="submit" name="eintragen" id="eintragen" value="Abschicken" />
</form>
</body>
</html>


Nur geht dies überhaupt nicht. Ich kann keine Daten in die Tabelle schreiben. Hat jemand eine Idee, WOOO ich den Fehler mache?

8 Antworten

0 Punkte
Beantwortet von Experte (6.4k Punkte)
auf jeden Fall würde ich erstmal die Akzent-Zeichen gegen einfache Anführungszeichen austauschen... ` -> '
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
auf jeden Fall würde ich erstmal die Akzent-Zeichen gegen einfache Anführungszeichen austauschen... ` -> '
Das wäre fatal! So wie jetzt ist es nachwievor korrekt.

Nur geht dies überhaupt nicht.
Präziser hätte die Fehlerbeschreibung nicht sein können.

Zunächst mal prüft dein Skript lediglich, ob Datensätze eingefügt wurden oder nicht. Auf etwaige Fehler wird überhaupt nicht geachtet. Ersetze...
mysql_query( $sql );
...mit...
mysql_query( $sql ) or die( "Kommandofehler:\n$sql\n\n". mysql_error() );


Damit sollte sich der erste Fehler offenbahren.
0 Punkte
Beantwortet von Experte (6.4k Punkte)
sorry für meinen Quatsch :-(

@son_quatsch

Zitat:
auf jeden Fall würde ich erstmal die Akzent-Zeichen gegen einfache Anführungszeichen austauschen... ` -> '

> Das wäre fatal! So wie jetzt ist es nachwievor korrekt.

Kannst Du das vielleicht in 1-3 Sätzen erläutern?
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
dev.mysql.com/doc/refman/5.5/en/identifiers.html
An identifier may be quoted or unquoted. ...

The identifier quote character is the backtick (“`”):

dev.mysql.com/doc/refman/5.5/en/string-syntax.html
A string is a sequence of bytes or characters, enclosed within either single quote (“'”) or double quote (“"”) characters.


Beides zusammen beißt sich: einen Objektnamen (z.B. Tabelle- oder Spaltenname) kann nicht in Hochkommas stehen - dann wäre es ein Literal. Das hat mittlere bis gravierende Konsequenzen:
SELECT 'spalte' FROM tabelle;
...zeigt nicht etwa den Spalteninhalt an, sondern das Literal spalte selbst.

SELECT spalte FROM 'tabelle';
...führt zu einem Fehler, da an gegebener Stelle kein Text erwartet wird. Und tabelle ist ein Text.
0 Punkte
Beantwortet von Experte (6.4k Punkte)
okay, danke.
Dass der Bezeichner nicht im Hochkomma stehen sollte leuchtet mir ein (im nachhinein), aber da ich Bezeichner auch bisher immer unquoted benutzt habe war mir das mit dem backtick neu... oder ich habe es verwechselt mit doppelten Anführungszeichen für den Fall, dass der SQL-Server im ANSI-Modus läuft.

Danke nochmal.
0 Punkte
Beantwortet von
UI - soviele Antworten. Ich danke euch schon einmal im Voraus.

Ich bekomme nun, nachdem ich
SELECT 'spalte' FROM tabelle;
in
mysql_query( $sql ) or die( "Kommandofehler:\n$sql\n\n". mysql_error() );
geändert habe, folgenden Kommandofehler:

INSERT INTO `rs_sort` (`artikel`, `preis`, `menge`, `einheit`, `kategorie`, `alter`) VALUES( 'Cola', '5', '3', 'dl', 'Kalte Getränke', 'Keine', ) 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 10


Wo liegt nun das Problem? Beim googlen finde ich mehrere Ansätze; einerseits der CHMOD, welcher nicht richtig gestellt sein soll (was ich mir nicht vorstellen kann), andererseits ein falsch gesetztes Default beim SQL-Ausführen (habe ich gar nicht gesetzt).
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
check the ... syntax to use near ')'
...sagt dir, dass ab oder vor Klammer zu ein Fehler auftrat im Kommando. Und das ist das letzte Komma in deinem Kommando.

Folgerichtig müsste
$sql = "INSERT INTO `rs_sort`
(`artikel`, `preis`, `menge`, `einheit`, `kategorie`, `alter`)
VALUES(
'" .mysql_real_escape_string( $artikel ). "',
'" .mysql_real_escape_string( $preis ). "',
'" .mysql_real_escape_string( $menge ). "',
'" .mysql_real_escape_string( $einheit ). "',
'" .mysql_real_escape_string( $kategorie ). "',
'" .mysql_real_escape_string( $alter ). "',
)";
...abgeändert werden, wobei ich eine alternative Schreibweise vorschlage, bei der Zeichen am Anfang der Zeile verwendet werden um exakt solche Flüchtigkeitsfehler zu vermeiden:
$sql= "INSERT
INTO `rs_sort`( `artikel`, `preis`, `menge`, `einheit`, `kategorie`, `alter` )
VALUES( '" .mysql_real_escape_string( $artikel ). "'
, '" .mysql_real_escape_string( $preis ). "'
, '" .mysql_real_escape_string( $menge ). "'
, '" .mysql_real_escape_string( $einheit ). "'
, '" .mysql_real_escape_string( $kategorie ). "'
, '" .mysql_real_escape_string( $alter ). "'
)";
0 Punkte
Beantwortet von
Und alles "nur", wegen einem kleinen, schwarzen Strichen, welches sich auf meinem Bildschirm befindet.

Aber ich danke dir viel mals. Nicht nur für die Lösung, sondern auch für den durchaus guten Tipp i.S. Schreibweise.
Ich werde mir dies merken.

Liebe Grüsse aus der Schweiz
axefg
...