Daten schreiben in mehrere Tabellen gleichzeitg (relationale DB)

cybermailer84

Grünschnabel
Hallo - Eine letzte offene Frage hätte ich noch.

Und zwar habe ich mir jetzt einen Befehl gebaut bei der ich die ID abfange und Informationen
in die Tabelle tbl_rechnungsAdresse & tbl_kunde speichere:

Code:
INSERT INTO tbl_rechnungsAdresse (rechnungsAdresse_firmenbezeichnung, rA.rechnungsAdresse_vorname, rechnungsAdresse_nachname, rechnungsAdresse_telefon, rechnungsAdresse_email, rechnungsAdresse_adresse, rechnungsAdresse_plz, rechnungsAdresse_ort, rechnungsAdresse_vatNo, fk_anrede_id, fk_land_id)
			VALUES ('".$_POST['salut']."', '".$_POST['firstname']."');  
			SET @lastID := LAST_INSERT_ID();
			INSERT INTO tbl_kunde (kunde_bemerkung, fk_rechnungsAdresse_id) 
			VALUES ('".$_POST['kunde_bemerkung']."', @lastID)

Bis dato hatte ich nur einfache INSERTs in 1 Tabelle

-> wie formatiere ich diesen Befehl nun um, sodass der obere Befehl ausgeführt wird:

Code:
if ($valid) {
			$pdo = Database::connect();
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			$sql = "INSERT INTO tbl_rechnungsAdresse (fk_anrede,fk_land,firmenbezeichnung,vorname,nachname,adresse,plz,ort,email,telefon) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
			$q = $pdo->prepare($sql);
			$q->execute(array($fk_anrede,$fk_land,$firmenbezeichnung,$vorname,$nachname,$adresse,$plz,$ort,$email,$telefon));
			Database::disconnect();
			header("Location: customer.php");
		}

Danke.

PS.: Die Values bitte ignorieren
 
Habe mir nun diesen Befehl gebaut:

Code:
// insert data
		if ($valid) {
			$pdo = Database::connect();
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			
			$sql = "INSERT INTO tbl_rechnungsAdresse (fk_anrede_id,fk_land_id,rechnungsAdresse_firmenbezeichnung,rechnungsAdresse_vorname,rechnungsAdresse_nachname,rechnungsAdresse_telefon,rechnungsAdresse_email,rechnungsAdresse_adresse,rechnungsAdresse_plz,rechnungsAdresse_ort,rechnungsAdresse_vatNo) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
			$q = $pdo->prepare($sql);
			$q->execute(array($fk_anrede,$fk_land,$firmenbezeichnung,$vorname,$nachname,$telefon,$email,$adresse,$plz,$ort,$vatNo));

			$last_id = $pdo->lastInsertId();
			
			$sql2 = "INSERT INTO tbl_kunde (kunde_bemerkung, fk_rechnungsAdresse_id) values(?, ?)";
			$q2 = $pdo->prepare($sql2);
			$q2->execute(array($bemerkung,$last_id));
			
			Database::disconnect();
			header("Location: customer.php");
		}

Er beruht auf dieser DB:

Code:
DROP TABLE IF EXISTS tbl_rechnungsAdresse;
CREATE TABLE tbl_rechnungsAdresse (
  rechnungsAdresse_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  fk_anrede_id INT(10) UNSIGNED NOT NULL,
  fk_land_id INT(10) UNSIGNED NOT NULL,
  rechnungsAdresse_firmenbezeichnung VARCHAR(128),
  rechnungsAdresse_vorname VARCHAR(64) NOT NULL,
  rechnungsAdresse_nachname VARCHAR(128) NOT NULL,
  rechnungsAdresse_telefon VARCHAR(64) NOT NULL,
  rechnungsAdresse_email VARCHAR(128) NOT NULL,
  rechnungsAdresse_adresse VARCHAR(128) NOT NULL,
  rechnungsAdresse_plz VARCHAR(10) NOT NULL,
  rechnungsAdresse_ort VARCHAR(128) NOT NULL,
  rechnungsAdresse_vatNo VARCHAR(64),
  PRIMARY KEY (rechnungsAdresse_id),
  CONSTRAINT fk_rechnungsAdresse_anrede FOREIGN KEY (fk_anrede_id) REFERENCES tbl_anrede (anrede_id)
    ON DELETE RESTRICT ON UPDATE CASCADE,
        -- Cannot delete parent record if there is any matching child record
        -- Update the matching child records if parent record is updated
  CONSTRAINT fk_rechnungsAdresse_land FOREIGN KEY (fk_land_id) REFERENCES tbl_land (land_id)
    ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS tbl_kunde;
CREATE TABLE tbl_kunde (
  kunde_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  kunde_bemerkung VARCHAR(255),
  fk_rechnungsAdresse_id INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (kunde_id),
  CONSTRAINT fk_kunde_rechnungsAdresse FOREIGN KEY (fk_rechnungsAdresse_id) REFERENCES tbl_rechnungsAdresse (rechnungsAdresse_id)
    ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Dadurch erhalte ich folgende Fehlermeldung aber:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`d019f940`.`tbl_rechnungsAdresse`, CONSTRAINT `fk_rechnungsAdresse_anrede` FOREIGN KEY (`fk_anrede_id`) REFERENCES `tbl_anrede` (`anrede_id`) ON UPDATE CASCADE)' in /www/htdocs//customer/customer_create.php:89 Stack trace: #0 /www/htdocs//customer/customer_create.php(89): PDOStatement->execute(Array) #1 {main} thrown in /www/htdocs//customer/customer_create.php on line 89

Wahrscheinlich dürfte sich noch ein Fehler im Code befinden ....

Ich komm grad nicht drauf.. - Wenn ich den 2ten SQL INSERT Befehl auskommentiere gehts auch schon nicht....

Danke.
 
Zuletzt bearbeitet:
du hast ein foreignkey auf tbl_anrede und tbl_land.
Die zugehörigen Spalten dazu dürfen nicht null sein und müssen eine gültige id auf die entsprechende tabellen haben.

In diesem fall hast du wohl anrede nicht angegeben.

Und schau mal obs in PHP (ist doch glaube PHP) auch transaction geht.
Dann könntest du deine abfragen in einer transaction laufen lassen.
Welche zum schluss ausgeführt wird, wenn keine fehler auftratten.
So vermeidest du inkonsistente Datensätze in deiner DB.
 
ok konnte den Fehler nun lokalisieren:

Dieser Befehl geht:

PHP:
$q->execute(array(1, 1, $firmenbezeichnung, $vorname, $nachname, $telefon, $email, $adresse, $plz, $ort, $vatNo));
			
			//($fk_anrede, $fk_land, $firmenbezeichnung, $vorname, $nachname, $telefon, $email, $adresse, $plz, $ort, $vatNo)

Dh. die fk_anrede & fk_land dürften NULL sein.

Die IDs sollten von hier befüllt werden:

PHP:
<div class="control-group <?php echo !empty($anrede_bezeichnungError)?'error':'';?>">
					    <label class="control-label">Anrede</label>
					    <div class="controls">
							<?php 
							require_once '../includes/database.php';
							$pdo = Database::connect();
							   
							$sql = "SELECT anrede_id, anrede_bezeichnung FROM tbl_anrede"; 
							
							//BOF Dropdown
							echo '<select name="anrede_id" value="$anrede_id" >';
							//fill Dropdown
							foreach ($pdo->query($sql) as $row) {
								echo '<option>'.$row['anrede_bezeichnung'].'</option>';
							}
							Database::disconnect();
							//EOF Dropdown
							echo '</select>';
							?>
							
					    </div>
					  </div>

und natürlich die Variable umgespeichert:

PHP:
$fk_anrede = $_POST['anrede_id'];
		$fk_land = $_POST['land_id'];

PROBLEM GELÖST -> OPTION VALUE vergessen.
 
Zuletzt bearbeitet:
Zurück