Anlegen eines Datensatzes in einer MySQL-Tabelle

Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 12:39:07 von Hans-Peter Nicasius

Hallo,

ich hoffe, Ihr verzeiht mir noch eine Anfängerfrage:

Ich habe auf meiner HP ein Gästebuch laufen, siehe http://www.skipperchar=
ly.de
.. Nun habe ich mir auf meinem Notebook XAMPP installiert und unter
phpmyadmin sowohl die Datenbank als auch die Tabelle und den User für
den SQL-Zugriff angelegt. Alles funktioniert auch, nur ich kann keine
Sätze via INSERT zu der Tabelle hinzufügen. Wenn ich das "per Hand"
via phpmyadmin mache, funktioniert das. Der Datensatz wird auch
angezeigt. Nur das keinen Datensatz über das Form angelegt bekomme.

Hier mal der kleine Codeschnipsel für den eigentlichen Insert:

$time =3D date (YmdHis);

$query =3D "INSERT INTO ".tables_preffix."guestbook(subject, text, time,
name, email, web, location, ip_address, show_entry) VALUES subject',
'$text', '$time', '$name', '$email', '$web', '$location',
'$HTTP_SERVER_VARS[REMOTE_ADDR]','J')";

mysql_query($query);

Der Code funktioniert ja auf meiner HP einwandfrei. Und das ich an die
Datenbank komme, kann ich daran sehen, das mir der testweise
eingetragene Datensatz auch sauber angezeigt wird.

Ich scheine irgendwas falsch zu machen, hoffe jedoch auf Eure Hilfe.

Danke schon mal.

Gruß
Charly

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 12:49:57 von Carsten Wiedmann

Hans-Peter Nicasius schrieb:

> auch, nur ich kann keine Sätze via INSERT zu der Tabelle hinzufügen.
>
> $query = "INSERT INTO ".tables_preffix."guestbook(subject, text, time,
> name, email, web, location, ip_address, show_entry) VALUES subject',


Was ist das da hinten bei "subject'" für ein Hochkomma?


> '$text', '$time', '$name', '$email', '$web', '$location',
> '$HTTP_SERVER_VARS[REMOTE_ADDR]','J')";

Wo tust du diesen Variablen einen Wert zuweisen?

Allgemein:
Wenn du ein Problem mit einem Query hast, dann lass dir dieses mal in einem
echo() ausgeben. Ein "error_reporting(E_ALL);" soll auch Wunder wirken ;-)


> Der Code funktioniert ja auf meiner HP einwandfrei.

Das ist Zufall... (Wahrscheinlich erklärt dir gleich eh einer welcher *g*)

Gruß
Carsten

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 14:54:06 von Hans-Peter Nicasius

On 15 Feb., 12:49, "Carsten Wiedmann" wrote:
> Was ist das da hinten bei "subject'" für ein Hochkomma?

war Fehler beim Kopieren der Zeile... stand noch (' vor subject

> Wo tust du diesen Variablen einen Wert zuweisen?

Das hat mich auf den richtigen Weg gebracht!

Die Funktion wird aufgerufen, wenn man in dem Form "submit" drückt.
Dann wird das PHP wieder mit ?action=3Dadd
aufgerufen. Für die restlichen Variablen find ich garnichts.
Die Submit-Methode in dem Form ist post
Die Variablen in dem PHP werden einfach mit $name angesprochen. Nicht
mit $_get["name"] oder $_post["name"]. Trotzdem funktioniert das PHP
auf dem Webserver. Wieso?
Ich habe mir die ersten Variablen jetzt mal mit $_get und $_post
angeschaut und dann kann ich sie auch sehen.

Kann mir das jemand erklären?

Laufen unter XAMPP und meinem Webserver vielleicht unterschiedliche
PHP-Versionen? Und wie finde ich das raus? (Letzte Frage stelle ich
nur, weil ich im Moment zu faul bin zu googeln. man möge mir
verzeihen.)

Danke
Charly

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 15:05:58 von Thomas Rachel

Hans-Peter Nicasius wrote:

> $time = date (YmdHis);

Sollten um YmdHis da nicht besser "" oder '' drum?

> $query = "INSERT INTO ".tables_preffix."guestbook(subject, text, time,
> name, email, web, location, ip_address, show_entry) VALUES subject',
> '$text', '$time', '$name', '$email', '$web', '$location',
> '$HTTP_SERVER_VARS[REMOTE_ADDR]','J')";

An welcher Stelle quotest Du die genannten Variablen (Stichwort
mysql_real_escape_string)? Wenn nirgends, warum nicht?


> mysql_query($query);

Wie erkennst Du und reagierst Du auf Fehler?


Thomas
--
Deflorieren heißt nicht, der Freundin die Blumen wieder wegnehmen.

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 15:07:40 von Thomas Rachel

Hans-Peter Nicasius wrote:

> Die Variablen in dem PHP werden einfach mit $name angesprochen.

Ist nicht empfehlenswert, zumindest nicht zusammen mit der Unsitte,
verwendete Variablen nicht vorher zu initialisieren.


> Nicht mit $_get["name"] oder $_post["name"]. Trotzdem funktioniert das PHP
> auf dem Webserver. Wieso?

Weil dort register_globals (per Default?) eingeschaltet ist.


> Laufen unter XAMPP und meinem Webserver vielleicht unterschiedliche
> PHP-Versionen?

Vermutlich.


Thomas
--
Ich glaube an das Pferd. Das Auto halte ich für eine
vorübergehende Modeerscheinung. (Kaiser Wilhelm II)

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 15:08:42 von Niels Braczek

Hans-Peter Nicasius schrieb:

> Die Variablen in dem PHP werden einfach mit $name angesprochen. Nicht
> mit $_get["name"] oder $_post["name"]. Trotzdem funktioniert das PHP
> auf dem Webserver. Wieso?
> Ich habe mir die ersten Variablen jetzt mal mit $_get und $_post
> angeschaut und dann kann ich sie auch sehen.

$_GET und $_POST. Variablennamen sind case sensitive.

> Kann mir das jemand erklären?

11.20. Warum funktionieren meine Formulare nicht?
http://www.php-faq.de/q/q-formular-register-globals.html

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 15:17:41 von Hans-Peter Nicasius

On 15 Feb., 15:08, Niels Braczek wrote:
> > Kann mir das jemand erklären?
>
> 11.20. Warum funktionieren meine Formulare nicht?http://www.php-faq.de/q/=
q-formular-register-globals.html
>

Vielen Dank! Bin ich Dank google ein paar Minuten später auch drauf
gekommen. Irgendwann muss ich mir die php-faq mal wirklich alle
durchlesen.

Trotzdem vielen Dank für Deine Antwort. Hat mir sehr geholfen.

Gruß
Charly

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 15:40:43 von Hans-Peter Nicasius

On 15 Feb., 15:05, Thomas Rachel
wrote:
> Sollten um YmdHis da nicht besser "" oder '' drum?

Sollte ich wohl machen.
>
> > $query =3D "INSERT INTO ".tables_preffix."guestbook(subject, text, time,
> > name, email, web, location, ip_address, show_entry) VALUES subject',
> > '$text', '$time', '$name', '$email', '$web', '$location',
> > '$HTTP_SERVER_VARS[REMOTE_ADDR]','J')";
>
> An welcher Stelle quotest Du die genannten Variablen (Stichwort
> mysql_real_escape_string)? Wenn nirgends, warum nicht?

Tschuldigung, versteh ich leider nicht :-( Was meinst Du mit quoten?

> Wie erkennst Du und reagierst Du auf Fehler?

Leider garnicht. Bis auf das grundsätzliche Fehlerhändling beim
Connect zur Datenbank.

Das ist leider das Kreuz mit Open Source. Das Gästebuch habe ich als
solches bereits fertig bekommen. Deswegen falle ich jetzt immer noch
auf so dumme Anfängerfehler rein oder kenne grundsätzliches leider
noch nicht.
Nehme aber gerne jeden Tip auf und versuche auch das zu verstehen, was
ich da mache. Ist aber nicht immer so ganz einfach. Obwohl ich mal
jahrelang in Cobol, Assembler und Pascal programmiert habe.

Hoffe, Ich nerve nicht zu sehr

Gruß
Charly
>
> Thomas
> --
> Deflorieren heißt nicht, der Freundin die Blumen wieder wegnehmen.

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 17:21:13 von Joerg Behrens

Hans-Peter Nicasius schrieb:
> On 15 Feb., 15:05, Thomas Rachel
> wrote:
>> Sollten um YmdHis da nicht besser "" oder '' drum?
>
> Sollte ich wohl machen.
>>> $query = "INSERT INTO ".tables_preffix."guestbook(subject, text, time,
>>> name, email, web, location, ip_address, show_entry) VALUES subject',
>>> '$text', '$time', '$name', '$email', '$web', '$location',
>>> '$HTTP_SERVER_VARS[REMOTE_ADDR]','J')";
>> An welcher Stelle quotest Du die genannten Variablen (Stichwort
>> mysql_real_escape_string)? Wenn nirgends, warum nicht?

Gib halt das Statement mal aus und Poste es hier. Dieses Statement
kannst du auch mal mit deinem lokalen mysql.exe Client absetzen. Dann
fuehrt auch kein Weg an der Fehlermeldung vorbei ;)


> Tschuldigung, versteh ich leider nicht :-( Was meinst Du mit quoten?

Wie bei jeder Syntax gibt es auch im SQL Zeichen welche fuer den Parser
etwas besonderes darstellen. Was glaubst du was passiert wenn dein $name
das ' Zeichen enthaelt?

>> Wie erkennst Du und reagierst Du auf Fehler?
>
> Leider garnicht. Bis auf das grundsätzliche Fehlerhändling beim
> Connect zur Datenbank.

Stelll dir vor uns wuerde es nicht geben. Die Anzeige der Fehler ist in
PHP kostenlos... man muss sie nur aktivieren bzw. die entsprechenden
Funktionen aufrufen.

> Das ist leider das Kreuz mit Open Source. Das Gästebuch habe ich als
> solches bereits fertig bekommen. Deswegen falle ich jetzt immer noch
> auf so dumme Anfängerfehler rein oder kenne grundsätzliches leider
> noch nicht.

Das Kreuz mit Open Source ist das du die Chance hast die Fehler zu
korrigieren.

> Nehme aber gerne jeden Tip auf und versuche auch das zu verstehen, was
> ich da mache. Ist aber nicht immer so ganz einfach. Obwohl ich mal
> jahrelang in Cobol, Assembler und Pascal programmiert habe.

Und nun sollte HTTP, PHP, SQL und das Verstaendnis fuer SQL Injection
und XSS dazukommen.


Anmerkung: Mysql hat eine Liste von resvervierten Woerten. Schau doch
mal nach ob nicht einer deiner gewaehlten Spaltennamen auf dieser Liste
steht. In deinem Falle hast du Glueck und fuer dein speziellen Wort gibt
es eine Ausnahme... du solltest die Spalte aber trotzdem umbennen.

Gruss
Joerg

--
TakeNet GmbH, Geschaeftsfuehrer Wolfgang Meier
97080 Wuerzburg Tel: +49 931 903-2243
Alfred-Nobel-Straße 20 Fax: +49 931 903-3025
HRB Wuerzburg 6940 http://www.takenet.de

Re: Anlegen eines Datensatzes in einer MySQL-Tabelle

am 15.02.2007 17:40:09 von Thomas Rachel

Hans-Peter Nicasius wrote:

>> > $query = "INSERT INTO ".tables_preffix."guestbook(subject, text, time,
>> > name, email, web, location, ip_address, show_entry) VALUES subject',
>> > '$text', '$time', '$name', '$email', '$web', '$location',
>> > '$HTTP_SERVER_VARS[REMOTE_ADDR]','J')";
>>
>> An welcher Stelle quotest Du die genannten Variablen (Stichwort
>> mysql_real_escape_string)? Wenn nirgends, warum nicht?
>
> Tschuldigung, versteh ich leider nicht :-( Was meinst Du mit quoten?

Das Stichwort habe ich genannt. Diese Funktion wandelt einen übergebenen
String in ein Format, welches garantiert nebenwirkngsfrei in ein Query
eingesetzt werden kann.

$a="Heinz' Auto";
$sql="INSERT INTO strings (str) VALUES ('$a')"

Und nu? Wie sieht das an MySQL übergebene Query aus?


Deshalb gehört da ein $a=mysql_real_escape_string($db,$a); hin (genauer Name
kann abweichen, ebenso auch genaue Parameterreihenfolge - habe jetzt das
C-API von MySQL im Kopf, welches vom PHP-API in einigen Punkten abweicht).
Dadurch wird der String $a umgesetzt in "Heinz\' Auto", und MySQL weiß, daß
zwischen "z" und " " das Zeichen "'" hin soll und der nach "('" beginnende
String dort noch nicht zuende ist.

.... ('Heinz' Auto') quittiert MySQL zu Recht mit einer Fehlermeldung.


>> Wie erkennst Du und reagierst Du auf Fehler?
>
> Leider garnicht. Bis auf das grundsätzliche Fehlerhändling beim
> Connect zur Datenbank.

Solltest Du ändern. Erleichtert die Fehlersuche ungemein - gerade wenn man
ansonsten als einzigen Effekt hat "da passiert nix - was läuft schief?".


Thomas
--
Und wir singen: Bye bye Miss American Pie
Ich hab's länger schon befürchtet, und jetzt ist es soweit
Madonna quietscht, und das Publikum schreit:
'This will be the day that I die'
(http://www.schlabonski.de/americanpie.html)