Tabelle mit INSERT INTO füllen, nur wenn Daten vorhanden

phpameise

Mitglied
Mein Problem: Ich fülle eine Usertabelle aus einem Formular, bediene mich der vergebenen user_id und schreibe einen Teil der Daten in eine Extra Tabelle. Nun möchte ich aber nicht jedes Mal einen Datensatz (in meinem Fall 8) eingetragen bekommen, sondern nur, wenn der User tatsächlich Angaben im Formular gemacht hat. Zur Zeit werden leere Datensätze auch angelegt, weil ja immer die Variable user_id übergeben wird.
PHP:
$ref_sql = "INSERT INTO `tblReferenzen` (`user_id`
, `RefJahr`
, `RefVeranstaltung`
, `RefTaetigkeit`
, `RefKunde`) 
VALUES 
('" . $user_id ."', '" . $ref1[0] . "', '" . $ref2[0] . "', '" . $ref3[0] . "', '" . $ref4[0] . "'),
('" . $user_id ."', '" . $ref1[1] . "', '" . $ref2[1] . "', '" . $ref3[1] . "', '" . $ref4[1] . "'),
('" . $user_id ."', '" . $ref1[2] . "', '" . $ref2[2] . "', '" . $ref3[2] . "', '" . $ref4[2] . "'),
('" . $user_id ."', '" . $ref1[3] . "', '" . $ref2[3] . "', '" . $ref3[3] . "', '" . $ref4[3] . "'),
('" . $user_id ."', '" . $ref1[4] . "', '" . $ref2[4] . "', '" . $ref3[4] . "', '" . $ref4[4] . "'),
('" . $user_id ."', '" . $ref1[5] . "', '" . $ref2[5] . "', '" . $ref3[5] . "', '" . $ref4[5] . "'),
('" . $user_id ."', '" . $ref1[6] . "', '" . $ref2[6] . "', '" . $ref3[6] . "', '" . $ref4[6] . "'),
('" . $user_id ."', '" . $ref1[7] . "', '" . $ref2[7] . "', '" . $ref3[7] . "', '" . $ref4[7] . "')";
mysql_query($ref_sql,$link) or die("Dateneinspielung der Referenzen fehlgeschlagen:" . mysql_error());
Bitte einfach erklären, bin Newcomer. Danke
 
Ich versuche mal mein Problem besser zu beschreiben. Es gibt ein Eingabeformular u.a. mit den Feldern RefJahr1, RefVeranstaltung1, RefKunde1, RefJahr2, RefVeranstaltung2, RefKunde2; RefJahr3, RefVeranstaltung3, RefKunde3. Alle diese Felder sind keine Pflichtfelder. Die meisten Felder bzw daten des Formulars werden in eine Tabelle1 geschrieben. Die oben genannten Felder sollen aber erst sortiert und dann in eine Tabelle2 geschrieben werden. Bisher ist das ganze so angelegt:
PHP:
$user_sql = "INSERT INTO `Tabelle1` (`date`, `Vorname`, `Nachname`) VALUES ('" . $_SESSION['date'] . "', '" . $_SESSION['Vorname'] . "', '" . $_SESSION['Nachname'] . "')";
mysql_query($user_sql,$link) or die("Dateneinspielung fehlgeschlagen:" . mysql_error());
$user_id = mysql_insert_id($link);

dann die Sortierung:
PHP:
$ref1 = array($_SESSION['RefJahr1'], $_SESSION['RefJahr2'], $_SESSION['RefJahr3']);
$ref2 = array($_SESSION['RefVeranstaltung1'], $_SESSION['RefVeranstaltung2'], $_SESSION['RefVeranstaltung3']);
$ref3 = array($_SESSION['RefKunde1'], $_SESSION['RefKunde2'], $_SESSION['RefKunde3']);
array_multisort($ref1, SORT_DESC, $ref2, $ref3);

und dann das senden an Tabelle2:
PHP:
$ref_sql = "INSERT INTO `Tabelle2` (`user_id`, `RefJahr`, `RefVeranstaltung`, `RefKunde`) VALUES 
('" . $user_id ."', '" . $ref1[0] . "', '" . $ref2[0] . "', '" . $ref3[0] . "'),
('" . $user_id ."', '" . $ref1[1] . "', '" . $ref2[1] . "', '" . $ref3[1] . "'),
('" . $user_id ."', '" . $ref1[2] . "', '" . $ref2[2] . "', '" . $ref3[2] . "'),
('" . $user_id ."', '" . $ref1[3] . "', '" . $ref2[3] . "', '" . $ref3[3] . "')";
mysql_query($ref_sql,$link) or die("Dateneinspielung der Referenzen fehlgeschlagen:" . mysql_error());	   
?>
Das Problem: Ich möchte dass nur Datensätze in die Tabelle2 geschrieben werden, wenn wirklich Datensätze vorhanden sind. Wenn der Nutzer also nur Daten in "RefJahr1, RefVeranstaltung1, RefKunde1" einträgt, soll auch nur ein Datensatz in Tabelle2 erscheinen. Ich hab das ganze bestimmt völlig falsch angelegt?
 
Ich versteh dein Problem nicht, was ist so schwer daran die Variablen zu überprüfen bevor du sie speicherst?

ZB: (grob formuliert)
PHP:
$values=array();
foreach($refs as $ref) {
  if (!empty($ref[0]) || !empty($ref[1]) || !empty($ref[2])) {
    $values[]='('.$user_id.',"'.$ref[0].'","'.$ref[1] .'","'.$ref[2].'")';
  }
}
if (count($values)) {
  $ref_sql = 'INSERT INTO `Tabelle2` 
          (`user_id`, `RefJahr`, `RefVeranstaltung`, `RefKunde`) 
  VALUES
          '.implode($values, ',').';';
}
 
Zuletzt bearbeitet:
Ich hab mal die kleinen Fehler rausgenommen.
PHP:
foreach($refs as ref) ---> foreach($refs as $ref)
// und
$values[]='('.$user_id.',"'.$ref[0].'","'.$ref[1] .'","'.$ref[2].'")'; --->  $values[]="('".$user_id."','".$ref[0]."','".$ref[1] ."','".$ref[2]."')"

Aber eine Stelle versteh ich nicht, die auch zum Fehler führt.

PHP:
$values=array();
foreach($refs as $ref)

Was ist $refs? Muss ich meine ref1 ref2 ref3 ref4 irgendwie zusammenfassen?
 
Habe folgendes probiert, ist das richtig?
PHP:
$refs = array_merge($ref1, $ref2, $ref3, $ref4);

Aber ich habe alles einmal getestet und bekomme folgenden Fehler: Dateneinspielung der "Referenzen fehlgeschlagen:Column count doesn't match value count at row 1"
 
Ja hab das $ vergessen, bei $user_id bin ich davon aus gegangen das es ein Interger ist. Die Quotes waren schon richtig aber egal.

Das $refs habe ich als Zweidimensionales Array behandelt.
Statt $ref1[0], $ref2[0], ... hab ich $ref[0][0], $ref[0][1], usw.
 
Das Prinzip von zweidimensionalen arrays ist mir eigentlich klar. Kann ich denn meine Daten so in $refs packen?
PHP:
$refs = array(array($ref1),
				array($ref2), 
				array($ref3), 
				array($ref4));
Meine Fehlermeldung lautet:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''.implode(Array, ',').'' at line 2
 
Ich habs jetzt:
PHP:
$refs = array(array($_SESSION['RefJahr1'], $_SESSION['RefVeranstaltung1'], $_SESSION['RefKunde1']),
				array($_SESSION['RefJahr2'], $_SESSION['RefVeranstaltung2'], $_SESSION['RefKunde2']),
				array($_SESSION['RefJahr3'], $_SESSION['RefVeranstaltung3'], $_SESSION['RefKunde3']));

$values=array();
foreach($refs as $ref) {
  if (!empty($ref[0]) || !empty($ref[1]) || !empty($ref[2])) {
    $values[]='('.$user_id.', "'.$ref[0].'", "'.$ref[1].'", "'.$ref[2].'")';
  }
}
if (count($values)) {
//neuer Code ende

$ref_sql = 'INSERT INTO `tblReferenzen` 
(`user_id`, `RefJahr`, `RefVeranstaltung`, `RefKunde`) VALUES '.implode($values, ',').';';

mysql_query($ref_sql,$link) or die("Dateneinspielung der Referenzen fehlgeschlagen:" . mysql_error());	   
}
Ich habe nochmal meine Arrays umgestellt und pro Array einen "Datensatz" zusammengestellt und nicht wie vorher alle "Jahre", alle "Veranstaltungen" und alle "Kunden" in jeweils einem Array. Besten Dank für die super Hilfe. Jetzt muss ich nur noch das sortieren ändern. Ich wollte ja die Datensätze nach "RefJahr" sortieren. Das ging bei mir so:
PHP:
array_multisort($ref1, SORT_DESC, $ref2, $ref3, $ref4);
Da ich aber jetzt die Arrays anders zusammenstelle, muss es jetzt wohl anders gemacht werden. Hat jemand einen Hinweis oder einen Link? Danke
 
Wäre das der richtige Ansatz um die Datensätze bei mir nach "RefJahr" zu sortieren?
PHP:
$sortArray = array();
    foreach($data as $key => $array) {
        $sortArray[$key] = $array[0];
    }
Wenn ja, wie dann weiter?
 
Ich finde viele Beispiele zum ordnen von Mehrdimensionalen Arrays, aber immer handelt es sich um Assoziative Arrays. Mein Array ist doch aber:
PHP:
$refs = array(array($_SESSION['RefJahr1'], $_SESSION['RefVeranstaltung1'], $_SESSION['RefKunde1']),
                array($_SESSION['RefJahr2'], $_SESSION['RefVeranstaltung2'], $_SESSION['RefKunde2']),
                array($_SESSION['RefJahr3'], $_SESSION['RefVeranstaltung3'], $_SESSION['RefKunde3']));
Habe es mal diesen Code unter das Array geschrieben, aber Sortierung geht nicht.
PHP:
function _compare($a, $b) {
  // $a und $b werden mit strcmp vergleicht. falls die werte gleich sind, wird nach typ sortiert.
  // es wird entweder 1

  return ($a == $b ? strcmp($a['$refs[][1]'], $b['$refs[][1]']) : strcmp($a['$refs[][0]'], $b['$refs[][0]']));
}

usort($refs, "_compare");
Ich weiß nicht, wie man die Spalte RefJahre, nach der sortiert werden soll richtig anspricht.
PHP:
 '$refs[][1]'
so jedenfalls nicht :(
 
Zurück