Daten in Tabelle eingeben

L

librarian

Mitglied
Thread Starter
Dabei seit
21.08.2005
Beiträge
36
Reaktionspunkte
0
Hallo!
Bin dabei, ein PHP-Skript zu schreiben, das mit mysql Daten in eine Tabelle einlesen soll.
Das Skript übernimmt Daten aus einem HTML-Formular und gibt sie aus. Ich kann auch über das Skript Daten in die Tabelle eintragen, aber wenn ich statt konkreter Daten die Variablen benutze, die auch zur Ausgabe verwendet werden, werden die Namen der Variablen in die Tabelle eingelesen.
Das sollte doch nicht!
Habe verschiedentlich herumprobiert und werde das auch weiter tun, könnte Denkanstöße aber sehr gut gebrauchen...
 
Hast du den String innerhalb einfacher Anführungszeichen eingefasst?
Innerhalb von 'php-code-mit-variablen-bla-bla' werden keine Variablen interpretiert.
Du musst dafür entweder doppelte Anführungszeichen nehmen oder die Variablen getrennt einbinden 'code' . $variable . 'code'.

Das wäre so mein Schuss ins Blaue, ohne dass du was genaues aus dem Quellcode gepostet hast.
 
Zuletzt bearbeitet:
Man müßte schon den Teil des Quell-Codes sehen um hier zu helfen.
 
Quellcode

Das ist der Teil aus dem Skript, mit dem ich die Daten in die Tabelle einlesen kann. Eigentlich müßten doch jetzt bloß die konkreten Daten durch Variablen ersetzt werden, oder nicht?


Code:
$sql = 'INSERT INTO `studidaten` ( `lfd_nr` , `name` , `vorname` , `b_day` , `mat_nr` , `adresse` , `plz` , `wohnort` , `land` , `phon` , `email` ) '
        . ' VALUES ( \'\', \'Panter\', \'Paulchen\', \'19780306\', \'123456\', \'Hauptstr. 90\', \'56789\', \'Entenhausen\', \'Deutschland\', \'234567890\', \'Panter@gmx.de\' );'
        . ' ';


So in etwa? Hatte auch schon einfache Anführungszeichen und mal die Schrägstriche rausgenommen, aber das reicht wohl nicht...


Code:
$sql = 'INSERT INTO `studidaten` ( `lfd_nr` , `name` , `vorname` , `b_day` , `mat_nr` , `adresse` , `plz` , `wohnort` , `land` , `phon` , `email` ) '
        . ' VALUES ( Null, \"$_POST[name]\", \"$_POST[vorname]\", \"$_POST[b_day]\", \"$_POST[mat_nr]\", \"$_POST[adresse]\", \"$_POST[plz]\", \"$_POST[wohnort]\", \"$_POST[land]\", \"$_POST[phon]\", \"$_POST[email]\" );'
        . ' ';
 
Innerhalb der ' werden die Variablen nich durch deren Inhalt ersetzt.
Gib doch mal $sql aus, um zu sehen, was da drin steht.
 
Versuche es mal so:
Code:
import_request_variables("p","frm_");

Code:
$sql="INSERT INTO studidaten (lfd_nr, name, vorname, b_day, mat_nr, adresse, plz, wohnort, land, phon, email) VALUES ('', '$frm_name', $frm_vorname', '$frm_b_day', '$frm_mat_nr', '$frm_adresse', '$frm_plz', '$frm_wohnort', '$frm_land', '$frm_phon', '$frm_email');";
Ich hoffe, ich habe keine Tippfehler gemacht, passiert schon mal schnell, aber so sollte es eigentlich gehen.
 
Wo muß ich import_request_variables("p","frm_"); denn im Skript schreiben?

Mittlerweile sieht's bei mir so aus


Code:
<?php
include ('contact.php');

$tabelle='studidaten';

$sql = 'INSERT INTO `studidaten` ( `lfd_nr` , `name` , `vorname` , `b_day` , `mat_nr` , `adresse` , `plz` , `wohnort` , `land` , `phon` , `email` ) '
        
/*Zeile 28, auf die die Fehlermeldung sich bezieht, fängt hier an und endet vor mysql_query */
. ' VALUES ( Null, '.$_POST[name]', '.$_POST[vorname]', '.$_POST[b_day]', '.$_POST[mat_nr].', '.$_POST[adresse].', '.$_POST[plz].', '.$_POST[wohnort].', '.$_POST[land].', '.$_POST[phon].', '.$_POST[email].' );'
        . ' ';

mysql_query($sql, $db);
echo '<br><h1 align="center">Diese Daten wurden abgespeichert.</h1>

<table align="center" cellpadding="2">
<tr>
  <td><p  id="tabelle">Name</p></td>
  <td><p  id="tabelle">'.$_POST[vorname].' '.$_POST[name].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Geburtsdatum</p></td>
  <td><p  id="tabelle">'.$_POST[b_day].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Matrikelnummer</p></td>
  <td><p  id="tabelle">'.$_POST[mat_nr].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Stra&szlig;e &<br> Hausnummer</p></td>
  <td><p  id="tabelle">'.$_POST[adresse].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">PLZ</p></td>
  <td><p  id="tabelle">'.$_POST[plz].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Wohnort</p></td>
  <td><p  id="tabelle">'.$_POST[wohnort].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Land</p></td>
  <td><p  id="tabelle">'.$_POST[land].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Telefon</p></td>
  <td><p  id="tabelle">'.$_POST[phon].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">E-Mail</p></td>
  <td><p  id="tabelle">'.$_POST[email].'</p></td>
</tr>
</table>';

  echo '
  <TABLE align="center" cellpadding="5" cellspacing="0">
  <TR>
      <TD> 
           <a href=eingabeformular.html><p>weitere Eingabe</p>
      </TD>
      
    </TR>
  </TABLE>';


?>


Und das ist die Fehlermeldung, die ich bekomme, aber nicht wirklich verstehe. (Bin nach wie vor Anfänger...):

Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\apachefriends\xampp\htdocs\hausarbeit_php\eingabe.php on line 28
 
Wenn
Code:
$_POST[name]
nicht in Anführungszeichen steht, musst Du schreiben
Code:
$_POST["name"]
oder
Code:
$_POST['name']
.
 
Das habe ich gemacht, leider ändert das nichts an der Fehlermeldung...
 
Es fehlt jeweils ein Punkt hinter
Code:
$_POST["name"], $_POST["vorname"] und $_POST["b_day"]
.

Dann klappt es php-seitig, MySQL wird dir den Code aber trotzdem um die Ohren hauen, da deine Strings nicht von Anführungszeichen eingeschlossen sind. Ein addslashes() empfiehlt sich außerdem bei allen CHAR-Feldern, damit das ganze nicht irgendwann irgendwem um die Ohren fliegt.

BTW: Den Sinn der Zeile:
Code:
        . ' ';
habe ich nicht verstanden. Genausowenig, warum du ein NULL an MySQL für die laufende Nummer verfütterst. Wenn das ein auto_increment-Feld ist kümmert sich MySQL selbständig um den richtigen Wert - auch ohne explizite Übergabe.

Matt
 
Was heißt addslashes() und wo muß das hin?
Die Strings sind mittlerweile von Anführungszeichen umschlossen, die NULL ist weg und die Punkte sind jetzt auch da.
Was diese Zeile

Code:
      . ' ';
heißt, weiß ich gar nicht so genau, hab mir den ganzen Absatz kopiert. Aber als ich diese letzten Zeichen gelöscht hatte, wurden die Daten auch nicht in die Tabelle eingelesen.
Das Skript sieht jetzt so aus:

Code:
<?php
include ('contact.php');
import_request_variables("p","frm_");
$tabelle='studidaten';

$sql = 'INSERT INTO `studidaten` ( `lfd_nr` , `name` , `vorname` , `b_day` , `mat_nr` , `adresse` , `plz` , `wohnort` , `land` , `phon` , `email` ) ' . ' VALUES ('.$_POST['name'].', '.$_POST['vorname'].', '.$_POST['b_day'].', '.$_POST['mat_nr'].', '.$_POST['adresse'].', '.$_POST['plz'].', '.$_POST['wohnort'].', '.$_POST['land'].', '.$_POST['phon'].', '.$_POST['email'].' );'
        . ' ';

mysql_query($sql, $db);
echo '<br><h1 align="center">Diese Daten wurden abgespeichert.</h1>

<table align="center" cellpadding="2">
<tr>
  <td><p  id="tabelle">Name</p></td>
  <td><p  id="tabelle">'.$_POST[vorname].' '.$_POST[name].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Geburtsdatum</p></td>
  <td><p  id="tabelle">'.$_POST[b_day].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Matrikelnummer</p></td>
  <td><p  id="tabelle">'.$_POST[mat_nr].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Stra&szlig;e &<br> Hausnummer</p></td>
  <td><p  id="tabelle">'.$_POST[adresse].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">PLZ</p></td>
  <td><p  id="tabelle">'.$_POST[plz].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Wohnort</p></td>
  <td><p  id="tabelle">'.$_POST[wohnort].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Land</p></td>
  <td><p  id="tabelle">'.$_POST[land].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Telefon</p></td>
  <td><p  id="tabelle">'.$_POST[phon].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">E-Mail</p></td>
  <td><p  id="tabelle">'.$_POST[email].'</p></td>
</tr>
</table>';

  echo '
  <TABLE align="center" cellpadding="5" cellspacing="0">
  <TR>
      <TD> 
           <a href=eingabeformular.html><p>weitere Eingabe</p>
      </TD>
      
    </TR>
  </TABLE>';

?>

Die Daten werden nach wie vor ausgegeben, aber nicht in die Tabelle eingelesen...
 
Dann lass doch mal die mysql_query weg und gib stattessen den Inhalt von $sql mit echo aus.
Was steht da drin?
Außerdem solltest Du mit Kontrollabfragen arbeiten:
Code:
...
if (mysql_query($sql, $db) {
echo "Das wurde abgespeichert:\n<br>";
} else {
echo "Fehlschlag\n<br>";
}
...
 
Wenn ich die mysql_query weglasse und $sql ausgegebe, wird diese ausgegeben und die enthaltenen Variablen durch die Eingaben im HTML-Formular ersetzt.
Wenn ich die Kontrollfrage (s.o.) benutze wird Fehlschlag ausgegeben... Da funktioniert also die mysql_query nicht. Aber warum konnte ich Daten, die direkt in das PHP-Skript eingetragen wurden, in die Tabelle einlesen? Und was muß ich tun, damit die mysql_query funktioniert?
 
Strings müssen in Anführungszeichen gesetzt werden.
Code:
$sql = 'INSERT INTO `studidaten` ( `lfd_nr` , `name` , `vorname` , `b_day` , `mat_nr` , `adresse` , `plz` , `wohnort` , `land` , `phon` , `email` ) ' . ' VALUES ("'.$_POST['name'"].', "'.$_POST['vorname'].'", "'.$_POST['b_day'].'", "'.$_POST['mat_nr'].'", "'.$_POST['adresse'].'", "'.$_POST['plz'].'", "'.$_POST['wohnort'].'", "'.$_POST['land'].'", "'.$_POST['phon'].'", "'.$_POST['email'].'" );'

Um Fehler in Query's zu finden gibt es noch die Funktion mysql_error(). Diese könntest Du so verwenden:
Code:
if (mysql_query($sql, $db) { 
echo "Das wurde abgespeichert:\n<br>"; 
} else { 
echo "Fehlschlag\n<br>".mysql_error(); 
}

Ist in vielen Fällen nicht besonders Aussagekräftig, aber gibt Hinweise darauf an welcher Stelle der Fehler zu finden ist/sein könnte.
 
librarian schrieb:
Was heißt addslashes() und wo muß das hin?

Was addslashes() macht steht hier. Und es muss um jeden String, den du aus dem Formular bekommst und an die DB gibst, rum, also z.B.
Code:
addslashes($_POST["vorname"])
.

Die Strings sind mittlerweile von Anführungszeichen umschlossen

Nein, die Bezeichner deines assoziativen $_POST-Arrays sind von Anführungszeichen umschlossen, nicht die Strings, siehe auch den Post von dms.


Ja, aber dann darfst du natürlich auch das Feld lfdNr nicht mehr im INSERT aufführen. Sonst wirft nämlich MySQL einen Fehler, in dem Fall
Code:
Column count doesn't match value count
. Wie du dir die MySQL-Fehler ausgibst steht ja auch im Post von dms, ich halte BTW die Fehlermeldungen für recht aussagekräftig.

Was diese Zeile

Code:
. ' ';

heißt, weiß ich gar nicht so genau, hab mir den ganzen Absatz kopiert. Aber als ich diese letzten Zeichen gelöscht hatte, wurden die Daten auch nicht in die Tabelle eingelesen.

Es ist unnötig. Deine Fehler liegen im SQL-Statement selbst und um die zu finden, solltest du dir unbedingt nach dem einfügen mysql_error() ausgeben lassen!

Das Skript sieht jetzt so aus:

Code:
[...]
echo '<br><h1 align="center">Diese Daten wurden abgespeichert.</h1>

  <td><p  id="tabelle">Name</p></td>
  <td><p  id="tabelle">[...]

Ist jetzt hier nicht Thema, aber: <h1> ist ein Block-Element. Wenn dir der Abstand nach oben zu gering ist, solltest du das mit css lösen, nicht mit einem vorangestellten <br />.

id muss innerhalb eines HTML-Dokumentes eindeutig sein. Was du willst ist class. Und <p> macht innerhalb der <td> IMHO auch nicht so richtig Sinn...

Matt
 
Also, das Skript sieht jetzt so aus:

Code:
<?php
include ('contact.php');

$tabelle='studidaten';
        
$sql = 'INSERT INTO `studidaten` (`name` , `vorname` , `b_day` , `mat_nr` , `adresse` , `plz` , `wohnort` , `land` , `phon` , `email` ) ' . ' VALUES ("'.$_POST['name'].'", "'.$_POST['vorname'].'", "'.$_POST['b_day'].'", "'.$_POST['mat_nr'].'", "'.$_POST['adresse'].'", "'.$_POST['plz'].'", "'.$_POST['wohnort'].'", "'.$_POST['land'].'", "'.$_POST['phon'].'", "'.$_POST['email'].'" );';

mysql_query($sql, $db);
if (mysql_query($sql, $db)) {
echo '<h1 align="center">Diese Daten wurden abgespeichert.</h1>

<table align="center" cellpadding="2">
<tr>
  <td><p  id="tabelle">Name</p></td>
  <td><p  id="tabelle">'.$_POST[vorname].' '.$_POST[name].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Geburtsdatum</p></td>
  <td><p  id="tabelle">'.$_POST[b_day].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Matrikelnummer</p></td>
  <td><p  id="tabelle">'.$_POST[mat_nr].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Stra&szlig;e &<br> Hausnummer</p></td>
  <td><p  id="tabelle">'.$_POST[adresse].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">PLZ</p></td>
  <td><p  id="tabelle">'.$_POST[plz].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Wohnort</p></td>
  <td><p  id="tabelle">'.$_POST[wohnort].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Land</p></td>
  <td><p  id="tabelle">'.$_POST[land].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">Telefon</p></td>
  <td><p  id="tabelle">'.$_POST[phon].'</p></td>
</tr>
<tr>
  <td><p  id="tabelle">E-Mail</p></td>
  <td><p  id="tabelle">'.$_POST[email].'</p></td>
</tr>
</table>';

} else {
echo "Die Daten wurden nicht gespeichert!".mysql_error();
}

  echo '
  <TABLE align="center" cellpadding="5" cellspacing="0">
  <TR>
      <TD> 
           <a href=eingabeformular.html><p>weitere Eingabe</p>
      </TD>
      <TD> <a href=suchformular.html><p>Daten &auml;ndern</p>
      </TD>
    </TR>
  </TABLE>';


?>


Die Daten werden jetzt in die Tabelle eingelesen - allerdings jeweils doppelt...
Das mit dem addslashes guck ich mir jetzt mal an.
Die <p> innerhalb der <td> hab ich geschrieben, weil der Text in der Tabelle nicht auf ein <p> um die ganze Tabelle herum reagiert hat.
Kann ich class einfach statt id benutzen?
 
Du schickst das Statement ja auch zweimal an die Datenbank:
Code:
mysql_query($sql, $db);
if (mysql_query($sql, $db)) {

Die erste Zeile muss raus.

Die <p> innerhalb der <td> hab ich geschrieben, weil der Text in der Tabelle nicht auf ein <p> um die ganze Tabelle herum reagiert hat.

Wieso sollte er das auch tun? Und was soll diese Reaktion bewirken? Zumal ein <table> innerhalb eines <p> kein gültiges HTML ist.

Wenn es dir nur um die Formatierung des Textes in der Zelle geht, kannst du entweder schreiben:

Code:
<table cellpadding="2">
<tr>
  <td class="tabelle">Name</td>
  <td class="tabelle">'.$_POST[vorname].' '.$_POST[name].'</td>
</tr> 
</table>


und im css die Formatierung für den td festlegen:

Code:
.tabelle {
  font-family: Arial, Helvetica, sans-serif;
}


oder, codesparender:

Code:
<table cellpadding="2" class="tabelle">
<tr>
  <td>Name</p></td>
  <td>'.$_POST[vorname].' '.$_POST[name].'</td>
</tr> 
</table>


und im css entsprechend:

Code:
.tabelle td {
  font-family: Arial, Helvetica, sans-serif;
}


Kann ich class einfach statt id benutzen?

ID bietet erweiterte Möglichkeiten, man kann eine ID z.B. auch als Sprunganker in einem Link benutzen, so wie auch mit <a name='test'> und man kann mit Javascript dieses eindeutig identifizierbare Element ansprechen, manipulieren, etc. Deswegen muss es eindeutig sein. class hingegen kann beliebig oft im Dokument vorkommen. Die Definition im css ist leicht unterschiedlich:

Code:
#id {
  font-family: Arial, Helvetica, sans-serif;
}
.class {
  font-family: Arial, Helvetica, sans-serif;
}


Matt
 
Zuletzt bearbeitet:
Besten Dank! Jetzt klappt's. Bin PHP-Anfänger und merk ständig, daß es noch viiiiiel zu lernen gibt...

Mit den <p>s ging's mir um die Formatierung des Textes in der Zelle, danke nochmal für die Erklärungen dazu, msslovi0!! Da werd ich mich noch mal ransetzen.
 
Zurück
Oben Unten