MySQL Datensätze einfügen per PHP

Hi Leute,

Hab ein kleines Problem: Möchte mich in PHP und MySQL etwas weiterbilden bzw. es mal richtig einsetzen. Nun hab ich aber schon ein problem: Hab auf stevereeno.bplaced.com/PHP/MySQL/ ein PHP-Script erstellt, welches die Datensätze in eine MySQL Tabelle schreiben sollen. Das Script sieht folgendermassen aus:

[code]<?php

$connect = mysql_connect( “localhost”, “*", "” );

if ( ! $connect )
die( “Verbindung fehlgeschlagen!” );

mysql_select_db( “Gaestebuch”, $connect );

$timestamp = time();
$date = date(“d.m.Y - H:i”, $timestamp);
$name = $_POST[“name”];
$betreff = $_POST[“betreff”];
$inhalt = $_POST[“inhalt”];
$email = $_POST[“email”];
$hp = $_POST[“hp”];

$anfrage = “INSERT INTO Gaestebuch (date, user, betreff, inhalt, email, hp) VALUES (NOW(), $user, $betreff, $inhalt, $email, $hp)”;
mysql_query ($anfrage);
?>[/code]

Wenn ich allerdings die Tabelle Gaestebuch über PHP-My-Admin anschauen will, sagt er mir, die Tabelle sei leer?

Könnte mir evtl. jemand sagen, was ich falsch mache oder wo der möglicherweise der Fehler liegt?

Danke :smiley:

Gruss,

Stevereeno

Betreibe sinnvolles Debugging:

  • Kontrollausgaben machen (z.B. von dynamisch zusammengesetzten Queries)
  • nutze mysql_error()

Informiere dich ueber das Stichwort SQL Injection, und was man dagegen tut.
Und gewoehne dir das unsinnige “Umkopieren” von POST-Werten vor ihrer Verwendung ab.

Dort muss die [b]Datenbank[/b], nicht die Tabelle stehen.
Die Datenbank ist hier auf bplaced üblicherweise die gleiche, wie dein Benutzername.
Direkt in der Anfrage "INSERT INTO Gaestebuch ...", wird entschieden in welcher Tabelle gespeichert wird :wink:

Edit:
zweitens
[code]... (date, user, betreff, inhalt, email, hp) ...[/code]
lieber so:
[code]... (`date`, `user`, `betreff`, `inhalt`, `email`, `hp`) ...[/code]
Da z.B. "date" von MySQL reserviert ist (meine ich jedenfalls ^^)

(Das verwendete Symbol ist das Gravis ` , nicht zu verwechseln mit dem Apostroph ' )


mfg Balmung

Dort muss die Datenbank, nicht die Tabelle stehen.
Die Datenbank ist hier auf bplaced üblicherweise die gleiche, wie dein Benutzername.
Direkt in der Anfrage “INSERT INTO Gaestebuch …”, wird entschieden in welcher Tabelle gespeichert wird :wink:

Edit:
zweitens

lieber so:

Da z.B. “date” von MySQL reserviert ist (meine ich jedenfalls ^^)

(Das verwendete Symbol ist das Gravis ` , nicht zu verwechseln mit dem Apostroph ’ )

mfg Balmung

Klappt leider immer noch net wirklich …

Hab mal die Gravis eingesetzt und die DB richtig eingestellt. Passiert allerdings immer noch nichts … Code sieht folgendermassen aus:

[code]<?php

$connect = mysql_connect( “localhost”, “******”, “******” );

if ( ! $connect )
die( “Verbindung fehlgeschlagen!” );

mysql_select_db( “stevereeno”, $connect )
or die(“Datenbank nicht gefunden!”);

$timestamp = time();
$date = date(“d.m.Y - H:i”, $timestamp);
$name = $_POST[“name”];
$betreff = $_POST[“betreff”];
$inhalt = $_POST[“inhalt”];
$email = $_POST[“email”];
$hp = $_POST[“hp”];

$anfrage = “INSERT INTO Gaestebuch (date, user, betreff, inhalt, email, hp) VALUES ($date, $user, $betreff, $inhalt, $email, $hp)”;
mysql_query ($anfrage);
?>[/code]

@crisb:
Bin ziemlich neu was PHP und MySQL angeht, sorry, drum mag meine Frage möglicherweise etwas trivial erscheinen …

Dass du neu bist, rechtfertigt aber nicht, dass du hier gegebene Tipps einfach ignorierst, und dann immer noch rumjammerst, dass es “nicht funzt”.

Also mach bitte, was dir gesagt wurde.

P.S.: Vielleicht moechtest du dir diesen Thread auch mal ansehen, und dann ueberlegen, ob du nicht ein paar Dateien lieber wieder von deinem Webspace entfernen moechtest.

[quote=„chrisb“]Dass du neu bist, rechtfertigt aber nicht, dass du hier gegebene Tipps einfach ignorierst, und dann immer noch rumjammerst, dass es „nicht funzt“.

Also mach bitte, was dir gesagt wurde.[/quote]
:ps: :ps:

hat er doch??!!

poste mal bitte die datentypen deiner spalten der tabelle…

aus logik würde ich sagen das hier ein paar… " und ’ fehlen

$anfrage = "INSERT INTO `Gaestebuch` (`date`, `user`, `betreff`, `inhalt`, `email`, `hp`) VALUES ('".$date."', '".$user."', '".$betreff."', '".$inhalt."', '".$email."', '".$hp."')";

ps: nach msql_select_db() fehlt das abschließende semikolon

$anfrage = "INSERT INTO `Gaestebuch` (`date`, `user`, `betreff`, `inhalt`, `email`, `hp`) VALUES ('$date', '$user', '$betreff', '$inhalt', '$email', '$hp')";

nicht zu unleserlich machen :wink:

:hail:

ich bins so gewohnt^^
finds so logischer, aber du hast recht, deine variante ist einfacher zu lesen

Ich sehe keinerlei Debug- und Fehlerbehandlungsmasznahmen in seinem zuletzt geposteten Code, keinerlei Unternehmungen gegen SQL Injection, und das bloedsinnige Umkopieren der POST-Parameter steht auch noch weiterhin da.

Ich würde noch über prüfen ob die felder aus gefüllt sind oder nicht sonnst kann jeder dein DB Zuspammen In dem der immer auf Absenden klickt

Ich sehe keinerlei Debug- und Fehlerbehandlungsmasznahmen in seinem zuletzt geposteten Code, keinerlei Unternehmungen gegen SQL Injection, und das bloedsinnige Umkopieren der POST-Parameter steht auch noch weiterhin da.[/quote]

oke…sry, dachte das war auf die dinge von Balmung bezogen…

Und was SQL Injection etc angeht…ich glaube, dass das nur ein Code-Schnipsel is, den er hoffentlich nicht so einsetzen will/wird…

@ chrisb: Sorry, ich hab meinen zweiten Post auf den Tip von Balmung bezogen, nicht auf deinen. Wenn du dachtest, ich “jammer” rum dasses immer noch net klappt, sorry dass deine Ansicht so gefallen ist, ich dachte nur ich poste den bisherigen Code, damit vielleicht jemand gleich auf Anhieb was sieht (erfahrene Augen sehen gern mehr, desshalb …). Versteh mich nicht falsch, ich hab mich natürlich auch mit deinem Post auseinandergesetzt :wink:

Also, habe das mit mysql_error() angewendet und kriege folgende Error-Meldung:

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 1

Mein Code sieht bisher so aus:

[code]$anfrage = “INSERT INTO stevereeno.Gaestebuch (
id ,
date ,
name ,
betreff ,
inhalt ,
email ,
hp
)
VALUES (
NULL , ‘08.12.2008’, $_POST[“name”], $_POST[“betreff”], $_POST[“inhalt”], $_POST[“email”], $_POST[“hp”]
);”;

mysql_query ($anfrage) or die (mysql_error());

mysql_close();[/code]

Auf die Sache mit der SQL-Injection: Hab mich da auch mal bissel umgehört (dreht sich um die Sicherheit der DB, oder?), möglicherweise aber nicht präzise genug oder so … aber könntet ihr mich da evtl. etwas aufklären? (Verlange ja keine tausend Seiten Erklärung … Einfach vielleicht einen Rat eines erfahrenen Mannes).

EDIT: Hier noch die Datenbank:

Dank euch!

Und wenn du jetzt endlich auch mal eine Kontrollausgabe deiner zusammengebastelten Query machen wuerdest, dann wuerdest du vielleicht auch erkennen koennen, was daran nicht stimmt.

Immer, wenn du Daten in einen bestimmten Kontext bringst, muessen sie kontextspezifisch behandelt werden.

Im Kontext HTML haben bspw. die Zeichen < und > eine Sonderbedeutung - da die bei reinen Daten aber nicht erwuenscht ist, muesste man die Zeichen entsprechend behandeln, wenn man die Daten im Kontext HTML ausgeben will.

Auch eine MYSQL-Query stellt einen Kontext dar, in dem bestimmte Zeichen Sonderbedeutung haben, also innerhalb reiner Daten entsprechend behandelt werden muessen. Die Funktion dafuer heisst mysql_real_escape_string.

[quote=“chrisb”]

Im Kontext HTML haben bspw. die Zeichen < und > eine Sonderbedeutung - da die bei reinen Daten aber nicht erwuenscht ist, muesste man die Zeichen entsprechend behandeln, wenn man die Daten im Kontext HTML ausgeben will.

Auch eine MYSQL-Query stellt einen Kontext dar, in dem bestimmte Zeichen Sonderbedeutung haben, also innerhalb reiner Daten entsprechend behandelt werden muessen. Die Funktion dafuer heisst mysql_real_escape_string.[/quote]

Das meinst du jetzt bezogen nur auf den Inhalt, den ich einlesen will, oder? Oder meinst du das auf alle einzulesenden Daten? (Sorry, ich wälz mich ja durchs Netz, aber wahrscheinlich würde ichs gleich verstehen wenn dus mir (aber nicht auch so kompliziert wies sonst überall schon steht) anhand eines praktischen Beispiels erklären könntest).

Klingt bei dir ziemlich einfach, verstehs allerdings nicht wirklich …

Ich weiss, das klingt wohl so als wäre ich absolut bescheuert, aber ich habe wirklich nicht all zu viel praktische erfahrung mit SQL geschweige denn PHP. Ich bin aber wirklich gewillt, es zu lernen …

Ich hoffe, ich gehe euch hier nicht zu sehr auf den Wecker …

Bin aber extrem dankbar für jede Hilfestellung!

Nein, bezogen darauf, wenn du Daten in einen bestimmten Kontext bringst.

Setzt du Daten in einen MySQL-Query-String ein, bringst du sie in den Kontext MySQL-Query-String. Also musst du sie entsprechend behandeln.

Gibst du Daten in HTML aus, bringst du sie in den Kontext HTML. Also musst du sie entsprechend behandeln.

Nachdem du $anfrage definiert hast gibst du es mit echo mal zur Kontrolle aus - was ist denn daran so schwer zu verstehen?

[code]$anfrage = “INSERT INTO stevereeno.Gaestebuch (
id ,
date ,
name ,
betreff ,
inhalt ,
email ,
hp
) VALUES (
NULL ,
‘08.12.2008’,
’”.mysql_real_escape_string($_POST[“name”])."’,
’".mysql_real_escape_string($_POST[“betreff”])."’,
’".mysql_real_escape_string($_POST[“inhalt”])."’,
’".mysql_real_escape_string($_POST[“email”])."’,
’".mysql_real_escape_string($_POST[“hp”])."’
);";

mysql_query ($anfrage) or die (mysql_error());[/code]

Probiers mal so…
Bei deine Methode wäre der String bei $_POST["name"] unterbrochen!

PS: was ist den bitte blob fürn datentyp :unamused:
ich würd da text verwenden bzw longtext

und wieso verwendest du für datum int(11)?
so wie du das regelst ist, ist das datum immer 10-stellig
und warum kann datum NULL sein?

Fragen über Fragen^^

Mein Vorschlag:
id int(11) auto_increment
date int(10) //bei deiner variante
name varchar(50)
betreff varchar(50)
inhalt text
email varchar(50)
hp varchar(75)

EDIT:
Danke für deinen Vorschlag, an-di, allerdings bekommen ich nun folgende Ausgabe:

INSERT INTO `stevereeno`.`Gaestebuch` ( `id` , `date` , `name` , `betreff` , `inhalt` , `email` , `hp` ) VALUES ( NULL , '08.12.2008', '', '', '', '', '' ); Unknown column 'name' in 'field list'

Soweit bin ich vorher mit rumpröbeln eben schon gekommen und wollte gerade fragen, an was das liegen könnte … Google wurde natürlich bereits befragt, aber irgendwie finnd ich da nix Passendes …

$anfrage = "INSERT INTO `stevereeno`.`Gaestebuch` ( `id`, `date`, `vorname`, `betreff`, `inhalt`, `email`, `hp` ) VALUES ( NULL, \'2008-12-08\', "'.mysql_real_escape_string($_POST["vorname"])."', "'.mysql_real_escape_string($_POST["betreff"])."', "'.mysql_real_escape_string($_POST["inhalt"])."', "'.mysql_real_escape_string($_POST["email"])."', "'.mysql_real_escape_string($_POST["hp"])."' );";

Den Code bitte aber nicht in phpMyAdmin eingeben…sondern per PHP-Script

Edit: Ich hab deinen Post aber gesehn :wink:

Das heißt das es das Feld name nicht gibt!

Da es jetzt vorname heißt oder?^^

Dann hab ich ja doch das passende per Google gefunden … aber wie ist das möglich? Ich meine, der Formularcode sieht folgendermassen aus:

[code]

Nam[/code] etc. natürlich, und die MySQL Datenbank ist ja auch mit der Spalte "name" eingerichtet. Das ist äusserst merkwürdig ...

Ja ich habs mal unbenannt, eben weils ichs bei google so gefunden habe, allerdings hab ichs vergessen wieder umzubennen ^^ (was fürn deutsch xD)

Der Fehler bleibt allerdings bestehen …

EDIT:

Ne sorry, klappt jetzt eigentlich:

INSERT INTO `stevereeno`.`Gaestebuch` ( `id` , `date` , `name` , `betreff` , `inhalt` , `email` , `hp` ) VALUES ( NULL , '08.12.2008', '', '', '', '', '' ); 

Wieso werden name, betreff etc. ohne Inhalt eingelesen? o.0 das verwirrt mich gerade total …