Kein Insert / Keine Fehlermeldung
Bernd
- mysqli
- php
Hallo,
ich habe folgendes Insert und Update. Wenn ich einen neuen Eintrag erstellt passiert nichts, auch wird mir keine Fehlermeldung ausgegeben wenn ich
error_reporting(E_ALL);
ini_set('display_errors', 1);
eingeschalten habe. Seht ihr vielleicht ein Fehler? Anzumerken ist noch ich habe in der Datenbank mehr Felder wie ich sie per Insert befülle, dieses muss ich doch nicht beachten? Wenn ein Wert nicht da ist wird dieser einfach übersprungen?
if(isset($_POST['abschicken'])){
$artikelCode = md5(uniqid());
if(empty($_POST['a_titel'])) {
$errors[] = "Bitte geben Sie einen Titel ein";
}
if(isset($_POST['abschicken']) && empty($errors)) {
if(isset($_GET['artikel'])) {
if ($stmt = $mysqli->prepare("Update artikel SET
a_lager=?, a_lagerflaeche=?, a_titel=?, a_beschreibung=?, a_massel=?, a_masseb=?,
a_tiefeb=?, a_masseinklverpackungl=?, a_masseinklverpackungb=?,
a_tiefeinklverpackungb=?, a_gewicht=?, a_gewichtinklverpackung=?,
a_sollbestand=?, a_istbestand=?, a_bestandgestohlen=?, a_status=?,
a_hinzugefuegt=?, a_bearbeitet=?, a_istunterwegs=?, a_produzierterBestand=?,
a_anummer=?, a_katID=?, a_zusatz=?, a_farbe=?, a_preis=?, a_was=?
WHERE a_code = ?"))
{
$a_lager = $_POST["a_lager"];
$a_lagerflaeche = $_POST["a_lagerflaeche"];
$a_titel = $_POST["a_titel"];
$a_beschreibung = $_POST["a_beschreibung"];
$a_massel = $_POST["a_massel"];
$a_masseb = $_POST["a_masseb"];
$a_tiefeb = $_POST["a_tiefeb"];
$a_masseinklverpackungl = $_POST["a_masseinklverpackungl"];
$a_masseinklverpackungb = $_POST["a_masseinklverpackungb"];
$a_tiefeinklverpackungb = $_POST["a_tiefeinklverpackungb"];
$a_gewicht = $_POST["a_gewicht"];
$a_gewichtinklverpackung = $_POST["a_gewichtinklverpackung"];
$a_sollbestand = $_POST["a_sollbestand"];
$a_istbestand = "";
$a_bestandgestohlen = "";
$a_status = $_POST["a_status"];
$a_hinzugefuegt = $a_hinzugefuegt;
$a_bearbeitet = time();
$a_istunterwegs = "";
$a_produzierterBestand = $_POST["a_produzierterBestand"];
$a_anummer = $_POST["a_anummer"];
$a_katID = $_POST["a_katID"];
$a_zusatz = $_POST["a_zusatz"];
$a_farbe = $_POST["a_farbe"];
$a_preis = $_POST["a_preis"];
$a_was = "Möbel";
$stmt->bind_param("sssssssssssssssssssssssssss",
$a_lager,
$a_lagerflaeche,
$a_titel,
$a_beschreibung,
$a_massel,
$a_masseb,
$a_tiefeb,
$a_masseinklverpackungl,
$a_masseinklverpackungb,
$a_tiefeinklverpackungb,
$a_gewicht,
$a_gewichtinklverpackung,
$a_sollbestand,
$a_istbestand,
$a_bestandgestohlen,
$a_status,
$a_hinzugefuegt,
$a_bearbeitet,
$a_istunterwegs,
$a_produzierterBestand,
$a_anummer,
$a_katID,
$a_zusatz,
$a_farbe,
$a_preis,
$a_was,
$a_code
);
}} // Ende $_GET['artikel']
else {
if ($stmt = $mysqli->prepare("INSERT INTO artikel (
a_code, a_lager, a_lagerflaeche, a_titel, a_beschreibung, a_massel, a_masseb, a_tiefeb,
a_masseinklverpackungl, a_masseinklverpackungb, a_tiefeinklverpackungb, a_gewicht,
a_gewichtinklverpackung, a_sollbestand, a_istbestand, a_bestandgestohlen, a_status,
a_hinzugefuegt, a_bearbeitet, a_istunterwegs, a_produzierterBestand, a_anummer,
a_katID, a_zusatz, a_farbe, a_preis, a_was)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?)"))
{
$a_code = $artikelCode;
$a_lager = $_POST["a_lager"];
$a_lagerflaeche = $_POST["a_lagerflaeche"];
$a_titel = $_POST["a_titel"];
$a_beschreibung = $_POST["a_beschreibung"];
$a_massel = $_POST["a_massel"];
$a_masseb = $_POST["a_masseb"];
$a_tiefeb = $_POST["a_tiefeb"];
$a_masseinklverpackungl = $_POST["a_masseinklverpackungl"];
$a_masseinklverpackungb = $_POST["a_masseinklverpackungb"];
$a_tiefeinklverpackungb = $_POST["a_tiefeinklverpackungb"];
$a_gewicht = $_POST["a_gewicht"];
$a_gewichtinklverpackung = $_POST["a_gewichtinklverpackung"];
$a_sollbestand = $_POST["a_sollbestand"];
$a_istbestand = "";
$a_bestandgestohlen = "";
$a_status = $_POST["a_status"];
$a_hinzugefuegt = $a_hinzugefuegt;
$a_bearbeitet = time();
$a_istunterwegs = "";
$a_produzierterBestand = $_POST["a_produzierterBestand"];
$a_anummer = $_POST["a_anummer"];
$a_katID = $_POST["a_katID"];
$a_zusatz = $_POST["a_zusatz"];
$a_farbe = $_POST["a_farbe"];
$a_preis = $_POST["a_preis"];
$a_was = "Möbel";
$stmt->bind_param("sssssssssssssssssssssssssss",
$a_code,
$a_lager,
$a_lagerflaeche,
$a_titel,
$a_beschreibung,
$a_massel,
$a_masseb,
$a_tiefeb,
$a_masseinklverpackungl,
$a_masseinklverpackungb,
$a_tiefeinklverpackungb,
$a_gewicht,
$a_gewichtinklverpackung,
$a_sollbestand,
$a_istbestand,
$a_bestandgestohlen,
$a_status,
$a_hinzugefuegt,
$a_bearbeitet,
$a_istunterwegs,
$a_produzierterBestand,
$a_anummer,
$a_katID,
$a_zusatz,
$a_farbe,
$a_preis,
$a_was
);
}}
$stmt->execute();
if ($_POST['abschicken'] == 'Artikel speichern') {
$targetURL = "artikel-uebersicht.php";
//header("Location: $targetURL");
}
if ($_POST['abschicken'] == 'auf Seite bleiben') {
$targetURL = "artikel-insert.php?artikel=$artikelCode";
header("Location: $targetURL");
}
}
else {
echo $mysqli -> error;
}
};
Tach!
ich habe folgendes Insert und Update. Wenn ich einen neuen Eintrag erstellt passiert nichts, auch wird mir keine Fehlermeldung ausgegeben wenn ich
error_reporting(E_ALL); ini_set('display_errors', 1);
eingeschalten habe.
Datenbank-Fehler sind keine PHP-Fehler. Die PHP-Meldungen zu konfigurieren bringt dafür nichts. Man kann DBMS-Fehlermeldungen einerseits händisch holen, so wie du es bereits für das Prepare gemacht hast. Das Execute lässt du aber unbeachtet. Auch das meldet, wenn Fehler beim Ausführen auftraten, über seinen Rückgabewert. Andererseits kann man zumindest, wenn man PDO verwendet, konfigurieren, dass für DBMS-Fehler PHP-Exceptions geworfen werden. Ob mysqli das auch kann, weiß ich grad nicht.
Anzumerken ist noch ich habe in der Datenbank mehr Felder wie ich sie per Insert befülle, dieses muss ich doch nicht beachten? Wenn ein Wert nicht da ist wird dieser einfach übersprungen?
Kommt darauf an, was für das Feld konfiguriert ist. Wenn NULL erlaubt ist, wird das eingetragen, wenn nicht, gibt es einen Fehler. Es sei denn, es ist ein Default-Wert konfiguriert, dann wird der genommen.
dedlfix.
Hallo,
Das Execute lässt du aber unbeachtet. Auch das meldet, wenn Fehler beim Ausführen auftraten, über seinen Rückgabewert.
Danke für den Hinweis. Hab es nun so gemacht
$FehlerExecute = $stmt->execute();
if ( false===$FehlerExecute ) {
die('Fehler beim execute: ' . htmlspecialchars($stmt->error));
}
Jetzt erhalte ich folgende Meldung
Fehler beim execute: Column 'a_hinzugefuegt' cannot be null
Das heißt, das Feld a_hinzugefuegt darf nicht leer sein, richtig?
Nachtrag, sollte man
auch auf Fehler abfragen oder reicht execute=
Hallo Bernd,
jeder mysqli-Aufruf, bei dem in der Doku steht, dass er im Fehlerfall einen speziellen Wert liefert, kann auch auf einen Fehler laufen. Ob Du sinnvoll aus dem Fehler herauskannst, oder nur loggen und abbrechen, ist natürlich eine andere Frage.
Also: Prepare, Bind und Execute müssen allesamt überprüft werden.
Um deinen Code übersichtlicher zu machen, könntest Du das Befüllen der gebundenen Variablen vorziehen (a_lager bis a_was). Wenn Du den Insert etwas änderst, so dass a_code als letztes in der Column-Liste steht (das geht, auch wenn die Table ein anderes Layout hat), dann sollten auch beide Parameter-Binds identisch sein und du brauchst den Bind nicht zu doppeln.
Rolf
Fehler beim execute: Column 'a_hinzugefuegt' cannot be null
Das heißt, das Feld a_hinzugefuegt darf nicht leer sein, richtig?
Nein das ist falsch geschlussfolget. Denn: Null und Leer(string) sind nicht dasselbe. Wenn Du bei der Datenerfassung nicht sicherstellen kannst daß für alle Felder Daten geliefert werden, ist ggf. ein default sinnvoll. MFG