WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Und wiedereinmal PHP / Mysql (http://www.wcm.at/forum/showthread.php?t=237962)

Honk 15.01.2010 10:32

Und wiedereinmal PHP / Mysql
 
Hallo Leute
Nachdem ich es jetzt geschafft habe, Formulardaten (Anmeldung zu einer Veranstaltung) mittels PHP Script auszulesen und an eine Sql DB (phpMyadmin) zu schicken stehe ich vor einem seltsamen Problem:

für eine weitere Veranstaltung habe ich a) das Formular übernommen und adaptiert b) detto das Script angepasst und c) eine weitere Tabelle in meiner DB angelegt und configuriert.
Zwar erhalte ich beim Versenden des Formulars die Bestätigung, dass alle Daten eingetragen wurden, aber in der DB kommen sie nie an.

Kann es sein, dass zwei Tabellen in einer DB nicht mehr gültig sind? Früher (vor drei jahren) hatte ich da keine Probleme damit :(

thx
Klaus
PS: nehmt bitte bei Antworten auf meinen "Laien-Status" rücksicht :D

zAPPEL 15.01.2010 10:39

Zitat:

Zitat von Honk (Beitrag 2399115)
Kann es sein, dass zwei Tabellen in einer DB nicht mehr gültig sind? Früher (vor drei jahren) hatte ich da keine Probleme damit :(

Was genau meinst du denn damit? Zwei Tabellen in einer Datenbank sind kein Problem, der Fehler muss woanders liegen. Wie heißen die Tabellen? Wie sieht dein Code aus? Nach dem Insert-Statement schon ein "echo mysql_error()" reingetan?

lg Matthias

Honk 15.01.2010 11:25

Hallo
Naja; eine Datenbank und darin zwei Tabellen (haben natürlich unterschiedliche Namen), in die jeweils die Anmeldedaten einfließen sollten.
Bei dem einen Formular ist´s ja keine Problem ....

Hier das Script:

<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

$mysqlhost = "xxxxxxxxxxxx";
$mysqluser = "xxxxxxx";
$mysqlpwd = "xxxxx";
$mysqldb = "xxxx";
$mysqltabelle = "kids";
$vorname = $_POST["vorname"];
$name = $_POST["name"];
$ort = $_POST["ort"];
$plz = $_POST["plz"];
$strasse = $_POST["strasse"];
$jahr = $_POST["jahr"];
$geschlecht = $_POST["geschlecht"];
$kategorie = $_POST["kategorie"];
$verein = $_POST["verein"];
$uci = $_POST["uci"];
$email = $_POST["email"];
$telefon = $_POST["telefon"];

$resource = mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Keine Verbindung zum Server moeglich");

mysql_select_db($mysqldb, $resource) or die ("Die Datenbank existiert nicht");

$eintrag = "INSERT INTO $mysqltabelle (vorname, name, ort, plz, strasse, jahr, geschlecht, kategorie, verein, uci, email, telefon) VALUES ('$vorname', '$name', '$ort', '$plz' '$strasse', '$jahr','$geschlecht', '$kategorie', '$verein', '$uci', '$email', '$telefon')";
$eintragen = mysql_query($eintrag);
//echo $eintrag;
{
echo "<b>VIELEN DANK FÜR IHRE ANMELDUNG ZUM</b><p><b>xxxxxxxxxxxxx</b><p>
Folgende Daten wurden gespeichert:</b><p>";
echo "<b>Vorname:</b> $vorname<p><b>Name:</b> $name<p><b>Ort:</b> $ort<p>
<b>Postleitzahl:</b> $plz<p><b>Strasse:</b> $strasse<p><b>Geburtsjahr:</b> $jahr<p><b>Geschlecht:</b> $geschlecht<p><b>Kategorie:</b> $kategorie<p><b>Verein:</b> $verein<p><b>UCI Code:</b> $uci<p><b>E-Mail Adresse:</b> $email<p><b>Tel. Nr.:</b> $telefon<p>";
echo "Zahlung des Nenngelds direkt beim Start!";}
//else {echo "Ihre daten wurden nicht gespeichert!!";}
?>

die letzte Zeile steht deshalb unter //, da sie mir sonst eine Fehlermeldung erzeugt; das ist aber sekundär :)

thx
Honk

T.dot 15.01.2010 12:50

Auf den ersten Blick seh ich keinen Fehler, lass dir einfach mal den SQL-String ausgeben und führ ihn über PhpMyAdmin aus.

Ich würd dir dringend dazu raten folgendes zu lesen:
http://de.wikipedia.org/wiki/SQL_Injection

Honk 15.01.2010 14:36

Danke T.Dot

Betreffend SQL_Injection: > ich bin PHP-Laie und froh, dass ich zumindest soweit gekommen bin. :)

Ich bin jetzt beim Suchen nach Sicherheit auf auf "mysql_real_escape_string" gestoßen; nützt mir das was und wo bau ich das ein :confused:

thx
Honk

zAPPEL 15.01.2010 14:59

Ich verwende für SQL Abfragen meistens die adodb: http://adodb.sourceforge.net/

Ich sehe bei deinem Skript auf die schnelle auch keinen Fehler, ist natürlich schwern wenn man nicht auf den Server zugreifen kann. Query ausgeben und in phpMyAdmin eingeben ist aber immer eine einfache Möglichkeit rauszufinden was das Problem ist.

SQL Error kann man sich auch ausgeben lassen:

PHP-Code:

$eintragen mysql_query($eintrag)
or die (
mysql_error()); 

Btw. pack PHP Code in PHP Tags im Forum, das macht das ganze viel besser lesbar.

lg Matthias

Honk 15.01.2010 15:28

Danke Zappel
... hier das Ganze nun in PHP Tags ... und darunter die relevanten Zeilen aus dem HTML Formular


PHP-Code:

<?php
error_reporting
(E_ALL E_STRICT);
ini_set('display_errors'1);
$mysqlhost "XXXXXX.com";
$mysqluser "XXXX";
$mysqlpwd "XXXX";
$mysqldb "XXXX";
$mysqltabelle "kids";
$vorname $_POST["vorname"];
$name $_POST["name"];
$ort $_POST["ort"];
$plz $_POST["plz"];
$strasse $_POST["strasse"];
$jahr $_POST["jahr"];
$geschlecht $_POST["geschlecht"];
$kategorie $_POST["kategorie"];
$verein $_POST["verein"];
$uci $_POST["uci"];
$email $_POST["email"];
$telefon $_POST["telefon"];
$resource mysql_connect($mysqlhost$mysqluser$mysqlpwd) or die ("Keine Verbindung zum Server moeglich");
mysql_select_db($mysqldb$resource) or die ("Die Datenbank existiert nicht");  
$eintrag "INSERT INTO $mysqltabelle (vorname, name, ort, plz, strasse, jahr, geschlecht, kategorie, verein, uci, email, telefon) VALUES ('$vorname', '$name', '$ort', '$plz' '$strasse', '$jahr','$geschlecht', '$kategorie', '$verein', '$uci', '$email', '$telefon')";  
$eintragen mysql_query($eintrag);
//echo $eintrag;
{
echo 
"<b>VIELEN DANK FÜR IHRE ANMELDUNG ZUM</b><p><b>XXXXXXXXX</b><p>
Folgende Daten wurden gespeichert:</b><p>"
;
echo 
"<b>Vorname:</b> $vorname<p><b>Name:</b> $name<p><b>Ort:</b> $ort<p>
<b>Postleitzahl:</b> $plz<p><b>Strasse:</b> $strasse<p><b>Geburtsjahr:</b> $jahr<p><b>Geschlecht:</b> $geschlecht<p><b>Kategorie:</b> $kategorie<p><b>Verein:</b> $verein<p><b>UCI Code:</b> $uci<p><b>E-Mail Adresse:</b> $email<p><b>Tel. Nr.:</b> $telefon<p>"
;
echo 
"Zahlung des Nenngelds direkt beim Start!";}
//else {echo "Ihre daten wurden nicht gespeichert!!";}
?>


HTML-Code:

<div id="content">
      <h4 class="Stil3">ANMELDUNG</h4>
      <form id="form1" method="post" action="../kids/send_kids.php" target="_blank">
        <table width="450" border="0">
          <tr>
            <td><label>
                <div align="right">Vorname</div>
              </label></td>
            <td><input type="text" name="vorname" id="vorname" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">Name</div>
              </label></td>
            <td><input type="text" name="name" id="name" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">Ort</div>
                </label></td>
            <td><input type="text" name="ort" id="ort" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">PLZ</div>
                </label></td>
            <td><input type="text" name="plz" id="plz" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">Stra&szlig;e</div>
                </label></td>
            <td><input type="text" name="strasse" id="strasse" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">Geburtsjahr</div>
              </label></td>
            <td><input type="text" name="jahr" id="jahr" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">Geschlecht </div>
              </label></td>
            <td><select name="geschlecht" id="geschlecht">
                <option>Bitte w&auml;hlen Sie aus ...</option>
                <option>m&auml;nnlich</option>
                <option>weiblich</option>
            </select></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">Kategorie</div>
                </label></td>
            <td><label>
              <select name="kategorie" id="kategorie">
                <option>Bitte ausw&auml;hlen ...</option>
                <option>U 5</option>
                <option>U 7</option>
                <option>U 9</option>
                <option>U 11</option>
                <option>U 13</option>
                <option>U 15</option>
                <option>U 17</option>
                <option>Junioren (17 - 19)</option>
                <option>Hobby ohne Lizenz &uuml;ber 17</option>
                            </select>
            </label></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">Verein (falls vorhanden)</div>
                </label></td>
            <td><input type="text" name="verein" id="verein" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">UCI Code </div>
                </label></td>
            <td><input type="text" name="uci" id="uci" /></td>
          </tr>
          <tr>
            <td><label>
                <div align="right">e-Mail </div>
              </label></td>
            <td><label>
              <input type="text" name="email" id="email" />
            </label></td>
          </tr>
          <tr>
            <td height="10"><div align="right">Telefon</div></td>
            <td height="10"><label>
              <input type="text" name="telefon" id="telefon" />
            </label></td>
          </tr>
          <tr>
            <td height="10" colspan="2">&nbsp;</td>
          </tr>
          <tr>
            <td height="58" colspan="2">Durch das Abschicken der Nennung akzeptiert der Teilnehmer die <a href="ausschreibung.html" target="_blank">Ausschreibung</a> und die <a href="anmeldung.html" target="_blank">Teilnehmerinformation</a>. </td>
          </tr>
          <tr>
            <td colspan="2">&nbsp;</td>
          </tr>
          <tr>
            <td colspan="2"><div align="center">
                <input type="submit" name="Abschicken" value="Abschicken" />
                <input type="reset" name="Abschicken2" value="Zur&uuml;cksetzen" />
            </div></td>
          </tr>
        </table>
      </form>
      <p>&nbsp;</p>
    <p align="center">&nbsp;</div>

thx
Honk :)

{jellyfish} 15.01.2010 15:40

Hallo!
Versuch ein Mal vor dem $eintrag ein echo hinzuschreiben, dann siehst, ob über die Variablen die Werte angenommen wurden.
Wenn das funktioniert, solltest mal gucken, ob du die Dateitypen auch richtig vergeben hast.
Hab jetzt zwar schon lang nix mehr mit PHP gmacht, aber kann mi no gut erinnern, dass i manchmal eine Ewigkeit gsessen bin und Fehler gsucht hab, weil ich in der Tabelle ein Integer vergeben hab, aber beim Eintragen ein Hochkomma verwendet hab.
Aja, noch eines hätte ich fast vergessen. Nochmals nachsehen, ob die Variablen und die Tabellennamen eh gleich gschrieben sind.

grüsse, jellyfish

Honk 15.01.2010 16:13

also die Echoausgabe ist OK:

INSERT INTO kids (vorname, name, ort, plz, strasse, jahr, geschlecht, kategorie, verein, uci, email, telefon) VALUES ('klaus', 'xxxxx', 'xxxx', 'xxx' 'xxxxxx, 'xxxx','männlich', 'U 5', 'RC', '3434343', 'xxxxx@gmx.at', '343434343')

saublöde Frage: die Tabelle die funktioniert habe ich als erstes bei myphpadmin eingetragen. die als zweite eingetragene (kids) steht aber in der Datenbank an erster Stelle (anscheinend alphabetisch gereiht) .... kanns daran liegen :confused: (ich weiss eh: ausprobieren :D )

{jellyfish} 15.01.2010 20:32

Beim 4ten XXX felt das Hochkomma.
Wenns das nicht war ->
Alle Felder deiner Tabelle sind danach varchar?
Die Zeichenlänge auch lang genug gewählt?
Das mit der Tabelle habe ich leider nicht verstanden, was du da genau meinst.

grüsse, jellyfish

zAPPEL 15.01.2010 21:22

Die ist im myAdmin weiter oben weil die alphabetisch sortiert werden - das kanns also nicht sein. Ich weiß, dass man Strings in Komma setzen muss in der query, aber einem Integer-Feld kann man doch auch ein '1' übergeben.
Gerade in einer Datenbank getestet: INSERT INTO table1 (name,lastactivity,createdby) VALUES ('test','1','1') funktioniert, wobei createdby und lastactivity INT Felder sind. Das kanns also nicht sein :)

Wenn die Zeichenlänge zu gering ist funktioniert der INSERT trotzdem, aber der Text wird abgeschnitten.

Was sag phpMyAdmin wenn du die Echo-Ausgabe dort ausführst?

lg Matthias

{jellyfish} 15.01.2010 22:25

Ok, auch gut. Hat bei mir oft troubles geben wegen den Datentypen.
Dann weiß ich leider auch nix mehr, zumindest fällt mir momentan nix ein.

grüsse, jellyfish

ZombyKillah 16.01.2010 01:49

Bitte lesen:
Zitat:

Zitat von zAPPEL (Beitrag 2399155)
Ich verwende für SQL Abfragen meistens die adodb: http://adodb.sourceforge.net/

Ich sehe bei deinem Skript auf die schnelle auch keinen Fehler, ist natürlich schwern wenn man nicht auf den Server zugreifen kann. Query ausgeben und in phpMyAdmin eingeben ist aber immer eine einfache Möglichkeit rauszufinden was das Problem ist.

SQL Error kann man sich auch ausgeben lassen:

PHP-Code:

$eintragen mysql_query($eintrag)
or die (
mysql_error()); 

Btw. pack PHP Code in PHP Tags im Forum, das macht das ganze viel besser lesbar.

lg Matthias

Und den Teil einmal einfügen:
PHP-Code:

or die (mysql_error()); 

Weiteres kontrollieren, ob die ' das richtige Symbol ist.
Würde stattdessen vielleicht \" schreiben.

zAPPEL 17.01.2010 09:28

Die Anführungszeichen sollten kein Problem sein, ein \" macht das ganze imho nur unleserlicher.

lg

Honk 18.01.2010 14:11

Hallo
Danke für eure bisherige Mithilfe :-)

Ich habe jetzt
$eintragen = mysql_query($eintrag)
or die (mysql_error());

eingetragen und bekomme folgende Meldung:

"Anzahl der Felder stimmt nicht mit der Anzahl der Werte in Zeile 1 überein"

Äh ... was??

Ich habe jeweils 12 Felder (Formular, Script und DB; siehe Bild)
.... was will mysql von mir :confused:

http://klhoon.com/php3.jpg

T.dot 18.01.2010 17:21

Also wenn dein PHP wirklich so aussieht:

$eintrag = "INSERT INTO $mysqltabelle (vorname, name, ort, plz, strasse, jahr, geschlecht, kategorie, verein, uci, email, telefon) VALUES ('$vorname', '$name', '$ort', '$plz' '$strasse', '$jahr','$geschlecht', '$kategorie', '$verein', '$uci', '$email', '$telefon')";

dann fehlt zwischen '$plz' '$strasse' ein Beistrich.

Dann hast du nämlich in den Columns 12, in den Values aber nur 11 Werte.


Wenn ich mir das ansehe:
INSERT INTO kids (vorname, name, ort, plz, strasse, jahr, geschlecht, kategorie, verein, uci, email, telefon) VALUES ('klaus', 'xxxxx', 'xxxx', 'xxx' 'xxxxxx, 'xxxx','männlich', 'U 5', 'RC', '3434343', 'xxxxx@gmx.at', '343434343')

ist dort der gleiche Fehler. Wenn du diesen String 1:1 ins PhpMyAdmin kopiert hättest, wäre dort auch ein Fehler gekommen. Abgesehen davon fehlt in diesem Statment bei 'xxxxxx, ein Hochkomma. Aber ich vermut mal, das ist nur durchs Kopieren flöten gegangen...


Und wie ich grad noch seh, sind alle deine Datentypen TEXT. Hier solltest du Nvarchar mit sinnvoller Länge verwenden...

Honk 18.01.2010 17:32

Zitat:

Zitat von T.dot (Beitrag 2399555)
dann fehlt zwischen '$plz' '$strasse' ein Beistrich.

Dann hast du nämlich in den Columns 12, in den Values aber nur 11 Werte.

T.dot IST MEIN HELD !!!!
:laola:

Danke, genau das wars :-)

Danke an Alle und t´schuldigung, dass ich euch wegen einem Beistrich so lange belästigt hab´ :D

thx
honk


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag