Kein Insert wenn Feld leer
Bernd
- php
Hallo,
ich verstehe nicht wirklich warum mein Insert nicht erfolgreich ist
if ($_POST["avd_grund"] == "80") {
if ($_POST["avd_pid"] == "") {
$heute = date("d.m.Y");
} else {
$heute = $p_bis;
}
// Artikel in Kalender eintragen
$begin = new DateTime( $heute );
$end = new DateTime( "31.12.2018" );
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
if ($stmt_datum_kalender = $mysqli->prepare("
INSERT INTO artikel_ausgeliehen (
aa_artikelID, aa_projektID, aa_userID, aa_menge, aa_datum,
aa_status, aa_grund, aa_code)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)")) {
$aa_artikelID = $CodeArtikel;
$aa_datum = $date->format("Y-m-d");
$aa_projektID = $CodeProjekt;
$aa_userID = $p_userID;
$aa_menge = $_POST["avd_menge"];
$aa_status = "4";
$aa_grund = "80";
$aa_code = $ADCode;
$stmt_datum_kalender->bind_param("ssssssss", $aa_artikelID, $aa_projektID, $aa_userID,
$aa_menge, $aa_datum, $aa_status, $aa_grund,
$aa_code);
$stmt_datum_kalender->execute();
} else {
echo $mysqli -> error;
}
}
}
Wenn $_POST["avd_grund"] nicht leer ist, dann wird das Insert erfolgreich durchgeführt, wenn es leer ist, steht einfach nichts in der Tabelle. Ich habe die Vermutung es stimmt etwas mit if ($_POST["avd_pid"] == "") nicht? Lasse ich $heute ausgeben, stimmt das Datum.
Ich verstehe es wirklich nicht. Seht ihr den Fehler?
Tach!
if ($_POST["avd_grund"] == "80") { // ... }
Wenn $_POST["avd_grund"] nicht leer ist, dann wird das Insert erfolgreich durchgeführt, wenn es leer ist, steht einfach nichts in der Tabelle. Ich habe die Vermutung es stimmt etwas mit if ($_POST["avd_pid"] == "") nicht? Lasse ich $heute ausgeben, stimmt das Datum.
Ich verstehe es wirklich nicht. Seht ihr den Fehler?
Fehler? Ich weiß ja nicht, wann deine Anwendung was tun soll. Ich sehe nur, dass entgegen deiner Beschreibung in $_POST["avd_grund"] eine 80 enthalten sein muss und nicht "nicht leer". Alle anderen Werte, inklusive "leer", führen dazu, dass der Code gar nicht ausgeführt wird.
dedlfix.
Hallo,
sorry da war ein Fehler von mir in der Beschreibung. Der Fehler liegt wohl in diesem Bereich
if ($_POST["avd_pid"] == "") {
$heute = date("d.m.Y");
} else {
$heute = $p_bis;
}
Wenn $_POST["avd_pid"] leer ist, dann wird kein Eintrag gemacht, wenn ich eine Projekt ID hinterlege wird der Eintrag richtig ausgeführt.
Obwohl ich doch sage, wenn $_POST["avd_pid"] leer ist, soll das heutige Datum eingefügt werden.
Tach!
sorry da war ein Fehler von mir in der Beschreibung.
Du meist als, der Inhalt von $_POST["avd_grund"] ist korrekterweise 80.
Der Fehler liegt wohl in diesem Bereich
if ($_POST["avd_pid"] == "") { $heute = date("d.m.Y"); } else { $heute = $p_bis; }
Oder nachfolgend. Wie lautet denn die Bedingung, dass Einträge erfolgen? $daterange muss Einträge enthalten, damit der Inhalt von foreach, sprich: das Insert, ausgeführt werden kann. Hast du überprüft, dass deine Datumsberechnung das gewünschte Ergebnis bringt? Besonders wenn du mit deutscher statt internationaler Schreibweise arbeitest?
dedlfix.
Hallo,
$_POST["avd_grund"] == 80 stimmt. Einträge sollen immer erfolgen, da immer ein Datum vorhanden ist. Entweder kommt dieses aus $p_bis oder eben aus date("d.m.Y"). Dieses wollte ich so festlegen
if ($_POST["avd_pid"] == "") {
$heute = date("d.m.Y");
} else {
$heute = $p_bis;
}
$begin = new DateTime( $heute );
Und bei $daterange as $date habe ich dann folgendes
$aa_datum = $date->format("Y-m-d");
Hallo,
Entweder kommt dieses aus $p_bis
wo kommt denn p_bis her? Auch aus $POST?
Gruß
Kalk
Hallo,
wo kommt denn p_bis her? Auch aus $POST?
nein, aus einer anderen Abfrage, die ein Stück weiter oben ist
$stmt_PI = $mysqli->prepare("SELECT p_code AS CodeProjekt,
p_userID, p_von, p_bis
FROM projekte WHERE p_id=?");
$stmt_PI->bind_param("s", $_POST["avd_pid"]);
$stmt_PI->execute();
$stmt_PI->bind_result($CodeProjekt, $p_userID, $p_von, $p_bis);
$stmt_PI->fetch();
$stmt_PI->close();
Tach!
Einträge sollen immer erfolgen, da immer ein Datum vorhanden ist. Entweder kommt dieses aus $p_bis oder eben aus date("d.m.Y"). Dieses wollte ich so festlegen
Wenn da was nicht funktioniert, wie es soll, musst du nun Debugging betreiben. Stimmen denn die Zwischenergebnisse der einzelnen Schritte mit den erwarteten Werten überein? Irgendwo muss ja eine Abweichung sein zu dem was du geplant hast. Wo also ist sie? Ich kann dir dann vielleicht den Grund sagen, falls du ihn dann nicht selbst erkennst, aber das Debugging möchte ich dir nicht abnehmen.
dedlfix.
Hallo,
es kann nur an diesem Teil liegen
if ($_POST["avd_pid"] == "") {
$heute = date("d.m.Y");
} else {
$heute = $p_bis;
}
wenn ich eine Projekt ID (avd_pid) eintrage wird es richtig eingetragen. Bleibt das Feld leer habe ich keinen Eintrag.
ini_set('display_errors', 1);
echo $mysqli -> error;
bringt kein Fehler. Wenn ich mir alles ausgeben lasse
echo $_POST["avd_grund"];
echo "<br>";
echo $heute;
echo "<br>";
echo $_POST["avd_pid"];
steht bei $heute; das richtige Datum. Entweder dieses von $p_bis oder date("d.m.Y"); Deshalb verstehe ich es nicht. Was soll ich denn sonst noch machen?
Es könnte vielleicht auch noch etwas damit zu tun haben
$begin = new DateTime( $heute );
Weil wenn das Feld leer ist, kommt das Datum von date(); Hmm kann ich mir aber nicht vorstellen.
Wenn ich mir
var_dump($begin);
ausgeben lasse, erhalte ich folgendes:
object(DateTime)#6 (3) { ["date"]=> string(26) "2018-10-25 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" }
Und wenn ich mir var_dump($date->format("Y-m-d")); innerhalb foreach($daterange as $date) ausgeben lasse erhalte ich folgendes
object(DateTime)#6 (3) { ["date"]=> string(26) "2018-10-25 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" } string(10) "2018-10-25" string(10) "2018-10-26" string(10) "2018-10-27" string(10) "2018-10-28" string(10) "2018-10-29" string(10) "2018-10-30" string(10) "2018-10-31" string(10) "2018-11-01" string(10) "2018-11-02" string(10) "2018-11-03" string(10) "2018-11-04" string(10) "2018-11-05" string(10) "2018-11-06" string(10) "2018-11-07" string(10) "2018-11-08" string(10) "2018-11-09" string(10) "2018-11-10" string(10) "2018-11-11" string(10) "2018-11-12" string(10) "2018-11-13" string(10) "2018-11-14" string(10) "2018-11-15" string(10) "2018-11-16" string(10) "2018-11-17" string(10) "2018-11-18" string(10) "2018-11-19" string(10) "2018-11-20" string(10) "2018-11-21" string(10) "2018-11-22" string(10) "2018-11-23" string(10) "2018-11-24" string(10) "2018-11-25" string(10) "2018-11-26" string(10) "2018-11-27" string(10) "2018-11-28" string(10) "2018-11-29" string(10) "2018-11-30" string(10) "2018-12-01" string(10) "2018-12-02" string(10) "2018-12-03" string(10) "2018-12-04" string(10) "2018-12-05" string(10) "2018-12-06" string(10) "2018-12-07" string(10) "2018-12-08" string(10) "2018-12-09" string(10) "2018-12-10" string(10) "2018-12-11" string(10) "2018-12-12" string(10) "2018-12-13" string(10) "2018-12-14" string(10) "2018-12-15" string(10) "2018-12-16" string(10) "2018-12-17" string(10) "2018-12-18" string(10) "2018-12-19" string(10) "2018-12-20" string(10) "2018-12-21" string(10) "2018-12-22" string(10) "2018-12-23" string(10) "2018-12-24" string(10) "2018-12-25" string(10) "2018-12-26" string(10) "2018-12-27" string(10) "2018-12-28" string(10) "2018-12-29" string(10) "2018-12-30" string(10) "2018-12-31" 80
Tach!
es kann nur an diesem Teil liegen
if ($_POST["avd_pid"] == "") { $heute = date("d.m.Y"); } else { $heute = $p_bis; }
Nicht spekulieren sondern kontrollieren. Der Teil macht eine Variablenzuweisung. Also kann man danach mit var_dump($heute);
nachschauen, ob der gewünschte Wert drin liegt.
wenn ich eine Projekt ID (avd_pid) eintrage wird es richtig eingetragen. Bleibt das Feld leer habe ich keinen Eintrag.
ini_set('display_errors', 1); echo $mysqli -> error;
bringt kein Fehler.
Dann wirst du vielleicht einen logischen Fehler im Ablauf haben.
Wenn ich mir alles ausgeben lasse
echo $_POST["avd_grund"]; echo "<br>"; echo $heute; echo "<br>"; echo $_POST["avd_pid"];
steht bei $heute; das richtige Datum.
Das ist aber nicht "alles", sondern nur einer der Teile, die vor dem Ausführen der Query durchlaufen werden.
Es könnte vielleicht auch noch etwas damit zu tun haben
$begin = new DateTime( $heute );
Weil wenn das Feld leer ist, kommt das Datum von date(); Hmm kann ich mir aber nicht vorstellen.
Nicht spekulieren sondern kontrollieren.
dedlfix.
Hallo,
wenn ich mir
var_dump($heute);
ausgebe, dann erhalte ich
string(10) "25.10.2018"
also stimmt was in $heute steht.
Tach!
wenn ich mir
var_dump($heute);
ausgebe, dann erhalte ich
string(10) "25.10.2018"
also stimmt was in $heute steht.
Ja gut, aber das ist ja noch nicht alles an Verarbeitung, bevor es zum Insert kommt. Auch das solltest du kontrollieren.
dedlfix.
Hallo,
ich habe hier doch schon alle Prüfungen gemacht?
https://forum.selfhtml.org/self/2018/oct/25/kein-insert-wenn-feld-leer/1735037#m1735037
Hallo,
wenn ich folgendes ausführe:
$p_bis = "27.10.2018";
$_POST["avd_pid"] = "";
if ($_POST["avd_pid"] == "") {
$heute = date("d.m.Y");
} else {
$heute = $p_bis;
}
$begin = new DateTime( $heute );
$end = new DateTime( "30.10.2018" );
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
echo $date->format("Y-m-d");
echo "<br>";
}
erhalte ich folgendes
2018-10-25
2018-10-26
2018-10-27
2018-10-28
2018-10-29
2018-10-30
Wenn Projekt - ID nicht leer ist
$_POST["avd_pid"] = "oipipoi";
erhalte ich folgendes
2018-10-27
2018-10-28
2018-10-29
2018-10-30
Ich verstehe die Welt nicht mehr.
Tach!
ich habe hier doch schon alle Prüfungen gemacht?
https://forum.selfhtml.org/self/2018/oct/25/kein-insert-wenn-feld-leer/1735037#m1735037
Da hatte ich schneller mit meiner Antwort begonnen, als du mit deinen Korrekturen fertig warst.
wenn ich folgendes ausführe:
$p_bis = "27.10.2018";
... dann hast du einen Wert per Hand vorgegeben. Vielleicht kommt er ja verkehrt/anders, wenn er aus der Abfrage kommt?
dedlfix.
Hallo,
jetzt wird es immer kurioser. Hab jetzt folgendes gemacht
if ($_POST["avd_grund"] == "80") {
if ($_POST["avd_pid"] == "") {
$heute = date("d.m.Y");
} else {
$heute = $p_bis;
}
$begin = new DateTime( $heute );
$end = new DateTime( "30.10.2018" );
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
echo $date->format("Y-m-d");
echo "<br>";
}
}
Also mit den Werten was aus der Datenbank kommt. Wird alles richtig angezeigt
Einmal mit $p_bis gefüllt
2018-09-29
2018-09-30
2018-10-01
2018-10-02
2018-10-03
2018-10-04
2018-10-05
2018-10-06
2018-10-07
2018-10-08
2018-10-09
2018-10-10
2018-10-11
2018-10-12
2018-10-13
2018-10-14
2018-10-15
2018-10-16
2018-10-17
2018-10-18
2018-10-19
2018-10-20
2018-10-21
2018-10-22
2018-10-23
2018-10-24
2018-10-25
2018-10-26
2018-10-27
2018-10-28
2018-10-29
2018-10-30
einmal ist $p_bis leer
2018-10-25
2018-10-26
2018-10-27
2018-10-28
2018-10-29
2018-10-30
man kann schon an der Menge erkennen dass es richtig funktioniert. Dann kann es eigentlich nur noch an meinem foreach und dem insert liegen. Dazu eine Frage, wenn
$aa_projektID = $CodeProjekt;
leer ist, dann wird einfach nichts eingetragen? Dürfte ja zu keinem Abbruch kommen? Wenn doch, müsste ich diesen hier
echo $mysqli -> error;
sehen? Daher gehe ich mal stark davon aus, an diesem kann es auch nicht liegen?
EDIT: Ok, daran kann es nicht liegen, denn folgendes bringt auch keine Besserung
if ($CodeProjekt == "") {
$aa_projektID = "";
} else {
$aa_projektID = $CodeProjekt;
}
Ich weiß dass du möchtest dass ich den Fehler selber finden, nur aus Neugier, weißt du wo der Fehler liegt?
Tach!
Dazu eine Frage, wenn
$aa_projektID = $CodeProjekt;
leer ist, dann wird einfach nichts eingetragen? Dürfte ja zu keinem Abbruch kommen? Wenn doch, müsste ich diesen hier
echo $mysqli -> error;
sehen?
Nö, dein Code testet nur, ob das Prepare erfolgreich war. Wenn das Execute misslingt, passiert das ohne Prüfung und ohne Ausgabe. Du hast ja nur ein if-else und kein try-catch, das bei allen Fehlern innerhalb des try-Blocks anschlagen würde.
Daher gehe ich mal stark davon aus, an diesem kann es auch nicht liegen? Ich weiß dass du möchtest dass ich den Fehler selber finden, nur aus Neugier, weißt du wo der Fehler liegt?
Ich möchte den Fehler nicht selbst suchen, weil Fehlersuche zum Programmieren gehört und geübt werden muss. Ich weiß nicht, was die Ursache in deinem Fall ist. Beim Trockenschwimmen-Debugging allein durch Codeanschauen übersehe ich üblicherweise viele Dinge, die ich beim Debugging am lebenden Modell erkennen würde. Deswegen lass ich das meist recht schnell, wenn der Fehler nicht gleich ins Auge springt. Das ist mir sonst vertane Zeit, weil ich ja dann doch mit dem Debugging anfangen muss. Da ich nun aber deine Bedingungen hier nicht vorliegen haben, kann ich auch da nichts großartiges selbst tun. Oder anders ausgedrückt: Ich möchte dir die Werkzeuge und Vorgehensweisen erklären, aber dir nicht die Arbeit (nebst Sammeln von Erfahrung) damit abnehmen.
dedlfix.
Hallo,
dann weiß ich leider auch nicht mehr weiter. Ich sitze seit heute Morgen 7 Uhr an diesem Script und es frustrierend wenn man nicht weiter kommt.
Danke für die Hilfe.
Tach!
dann weiß ich leider auch nicht mehr weiter. Ich sitze seit heute Morgen 7 Uhr an diesem Script und es frustrierend wenn man nicht weiter kommt.
Kenn ich, lässt sich aber nur ändern, indem man gezielt an die Ursachenermittlung geht.
Stimmen die Eingangswerte? Stimmen die Zwischenergebnisse? Werden die Codeteile wie erwartet abgearbeitet? Gibts Meldungen in den Logfiles? Hab ich alle Funktionsrückgabewerte berücksichtigt, besonders die, die Fehlerzustände signalisieren.
Um zum Beispiel zu prüfen, ob das Execute durchlaufen wird, kannst du davor und danach eine Ausgabe setzen. Wenn die zweite Ausgabe fehlt, gabs da vielleicht einen Fehler, den du nicht abgefangen hast. Aber da wirst du in dem Falle nichts sehen, weil die DBMS-Funktionen keine PHP-Feher erzeugen, wenn es sich um ein Datenbankproblem handelt. Die laufen problemlos durch und jammern nur leise.
Was du jetzt noch nicht hast, ist eine Auswertung des Rückgabewertes von execute(). Ein Prepare kann durchlaufen, weil da noch kein Syntaxfehler erkennbar ist. Aber wenn einer der gebundenen Werte nicht im Wertebereich des Zielfeldes ist, dann scheitert das Execute. Deswegen gehört da auch eine Auswertung hin.
dedlfix.
Hallo,
wenn ich es hier richtig verstanden habe:
https://stackoverflow.com/questions/2552545/mysqli-prepared-statements-error-reporting
Dann müsste ich es wie folgt umsetzten
foreach($daterange as $date){
$stmt_datum_kalender = $mysqli->prepare("
INSERT INTO artikel_ausgeliehen (
aa_artikelID, aa_projektID, aa_userID, aa_menge, aa_datum, aa_status, aa_grund, aa_code)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
if ( false===$stmt_datum_kalender ) {
die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}
$aa_artikelID = $CodeArtikel;
if ($_POST["avd_pid"] == "") {
$aa_projektID = "";
} else {
$aa_projektID = $CodeProjekt;
}
$aa_userID = $p_userID;
$aa_menge = $_POST["avd_menge"];
$aa_datum = $date->format("Y-m-d");
$aa_status = "4";
$aa_grund = "80";
$aa_code = $ADCode;
$stmt_datum_kalender->bind_param("ssssssss", $aa_artikelID, $aa_projektID, $aa_userID, $aa_menge, $aa_datum, $aa_status, $aa_grund, $aa_code);
if ( false===$stmt_datum_kalender ) {
// again execute() is useless if you can't bind the parameters. Bail out somehow.
die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}
$stmt_datum_kalender->execute();
if ( false===$stmt_datum_kalender ) {
die('execute() failed: ' . htmlspecialchars($stmt->error));
}
}
Aber auch hier 0 Fehler.
Tach!
wenn ich es hier richtig verstanden habe:
https://stackoverflow.com/questions/2552545/mysqli-prepared-statements-error-reportingDann müsste ich es wie folgt umsetzten
Im Prinzip ja, aber die()
ist nur die Quick- und vor allem Dirty-Variante. Abbrechen und Fehlermeldung hinwerfen geht nur zum Testen, ist aber für den Produktivbetrieb nur bei ganz fatalen Problemen vertretbar, und auch da sollte man sich das gut überlegen. Das ist hier eher nicht der Fall.
Abgesehen davon sind die typsicheren Vergleiche auch nicht notwendig, die Funktionen geben keine Werte zurück, die man mit false verwechseln könnte.
Aber auch hier 0 Fehler.
Hmm, schaust du auch in der richtigen Datenbank nach? Nicht dass die Werte anderenorts eingetragen werden.
Gibt es in der Tabelle ein Feld mit auto_increment? Wenn ja, lass dir die ID mal nach dem Execute mit insert_id anzeigen.
dedlfix.
Hallo,
ich habe jetzt im INSERT einfach mal ein Fehler eingebaut und das Script bricht ab mit folgender Meldung
prepare() failed: Unknown column 'aak_userID' in 'field list'
Damit würde ich behaupten, ich bin in der richtigen Datei und in der richtigen Datenbank sowie in der richtigen Tabelle.
Gibt es in der Tabelle ein Feld mit auto_increment? Wenn ja, lass dir die ID mal nach dem Execute mit insert_id anzeigen.
Folgendes
$stmt_datum_kalender->execute();
$letzteID = $mysqli->insert_id;
echo $letzteID;
ergibt
00000000000000000000000000000000000000000000000000000000000000000000
Ich würde sagen, stimmt nicht.
Tage ich eine Projekt-ID ein, erhalte ich folgende Ausgabe
229675 229676 229677 229678 229679 229680 229681 usw.....
Tach!
Gibt es in der Tabelle ein Feld mit auto_increment? Wenn ja, lass dir die ID mal nach dem Execute mit insert_id anzeigen.
Folgendes ... ergibt
00000000000000000000000000000000000000000000000000000000000000000000
Ich würde sagen, stimmt nicht.
Sieht so aus, als ob das Execute ausgeführt wird, nur nichts einträgt. Vielleicht doch ein Fehler. Schau noch mal genau hin, was der Rückgabewert von execute() ist.
dedlfix.
Hallo,
ich habe den Fehler gefunden
foreach($daterange as $date){
$stmt_datum_kalender = $mysqli->prepare("
INSERT INTO artikel_ausgeliehen (
aa_artikelID, aa_projektID, aa_userID, aa_menge, aa_datum, aa_status,
aa_grund, aa_code)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
if ( false === $stmt_datum_kalender ) {
die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}
$aa_artikelID = $CodeArtikel;
if ($_POST["avd_pid"] == "") {
$aa_projektID = "";
} else {
$aa_projektID = $CodeProjekt;
}
if ($p_userID == "") {
$aa_userID = "";
} else {
$aa_userID = $p_userID;
}
$aa_menge = $_POST["avd_menge"];
$aa_datum = $date->format("Y-m-d");
$aa_status = "4";
$aa_grund = "80";
$aa_code = $ADCode;
$stmt_datum_kalender->bind_param("ssssssss",
$aa_artikelID, $aa_projektID, $aa_userID, $aa_menge, $aa_datum,
$aa_status, $aa_grund, $aa_code);
if ( false === $stmt_datum_kalender ) {
die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}
$stmt_datum_kalender->execute();
$letzteID = $mysqli->insert_id;
echo $letzteID;
if ( false === $stmt_datum_kalender ) {
die('execute() failed: ' . htmlspecialchars($stmt->error));
}
}
Es lag an dieser Zeile
$aa_userID = $p_userID;
Denn keine Projekt-ID hinterlegt war, ist natürlich $p_userID auch leer. Nur warum hat er dann das INSERT nicht gemacht? Ein leeres Feld darf doch vorkommen und warum wurde dieses nicht als Fehler ausgegeben?
Tach!
Denn keine Projekt-ID hinterlegt war, ist natürlich $p_userID auch leer. Nur warum hat er dann das INSERT nicht gemacht? Ein leeres Feld darf doch vorkommen und warum wurde dieses nicht als Fehler ausgegeben?
Wirklich nicht? War das Ergebnis von execute() in dem Fall true?
Und "leer" ist kein eindeutiger Wert. Es gibt mindestens Leerstrings und NULL, vielleicht auch 0, und man kann auch noch Default-Werte konfigurieren, wenn NULL nicht erlaubt ist.
dedlfix.
Hallo Bernd,
das Errorhandling von bind_param und execute ist kaputt. Keine Ahnung, aus welcher Vorlage Du das hast. Damit deine Abfrage funktioniert, müsste der Inhalt von $stmt_datum_kalender bei einem Fehler zu FALSE mutieren. Sowas passiert nicht. Statt dessen geben die beiden Methoden TRUE oder FALSE zurück, je nach Erfolg. Das musst Du abfragen.
Und den Fehlergrund findest Du nicht in der (möglicherweise undefinierten) Variablem $stmt, sondern ...?
Mit diesem Fix hier komme ich auch nicht klar:
if ($p_userID == "") {
$aa_userID = "";
} else {
$aa_userID = $p_userID;
}
Diese Abfrage hat - im Vergleich der einfachen Zuweisung die da vorher stand - nur dann irgendeinen Effekt, wenn $p_userID den Wert NULL hat. Demzufolge solltest Du auch ausdrücklich auf NULL abfragen. Verwendest Du PHP 7? Dann kannst Du den "NULL Coalescing Operator" ?? verwenden. Frei übersetzt: Den Nullersatz-Operator. Mit $a ?? $b
bekommst Du den Wert von $a, solange es nicht NULL ist. IST es NULL, bekommst Du den Ersatzwert $b.
// PHP 7:
$aa_userID = $p_userID ?? "";
// PHP 5.6:
$aa_userID = $p_userID !== NULL ? $p_userID : "";
Rolf
Hi,
$stmt_datum_kalender = $mysqli->prepare(" if ( false===$stmt_datum_kalender ) { die('prepare() failed: ' . htmlspecialchars($mysqli->error)); }
hier steht der Rückgabewert tatsächlich in $stmt_datum_kalender.
$stmt_datum_kalender->bind_param("ssssssss", $aa_artikelID, $aa_projektID, $aa_userID, $aa_menge, $aa_datum, $aa_status, $aa_grund, $aa_code); if ( false===$stmt_datum_kalender ) {
hier und
$stmt_datum_kalender->execute(); if ( false===$stmt_datum_kalender ) {
hier jedoch nicht - der Rückgabewert wird ja gar nicht aufgefangen.
$stmt_datum_kalender kann hier nicht false sein - wäre es falsch, wäre ja schon der erste die ausgeführt.
Aber auch hier 0 Fehler.
Nö - Du prüfst etwas, was nicht das evtl. auftretende false enthält.
cu,
Andreas a/k/a MudGuard
Tach!
Mal ganz unabhängig vom eigentlichen Fehler ...
foreach($daterange as $date){ if ($stmt_datum_kalender = $mysqli->prepare(" INSERT INTO artikel_ausgeliehen ( aa_artikelID, aa_projektID, aa_userID, aa_menge, aa_datum, aa_status, aa_grund, aa_code) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")) { $aa_artikelID = $CodeArtikel; $aa_datum = $date->format("Y-m-d"); $aa_projektID = $CodeProjekt; $aa_userID = $p_userID; $aa_menge = $_POST["avd_menge"]; $aa_status = "4"; $aa_grund = "80"; $aa_code = $ADCode; $stmt_datum_kalender->bind_param("ssssssss", $aa_artikelID, $aa_projektID, $aa_userID, $aa_menge, $aa_datum, $aa_status, $aa_grund, $aa_code); $stmt_datum_kalender->execute(); } else { echo $mysqli -> error; } }
... der Teil hier ist ein klassischer Fall für die eigentlich vorgesehene Verwendung von Prepared Statements: einmal Statement vorbereiten, mehrfach mit unterschiedlichen Werten ausführen.
Im Prinzip wäre das also sinnvollerweise wie folgt umgesetzt:
Prepare
Binding
foreach {
Werte den gebundenen Variablen zuweisen
Execute
}
Damit spart man sich einmal Prepare und Bind je Schleifendurchlauf, sowie je einen Roundtrip zum DBMS, den das Prepare benötigt.
dedlfix.
Hallo,
danke für die Empfehlung. Gibt es dazu eine Dokumentation im Netz bzw. nach was muss ich suchen? Ich verstehe nicht wie ich das umsetzten soll. Und bringt dein Vorschlag Vorteile?
Tach!
danke für die Empfehlung. Gibt es dazu eine Dokumentation im Netz bzw. nach was muss ich suchen?
Wie wäre es mit dem PHP-Handbuch? Bei mysqli_stmt::bind_param() gibts ein Beispiel mit Insert. Das ist zwar ohne Wiederholung, aber zumindest in der richtigen Reihenfolge, um die Schleife einzubauen.
Und bringt dein Vorschlag Vorteile?
Wie gesagt:
Damit spart man sich einmal Prepare und Bind je Schleifendurchlauf, sowie je einen Roundtrip zum DBMS, den das Prepare benötigt.
dedlfix.