Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabelle leert sich selber

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabelle leert sich selber

    Hallo,

    ich habe folgendes Problem:

    Ich lese 25 .csv-Dateien ein, nehme die Datensätze auseinander und befülle damit eine Datenbank.
    Die Struktur aller Dateien ist identisch, nur der Inhalt ist unterschiedlich.

    Nun laufen die ersten 24 .csv-Dateien reibungslos durch, alle Daten werden in die Datenbank geschrieben.
    Datei 25 läuft ebenfalls durch, ich lasse mir im Browser die Querys für den INSERT INTO anzeigen und die sind auch fehlerlos (wenn ich sie 1:1 in phpmyadmin kopiere fügt er die Datensätze ein).
    Jedoch Tabelle 25 bleibt komplett leer. Führe ich den INSERT INTO nachträglich per Hand in phpmyadmin aus, bekommt die Auto-Increment-Spalte auch den richtigen Wert (31), also waren die 30 Datensätze vorher schonmal in der Tabelle.

    Ich droppe vor jedem Durchlauf die gesamte Datenbank, lege alle Tabellen übers Skript neu an und es gibt keine Probleme in den ersten 24... nur bei der letzten scheint er zwar den Insert auszuführen (mysqli->error gibt keinen Fehler zurück), jedoch erscheinen keine Datensätze...

    Jemand eine Ahnung? Oder wird dafür der Code bzw. die Tabellen-Struktur benötigt?


    Grüße,
    Schrubber


  • #2
    Zitat von Schrubber Beitrag anzeigen
    Oder wird dafür der Code bzw. die Tabellen-Struktur benötigt?
    Meinst du die Frage wirklich ernst? Ohne Code kann man da nur wild drauf los raten was nicht wirklich zielführend ist …

    Kommentar


    • #3
      Okay, also meine Funktion welche die Tabelle befüllt schaut wie folgt aus ($ligaName übergibt einen String mit dem Tabellen-Name, $ligaData einen verschachtelten Array mit [0] -> unwichtige Daten; [1] -> alle Datensätze als Sub-Array:

      PHP-Code:
      function insertDataInTable($mysqli$ligaName$ligaData) {
              
      // Füllt die Daten der Liga in die Tabelle
              
      $tableHeader = array();
              
      $query "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '".$ligaName."'";    
              
      $result $mysqli->query($query);
              if(!
      $result) {
                  
      printMessage("Fehler: Tabelle-Header von '" $ligaName "' konnten nicht angerufen werden. Meldung: " $mysqli->error);
              }
              while (
      $row $result->fetch_assoc()) {
                  
      array_push($tableHeader$row['COLUMN_NAME']);
              }        

              for(
      $matchi 0$matchi count($ligaData[1]); $matchi++) {
                  
      $query2 "";
                  
      $tmpData explode(";"$ligaData[1][$matchi]);
                  
      $query2 .= "INSERT INTO `".$ligaName."`(";
                  for(
      $coli 1$coli <= count($tmpData); $coli++) {
                      
      $query2 .= $tableHeader[$coli];
                      if(
      $coli <= count($tmpData) - 1) {
                          
      $query2 .= ",";
                      }
                  }
                  
      $query2 .= ") VALUES (";
                  for(
      $datai 0$datai count($tmpData); $datai++) {
                      
      $query2 .= "'" str_replace("\""""$tmpData[$datai]) . "'";
                      if(
      $datai count($tmpData) - 1) {
                          
      $query2 .= ",";
                      }
                  }
                  
      $query2 .= ")";
                  echo 
      $query2 "<br /><br />";
                  
      $resultImport $mysqli->query($query2);
                  if(!
      $resultImport) {
                      echo 
      "Error at query: " $query2 "<br /><br />";
                      return 
      false;
                  }
              }        
          } 
      Ich bin mir im klaren, dass die "Lösung" oben nicht die intelligenteste, noch die sauberste ist... gerade der Zusammenbau von $query2. Aber sie funktioniert...

      Als Ausgabe von $query2 am Ende bekomme ich etwas wie:

      Code:
      INSERT INTO `tabellenname`(nummer,staffel,datum,zeit,hallennummer,heim,gast) VALUES ('ZAHL','NAME','DATUM','UHRZEIT','NUMMER','TEAM1','TEAM2 ')

      Meine Tabellen-Struktur schaut wie folgt aus:
      Code:
      CREATE TABLE `tabellenname` (
        `id` int(11) NOT NULL,
        `nummer` varchar(16) DEFAULT NULL,
        `staffel` varchar(128) DEFAULT NULL,
        `datum` date DEFAULT NULL,
        `zeit` varchar(5) DEFAULT NULL,
        `hallennummer` varchar(128) DEFAULT NULL,
        `heim` varchar(128) DEFAULT NULL,
        `gast` varchar(128) DEFAULT NULL,
        `hallenname` varchar(128) DEFAULT NULL,
        `plz` varchar(128) DEFAULT NULL,
        `ort` varchar(128) DEFAULT NULL,
        `strasse` varchar(128) DEFAULT NULL,
        `telefon` varchar(128) DEFAULT NULL,
        `haftmittel` varchar(512) DEFAULT NULL,
         PRIMARY KEY (`id`)
      )
      )

      Kommentar


      • #4
        Zitat von Schrubber Beitrag anzeigen
        Meine Tabellen-Struktur schaut wie folgt aus:
        Nein, sieht sie nicht - eine Tabellenstruktur enthält keine PHP-Variablen und keine Syntaxfehler. Auch der PHP-Code enthält einen Syntaxfehler und ist so überhaupt nicht lauffähig. Und dein Beispiel was bei $query2 rauskommt funktioniert auch nicht, das gibt eine Fehlermeldung weil der Wert für id den falschen Datentyp hat (verwende NULL, keinen Leerstring).

        Davon dass in der Tabelle die meisten Spalten vermutlich einen falschen Datentyp haben (oder zumindest die falsche Länge) mal ganz zu schweigen.

        Kommentar


        • #5
          Mein Fehler, war ein älterer Tab. Habe oben die Tabellen-Struktur und den INSERT-Befehl ausgetauscht. Das Beispiel mit $query2 ist nicht lauffähig, weil das Forum den Backslash löscht. Was mich nur wundert ist, dass alle anderen Dateien problemlos durchlaufen, mit exakt der selben .csv-Struktur. Nur bei der letzten incrementiert er in der Tabelle die id-Spalte hoch bis zu 30 (was die richtige Zahl an Datensätzen wäre) und leert sie danach wieder.

          Kommentar


          • #6
            Hab ich das richtig Verstanden, dass du hinterher 25 Tabellen mit der selben Struktur aber unterschiedlichen Daten hast? Wenn ja, dann ist das Datenbank Design auch kaputt. Schau dir mal was zum Theme Datenbanknormalisierung an!

            Kommentar


            • #7
              Zitat von Schrubber Beitrag anzeigen
              Nur bei der letzten incrementiert er in der Tabelle die id-Spalte hoch bis zu 30 (was die richtige Zahl an Datensätzen wäre) und leert sie danach wieder.
              Das hört sich fast nach einer Transaktion und einem Rollback an - aber ohne reproduzierbares Beispiel lässt sich das nicht nachvollziehen.

              Kommentar


              • #8
                Ich würde sagen, es ist ein ziemlich normales Bild, das sich ergibt, wenn die importierten Daten nicht in die Tabelle passen.
                Dabei ist es erstmal müßig, über den Code zu schimpfen, wenn er 24x funktioniert und 1x nicht.
                Es hilft nur die (richtige) Tabellendefinition, die Importdaten und natürlich auch eine Fehlermeldung, denn die müsste irgendwo existieren, ein Rollback findet nicht ohne Fehler(meldung) statt.

                Importfehler ergeben sich besonders gern bei Datenbasis aus Menschenhand, also z.B. "liebevolle Datenpflege per Excel".
                Wenn solche Dinge nicht auszuschließen sind (eben wegen "menschliches Versagen"), muss man den Importvorgang schlauer gestalten.

                Kommentar


                • #9
                  spontan beim 2ten Lesen deines Codes stößt mir diese Zeile auf
                  PHP-Code:
                   $tmpData explode(";"$ligaData[1][$matchi]); 
                  du bekommst also aus der CSV mehrere Daten"worte", die du zerlegst ? ... das schreit danach, dass es hinterher nicht genug sind für das Insert-Statement bzw. die Anzahl nicht mit der Anzahl der Header-Werte aus dem array-push - Abschnitt darüber übereinstimmt ... nimm dir also Perry Staltic's Hinweis zu herzen und schau dir genau deine Quell-CSV an ... Excel ist bekannt dafür, das Trennzeichen auszulassen, wenn eine Zelle leer ist usw.

                  Außerdem strickst du dir deine Abfrage selbst .. was immer gern zu escaping-Fehlern führt ...
                  PHP-Code:
                  $query2 .= "'" str_replace("\""""$tmpData[$datai]) . "'"
                  ... schau dir an, was passiert, wenn Single-Quotes im Datensalat der CSV stehen
                  "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                  Kommentar

                  Lädt...
                  X