PHP-Formular übergibt Werte und dann wieder nicht
mysqlfan
- datenbank
Ich bin ehrlich gesagt mit den Nerven ziemlich am Ende.
Derzeit bin ich dabei ein HTML-Formular zu entwerfen, das die Werte an eine MySQL-DB übergibt.
Das Formular umfasst ca. 20-30 Felder. Nachdem ich Stück für Stück die Felder eingefügt habe, werden auch jedesmal die Werte übergeben. Es funktioniert also alles im Test.
Schließt man allerdings den Browser bzw. startet den PC neu und man muss XAMPP neu starten o.ä. dann passiert gar nichts mehr.
Gebe ich die Werte direkt unter PHPmyadmin ein, dann werden diese in die DB geschrieben. An den Werten selbst kann es also nicht liegen.
Es muss am PHP-Formular liegen.
Hier habe ich bereits getestet, welche Variablen übergeben werden und ob diese evtl. leer sind. Sind sie nicht.
Array
(
[action] => new
[id] =>
[dvd_dvdid] => 100001
[dvd_asin] => n/a
[dvd_originaltitel] => Blair Witch Project (TV Movie Edition 09-05)
[dvd_titel_deutsch] => The Blair Witch Project
[dvd_produktionsjahr] => 1999
[dvd_director] => Daniel Myrick
[dvd_writer] => Daniel Myrick
[dvd_film_cinema_release] => 1999
[dvd_genre_1] => Action
[dvd_subgenre_1] => Horror
[dvd_genre_2] => Fantasy
[dvd_subgenre_2] => Horror
[dvd_first_release] => 25.11.1999
[dvd_german_release] => 25.11.1999
[dvd_handlung_dt] => Am 21. Oktober 1994 begeben sich die drei Filmstudenten Heather Donahue, Joshua Leonard und Michael Williams in den Black Hills Forest in Maryland. Dort wollen sie einen Dokumentarfilm über eine Spukgestalt und regionale Legende drehen, die so genannte Hexe von Blair. Man hört nie wieder von ihnen...Doch ein Jahr später wird ihr Filmmaterial gefunden. Die erhaltenen Filmaufnahmen sind ihr Vermächtnis. Sie zeigen die letzten Tage der Filmemacher, ihre quälende fünftägige Wanderung durch den undurchdringlichen Wald und fangen die Grauen erregenden Vorgänge ein, die zu ihrem Verschwinden führen...
)
1
Ich bin leider noch nicht so firm in PHP, aber alle Werte wurden schon mal übergeben. Das hat alles schon funktioniert! Nur wenn man irgendwas neu startet, dann sieht es aus, als brennt irgendwo ne Sicherung durch und nix wird mehr übergeben.
Wenn ich die PHP-Datei wieder neu entwickle und auskommentiert Stück für Stück auftaue, dann geht es schrittweise wieder.
Hat es das Problem, dass zu viele Variablenwerte auf einmal übergeben werden? Im Maximalfall sind es bis zu 50 Stück.
Wie kann ich noch testen, wo es hängt?
Für alle Hilfe vielen Dank.
Falls folgendes weiterhilft:
Ich hab erst mal einen Fehlercheck gemacht mit:
error_reporting(E_ALL);
ini_set('display_errors', 1);
==> Es werden keine Fehlermeldungen ausgegeben.
Dann hab ich einen Datenbank-Verbindungstest gemacht:
error_reporting(E_ALL);
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', 'root' );
define ( 'MYSQL_KENNWORT', '' );
define ( 'MYSQL_DATENBANK', 'dvd' );
$db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( $db_link )
{
echo 'Verbindung erfolgreich: ';
echo $db_link;
}
else
{
die('keine Verbindung möglich: ' . mysql_error());
}
mysql_close($db_link );
==> Verbindung erfolgreich: Resource id #5
-------------------------------
Hab dann mal versucht herauszufinden, was überhaupt zurückgegeben wird bzw. ob etwas erfolgreich eingetragen wird.
$res = mysql_query($mysqli);
if ($res)
{
echo 'all done';
}
else
{
echo 'Datensatz wurde nicht eingetragen!';
}
==>
Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\dvdedition.php on line 239
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\xampp\htdocs\dvdedition.php on line 239
Datensatz wurde nicht eingetragen!
Aber der Verbindungstest war doch erfolgreich.
Und wenn ich die PHP wieder Stück für Stück aufbaue, dann funktioniert es sicher wieder. Hab ja von allem ein schreibgeschütztes Backup angelegt, wenn es funktionierte.
Gibt es irgendwelche Maximalgrößen für die Anzahl der Variablen eines Arrays oder sowas? Aber es hat ja wie gesagt schon funktioniert.
Hi,
Aber der Verbindungstest war doch erfolgreich.
Dummerweise hat irgendein Copy&Paste-Esel die Verbindung aber wieder geschlossen, bevor versucht wird die Abfrage zu machen.
MfG ChrisB
Hi,
Aber der Verbindungstest war doch erfolgreich.
Dummerweise hat irgendein Copy&Paste-Esel die Verbindung aber wieder geschlossen, bevor versucht wird die Abfrage zu machen.
MfG ChrisB
Das sind doch zwei getrennte Codes.
Ich bekomme doch nach dem Test die Meldung:
==> Verbindung erfolgreich: Resource id #5
Die Verbindung wird nach der erfolgreichen Anfrage geschlossen oder nicht?
Hi,
Ich bekomme doch nach dem Test die Meldung:
==> Verbindung erfolgreich: Resource id #5
Ja, schön.
Zu dem Zeitpunkt, wo du die Abfrage machen willst, liegt aber offenbar keine Datenbankverbindung vor.
Die Verbindung wird nach der erfolgreichen Anfrage geschlossen oder nicht?
Nein, erst zum Scriptende, oder wenn du das selber explizit machst.
MfG ChrisB
Hab es jetzt mal umgestellt...ja es liegt offenbar keine Verbindung zur DB vor. Wenn ich einfüge
if ( $db_link )
{
echo 'Verbindung erfolgreich: ';
echo $db_link;
}
else
{
die('keine Verbindung möglich: ' . mysql_error());
}
erscheint: keine Verbindung möglich.
Nach Einfügen an den Skriptanfang von
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', 'root' );
define ( 'MYSQL_KENNWORT', '' );
define ( 'MYSQL_DATENBANK', 'dvd' );
$db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
wird ja dann eine Verbindung zumindest aufgebaut und es erscheint:
Verbindung erfolgreich: Resource id #4
Catchable fatal error: Object of class mysqli could not be converted to string in C:\xampp\htdocs\dvdedition.php on line 261.
So, hab jetzt nochmal ein genaues Debugging versucht und zumindets einen kleinen Hinweis darauf, woran es liegt.
Ich hatte das Problem ja schon mal vor ca. 1-2 Wochen in ähnlicher Form hier gepostet.
Die Verbindung zur DB besteht; es sind offenbar tatsächlich die übergebenen Daten selbst.
Da scheint es bei 1-2 Feldern irgendwie Probleme zu geben. Das ist irgendwie total krank. Alles ist auf varchar gestellt, damit auch wirklich alles akzeptiert wird und dann blockiert wahrscheinlich irgendein Zeichen oder nicht übergebenes Zeichen die Übermittlung des gesamten Datensatzes.
Hi,
Da scheint es bei 1-2 Feldern irgendwie Probleme zu geben. Das ist irgendwie total krank. Alles ist auf varchar gestellt, damit auch wirklich alles akzeptiert wird und dann blockiert wahrscheinlich irgendein Zeichen oder nicht übergebenes Zeichen die Übermittlung des gesamten Datensatzes.
D.h. also, du hast das, was dir hier: </archiv/2011/3/t203791/#m1378770> bereits gesagt wurde, immer noch nicht berücksichtigt.
Dann wird's aber verflixt noch mal Zeit!
MfG ChrisB
Ich weiß, da geh ich jetzt dran. :-)
Der näcste Schritt ist das Einfügen einer Ausgabe, ob der Datensatz erfolgreich war und evtl. eine Validierung der Daten.
Dies kann ich aber evtl. schnell so umsetzen, dass ich Werte in einem Dropdown-Menü vorgebe. Dann bleiben eingetragene Werte immer gleich.
Und dann ist der Kontextwechsel dran.
Hi,
Der näcste Schritt ist das Einfügen einer Ausgabe, ob der Datensatz erfolgreich war und evtl. eine Validierung der Daten.
Dies kann ich aber evtl. schnell so umsetzen, dass ich Werte in einem Dropdown-Menü vorgebe. Dann bleiben eingetragene Werte immer gleich.
Nein, auch dann bleibt dein Script anfällig für SQL Injection, so lange du keine Maßnahmen dagegen ergreifst.
Und dann ist der Kontextwechsel dran.
Nein, der ist erst dran, jetzt sofort. Muss er, wenn du das vernünftig umsetzen willst.
MfG ChrisB
Ok, ich setze den Kontextwechsel erst um.
Hab mich in die Seite http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel jetzt eingelesen, aber mit der Umsetzung noch etwas Schwierigkeiten.
Also meine verwendete PHP-Extnsion ist mysqli, deshalb ändere ich:
'{$_POST['dvd_titel_originaltitel']}',
in
'" .mysqli_real_escape_string( $dvd_asin ). "',
VALUES ('" .mysqli_real_escape_string( $dvd_dvdid ). "',
'" .mysqli_real_escape_string( $dvd_asin ). "',
'" .mysqli_real_escape_string( $dvd_originaltitel ). "',
usw.
Ich bekomme allerdings die Fehlermeldung
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in C:\xampp\htdocs\dvdedition.php on line 27
==> Damit ist die Zeile mit dvd_dvdid gemeint.
Welchen zweiten Parameter erwartet er?
Wahrscheinlich ist damit das Beispiel um sprintf() gemeint, aber was genau soll ich da umsetzen?
Und muss in der HTML-Seite, die die Werte übergibt auch etwas geändert werden?
Da lautet der Abschnitt
<tr>
<td>
ASIN:
</td>
<td>
<input type="text" name="dvd_asin" value="{$detail_asin}" size="12" maxlength="12"/>
</td>
</tr>
Hi,
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in C:\xampp\htdocs\dvdedition.php on line 27
Welchen zweiten Parameter erwartet er?
RTFM!
Lies sowas bitte im Handbuch nach.
MfG ChrisB
Hi!
$db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
[...]
$res = mysql_query($mysqli);
Wo kommt auf einmal $mysqli her? (Für diese Stelle scheint auch das error_reporting nicht auf E_ALL gesetzt worden zu sein.)
Lo!
Wo kommt auf einmal $mysqli her? (Für diese Stelle scheint auch das error_reporting nicht auf E_ALL gesetzt worden zu sein.)
case 'new':
$mysqli->query("INSERT INTO movie
(dvdid, asin, originaltitel, titel_deutsch, produktionsjahr, director, writer, film_cinema_release, genre_1, subgenre_1, genre_2, subgenre_2, first_release, german_release, anzahl_dvds)
VALUES ('{$_POST['dvd_dvdid']}',
'{$_POST['dvd_asin']}',
'{$_POST['dvd_originaltitel']}',
'{$_POST['dvd_titel_deutsch']}',
'{$_POST['dvd_produktionsjahr']}',
'{$_POST['dvd_director']}',
'{$_POST['dvd_writer']}',
'{$_POST['dvd_film_cinema_release']}',
'{$_POST['dvd_genre_1']}',
'{$_POST['dvd_subgenre_1']}',
'{$_POST['dvd_genre_2']}',
'{$_POST['dvd_subgenre_2']}',
'{$_POST['dvd_first_release']}',
'{$_POST['dvd_german_release']}',
{$_POST['dvd_anzahl_dvds']}
)");
break;