Wie prüfe ich beim einlesen der Datei, ob der Datensatz schon vorhanden ist

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

  • Wie prüfe ich beim einlesen der Datei, ob der Datensatz schon vorhanden ist

    Hallo,

    Mit dem angeführten Script werden Daten aus der merkmale.txt in die Tabelle merkmale geladen. Das funktioniert auch soweit sehr gut. Problem ist nun, wenn ich eine neue merkmale.txt habe und diese importiere, muss geprüft werden, ob es den Satz schon mal gibt oder nicht. Wenn nicht vorhanden soll er natürlich angefpgt werden ansonsten verworfen werden. Der primäre Key ist PNr, nach dem kann ausgewählt werden.

    Kann ich das direkt im Query machen und wenn wie oder muss da php ran (und wenn wie)?

    PHP-Code:
    <?php

    //Datenbank verbinden
    require_once ($root "/functions/db_connection.php");

    // einlesen der Datei
    $datei "merkmale.txt";
    $csv file($datei);// Liest die Datei zeilenweise in ein Array
    foreach($csv as $value)
        {
         
    $parts explode(";"$value);// Zerbrechen der Zeile anhand des Trenners ";"
         
    $partquery implode("','"$parts);
         
    $partquery "'" $partquery "'"
         
    $query "INSERT INTO merkmale (PNr, Bezug, Bez_Nr, Merkmal, Aktueller_Wert, Datentyp, Auswahl, Text, Wert, Einheit, 
    Kennzeichen, erstellt_am, erstellt_von, geaendert_am, geaendert_von) VALUES(" 
    $partquery ")";
         
         
    $result mysql_query($query);
         if (!
    $result)
         {
          die(
    'Ungültige Abfrage: ' mysql_error());
         }
         }
        echo 
    "Alle Datensätze wurden in die Datenbank importiert.";
    ?>

    Gruß

    Michael
    Zuletzt geändert von fritzje610; 14.01.2008, 12:40.
    Gruß

    Michael

  • #2
    1. Code umbrechen,
    2. Unique Felder in der Datenbank machen?
    Liebe Grüße,
    SteKoe!

    PHP Tutorials
    Peter Kropff | Quakenet | Schattenbaum.net

    Kommentar


    • #3
      Hi,

      wenn ich das PNr-Feld als unique definiere wird zwar das einfügen von doppelten Sätzen verhindert, allerdings werden auch keine weiteren hinzugefügt.
      Ich habe dazu nur mittels phpMyAdmin die Spalte als unique gesetzt. Der Rest ist so geblieben. Ich denke mal, dass ich dann den Query noch anpassen muss.
      Nur wie? Oder muss ich da doch mit php prüfen?



      Gruß


      Michael
      Gruß

      Michael

      Kommentar


      • #4
        Wenn du die Scriptausführung aktiv (die('Ungültige Abfrage:...')) unterbrichst, sollte es dich eigentlich nicht wundern, dass alle folgenden Einträge nicht eingetragen werden.
        ICH BIN ICH!!!

        Kommentar


        • #5
          Das ist richtig. Manchmal hat man Tomaten auf den Augen. Dann muss dort ein INSERT hin, soweit so gut. Nur wie muss der aussehen. Einfach nochmal alles drüber, sprich den selben Query nochmal oder kann man dann sagen, nimm nur die, die es noch nicht gibt? wie mach ich das am besten ? Diese Querys sind nicht so wirklich mein Fall.


          Gruß

          Michael
          Gruß

          Michael

          Kommentar


          • #6
            Dann muss dort ein INSERT hin, soweit so gut.
            Warum das??? Das insert hast du doch schon längst?

            OffTopic:
            Eigenen Code verstanden, oder nur irgendwo kopiert und mit Glück zum laufen gebracht?


            Nur wie muss der aussehen. Einfach nochmal alles drüber, sprich den selben Query nochmal oder kann man dann sagen, nimm nur die, die es noch nicht gibt? wie mach ich das am besten ?
            Ja genau, am besten machst du für jede Zeile in der Datei eine eigene Querie...

            OffTopic:
            Diese Querys sind nicht so wirklich mein Fall.
            Schleifen offensichtlich auch nicht. Versuch noch mal nachzuvollziehen, was eine Schleife ist und wie sie Funktioniert. Danach liest du noch mal meine letzte Antwort und überlegst, was ich dir wohl damit sagen wollte, dass du die Scriptausführung mit die() absichtlich (und überflüssigerweise) abbrichst.
            ICH BIN ICH!!!

            Kommentar


            • #7
              Ich habs mit dem ausführen desselben query anstatt des die .... probiert und das funktioniert dann auch. Ist das eigentlich "sauber" oder gibts da bessere/elegantere Wege?

              Gruß

              Michael
              Gruß

              Michael

              Kommentar


              • #8
                Zeig mal den Code, aber ich würde vermuten, dass es absolut überflüssig ist...
                ICH BIN ICH!!!

                Kommentar


                • #9
                  Wenn PNr der Primärschlüssel ist, ist er automatisch UNIQUE, das musst du nicht mehr speziell machen.
                  Und dann kannst du ja nach dem entsprechenden Fehlercode (#1062 - Duplicate entry '1' for key 1 ) abfragen:
                  PHP-Code:
                  $result mysql_query($query);
                  if (!
                  $result){
                      if(
                  mysql_errno() == 1062){
                          echo 
                  "Datensatz $parts[0] schon vorhanden<br />";
                      }
                  else{
                      die(
                  'Ungültige Abfrage: ' mysql_error());

                  Mehr brauchst du gar nicht zu ändern.
                  Gruss
                  H2O

                  Kommentar


                  • #10
                    PHP-Code:
                    <?php

                    //Datenbank verbinden
                    require_once ($root "/functions/db_connection.php");

                    // einlesen der Datei
                    $datei "merkmale.txt";
                    $csv file($datei);// Liest die Datei zeilenweise in ein Array
                    foreach($csv as $value)
                        {
                         
                    $parts explode(";"$value);// Zerbrechen der Zeile anhand des Trenners ";"
                         
                    $partquery implode("','"$parts);
                         
                    $partquery "'" $partquery "'"// Ergebnis soll 'Hallo', 'Welt', 'Michael' sein
                         
                    $query "INSERT INTO merkmale (PNr, Bezug, Bez_Nr, Merkmal, Aktueller_Wert, Datentyp, Auswahl, Text, Wert, Einheit, 
                    Kennzeichen, erstellt_am, erstellt_von, geaendert_am, geaendert_von) VALUES(" 
                    $partquery ")";
                         
                    $result mysql_query($query);
                         if (!
                    $result)
                         {
                          
                    $query "INSERT INTO merkmale (PNr, Bezug, Bez_Nr, Merkmal, Aktueller_Wert, Datentyp, Auswahl, Text, Wert, Einheit,
                     Kennzeichen, erstellt_am, erstellt_von, geaendert_am, geaendert_von) VALUES(" 
                    $partquery ")";
                         }
                         }
                        echo 
                    "Alle Datensätze wurden in die Datenbank importiert.";
                    ?>
                    Wie gesagt, so funktioniert das, allerdings ist das sicherlich nicht elegant, da er ja auf alle Fälle den kompletten Import durchführen muss. Es reicht doch wenn er die fehlenden hinzufügt.
                    Aus der Logik her würde ich sagen per Select die Spalte PNr auslesen. Steht dann ja in einem Array. Die Importdatei einlesen, die dann ja auch in einem Array steht. Die beiden dann vergleichen und wenn keine Übereinstimmung diesen Satz in die Datenbank schreiben.

                    Gruß

                    Michael
                    Zuletzt geändert von fritzje610; 14.01.2008, 13:27.
                    Gruß

                    Michael

                    Kommentar


                    • #11
                      *rofl*

                      Man Merkt doch deutlich, dass du nichtmal versucht hast, zu verstehen, was du da gemacht hast...

                      Was glaubst du wohl, bewirkt dieser Code?

                      PHP-Code:
                      if (!$result)
                           {
                            
                      $query "INSERT INTO merkmale (PNr, Bezug, Bez_Nr, Merkmal, Aktueller_Wert, Datentyp, Auswahl, Text, Wert, Einheit,
                       Kennzeichen, erstellt_am, erstellt_von, geaendert_am, geaendert_von) VALUES(" 
                      $partquery ")";
                           } 
                      Außer minimalem zusätzlichen Speicherverbraucht, gar nichts! Von mir auch klnntest du in die Variable $query alle drei Teile von Herr der Ringe reinschreiben. Nen Effekt hat das aber genauso wenig.

                      Wie gesagt, überflüssig wie ein Kropf
                      ICH BIN ICH!!!

                      Kommentar


                      • #12
                        Aus der Logik her würde ich sagen per Select die Spalte PNr auslesen. Steht dann ja in einem Array. Die Importdatei einlesen, die dann ja auch in einem Array steht. Die beiden dann vergleichen und wenn keine Übereinstimmung diesen Satz in die Datenbank schreiben.
                        kann man so machen.
                        ICH BIN ICH!!!

                        Kommentar


                        • #13
                          Vielen Dank H2O. Es funktioniert. Ich denke ich habe es auch verstanden was Du gemaht hast.

                          - Du setzt den Query ab und guckst ob $result true ist (Query ok war)

                          - wenn nicht prüfe ob die Fehlermeldung die 1062 ist und gib die vorhanden Satznummern aus

                          - danach kommt der Sprung zurück in die foreach und er versucht den query nochmals abzusetzen. Bei dem werden dann die restlichen Sätze hinzugefügt.

                          - wieder die Prüfung auf 1062 bzw. auf einen eventuellen Fehler von mysql

                          - wenn beide nicht vorliegt den echo ausgeben das alles hinzugefügt wurde


                          Richtig ?



                          Gruß

                          Michael
                          Gruß

                          Michael

                          Kommentar


                          • #14
                            annähernd.

                            die schleife itteriert durch deine quelldaten:
                            1) es wird versucht deinen datensatz zu schreiben.
                            2) wenn dies nicht gelingt
                            2 a) wird geprüft ob es an "dublicate entry" liegt. Dann wird ein entsprechender hinweis ausgegeben
                            2 b) oder bei allen anderen möglichen fehlern: abgebrochen.
                            3) nächster Datensatz -> beginne bei 1)
                            ICH BIN ICH!!!

                            Kommentar


                            • #15
                              Danke für eure Hilfe. Ich denke, ich habe es gerafft.

                              Gruß

                              Michael
                              Gruß

                              Michael

                              Kommentar

                              Lädt...
                              X