strcmp

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

  • strcmp

    Hallo, ich habe ein Problem.
    Mein Programm muss datensätze vergleichen. Das macht er mittels der personalnummer die ja einzigartig ist. ich bekomme listen mit vielen datensätzen und muss meine datenbank auf den neusten stand halten. bei der einspielung der daten sind natürlich auch datensätze dabei die schon in meinem datenbank vorhanden sind deswegen laden ich die personalummer von meinem datenbank und von der aktuellen liste(csv datei) in zwei arrays und vergleiche diese. wenn ein datensatz von der liste noch nicht in meinem datebank ist wird es überspielt.

    Nun mein Problem. Wenn die Liste (CSV Datei) an unterschiedlichen stellen aktuelle datensätze hat will mein skript die komplette liste in die datenbank reinladen. (Auch mit den daten die schon in der Datenbank drin sind)

    Sind aber blos die letzten 10 Datensätze auf der liste neu werden nur diese in die datenbank übernommen wie es ja auch sein sollte.(Diese Szenario kommt aber naturlich nie vor in einem Betrieb)

    PHP-Code:
    <?

    for($i=0;$i<$array_count;$i++) 
    {
        $wert = strcmp($array[$i],$array1[$i]);

        if ($wert != 0)
        { 
          $result = mysql_query("SELECT bezeichnung, anrede, titel, vorname, nachname, 

    vertragsende, vertragsanfang, 
    personalnummer, check1, check2, check3  FROM mitarbeiter WHERE check2 = ('$array1[$i]')");    
             while($row = mysql_fetch_assoc($result))
          $AbfrageImArray[]= $row;
              $x = count($AbfrageImArray);     
            }
        
    }
    ?>
    THX for help

  • #2
    So richtig habe ich das Problem ja nicht verstanden, aber das liegt wohl zum einen an der Sprache und zum anderen an dem Skript selber.

    Da tauchen aus heiterem Himel 2 Arrays auf, deren jeweils i. Element verglichen wird. Ich vermute mal, da stehen die Personalnummern drin. Okay, aber warum wird Element i mit Element i des anderen Arrays verglichen? Meiner Auffassung nach soll eher geschaut werden, ob in einem Array ein bestimmter Wert vorhanden ist und hierfür ist eher in_array() geeignet.

    Vielleicht hilft das ja etwas weiter.
    Happiness is an empty error log

    Kommentar


    • #3
      aber warum wird Element i mit Element i des anderen Arrays verglichen?
      Personalnummer
      128
      array gefühlt von der datenbank


      Personalnummer
      128

      array gefühlt von der csv datei


      Wenn beide Datensätze identisch sind muss ja nichts auf die datenbank überspielt werden, weil ich diesen datensatz ja schon habe.

      Bei unterschiedlichen Datensätzen muss eine überspielung erfolgen. Weil ich ja denn datensatz von der csv datei noch nicht in der datenbank habe.

      Kommentar


      • #4
        Original geschrieben von Zombie
        Personalnummer
        128
        array gefühlt von der datenbank
        OffTopic:
        und was macht die datenbank dann, wenn sie das array "gefühlt" hat? wonnig schnurren ...? "igitt" schreien, weil es sich eher schleimig anfühlt ...?


        glaubst du wirklich, dass deine "problembeschreibung" auch nur annähernd genug informationen enthalten würde, um dir irgendwas hilfreiches mitteilen zu können?
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Original geschrieben von wahsaga
          OffTopic:
          und was macht die datenbank dann, wenn sie das array "gefühlt" hat? wonnig schnurren ...? "igitt" schreien, weil es sich eher schleimig anfühlt ...?


          glaubst du wirklich, dass deine "problembeschreibung" auch nur annähernd genug informationen enthalten würde, um dir irgendwas hilfreiches mitteilen zu können?
          Na dann kannst du mir sicher ein example geben wie man ein problem richtig beschreibt denn ich muss das ja noch lernen.

          Kommentar


          • #6
            Original geschrieben von Zombie
            Na dann kannst du mir sicher ein example geben wie man ein problem richtig beschreibt denn ich muss das ja noch lernen.
            http://www.lugbz.org/documents/smart-questions_de.html

            und weitere beispiele findest du hier im forum (allerdings auch zahlreiche dafür, wie man's nicht machen sollte ...)
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Schwierig. Also ich denke mal, daß ich das Problem verstanden habe, auch wenn ich dabei um ein paar Ecken denken musste. "Gefühlte" Variablen sind natürlich mal ein lobenswerter Ansatzpunkt im Umgang mit einer sonst so gefühlskalten Programmiersprache.

              Allerdings kann ich bei dem Skript so keinen Denkfehler entdecken, auch wenn ein paar Merkwürdigkeiten drin sind. An deiner Stelle würde ich mir mal die SQL-Befehle ausgeben lassen, die da auflaufen. Vermutlich liegt da der gefühlte Hase im Pfeffer, denn an einer Stelle scheint die gesamte Datenbanktabelle geladen zu werden, wenn ein bestimmter Wert vorkommt.

              Pack die SQL-Abfrage in ein $sql rein, jag die durch den Query und lass sie dir bei jedem SQL-Zugriff mal ausgeben.
              Happiness is an empty error log

              Kommentar


              • #8
                OffTopic:
                *grins* That's what I call a Love machine


                Überlegungen :

                Prob 1 ) Ist nicht generell anzunehmen, dass der Vergleich der ID lediglich aussagt ob ein Datensatz in der DB vorhanden ist, nicht jedoch ob die Daten aktuell sind? Natürl kann man mit diesem Vergleich prüfen ob Daten vorhanden sind, also ob die CSV-Zeile eingefügt werden muß - aber nicht ob die Daten aktueller sind als die in der DB.

                Prob 2 ) Mal angenommen die Daten der CSV kommen irgendwo her, insbesondere aus einer anderen DB (evtl Access?) gibt es da vielleicht eine Möglichkeit per Datenbank und verknüpften Tabellen zu agieren? Allerdings wirds natürlich schwierig wenn die Daten aus proprietärer Software ohne direktem DB-Interface kommen ...

                Prob 3) Wenn schon per CSV sollte es eine Prüfung auf Aktualität geben, z.B anhand eines TimeStamps ... oder es ist 10^100 %ig sicher dass die Daten in der CSV [COLOR=crimson]IMMER[/COLOR] aktuell sind (und komplett?) - ansonsten endest Du irgendwann mit nem Haufen Datenmüll

                Zum Skript:

                Es wäre hilfreich zu wissen, wie schon von wahsage wahgesagt , wass vorher und nachher passiert, insbesondere woher $array1 und $array kommen, und wozu $x und $AbfrageimArray dienen ...

                Wie ich dass sehe, wird in dem Skript bisher noch nichts per UPDATE oder INSERT an der DB geändert
                ...
                chansel0049
                ----------------------------------------------------
                if you've reached the bottomline - dig further!
                Übersetzer gesucht? http://www.babelport.com

                Kommentar


                • #9
                  PHP-Code:
                  <?php

                  $verbindung 
                  mysql_connect ("localhost",
                  "root""")
                  or die (
                  "keine Verbindung möglich.
                   Benutzername oder Passwort sind falsch"
                  );

                  mysql_select_db("Datenbank"
                  or die (
                  "Die Datenbank existiert nicht."); 
                  $result mysql_query("SELECT check2 FROM mitarbeiter");    
                  while(
                  $row mysql_fetch_array($result)) 
                     
                  $array[] = $row['check2'];     
                  $array_count01 count($array); 


                  //Auslesen des checkfeldes in 
                  der personal nummern stehen



                  mysql_select_db
                  ("testdaten"
                  or die (
                  "Die Datenbank existiert nicht."); 
                  $result mysql_query("SELECT check2 FROM mitarbeiter");    
                  while(
                  $row mysql_fetch_array($result)) 
                     
                  $array1[] = $row['check2'];     
                  $array_count count($array1); 

                  /* 
                  Auslesen des checkfeldes in der 
                  ebenfalls personal nummern stehen
                  (Andere Datenbank Daten in form von csv eingespielt)

                  */

                  for($i=0;$i<$array_count;$i++) 
                  {
                      
                  $wert strcasecmp($array[$i],$array1[$i]);

                      if (
                  $wert != 0)
                      { 
                        
                  $result mysql_query("SELECT bezeichnung, anrede, titel, vorname, nachname, 
                  vertragsende, vertragsanfang, personalnummer, 
                  check1, check2, check3  FROM mitarbeiter WHERE check2 = ('
                  $array1[$i]')");    
                           while(
                  $row mysql_fetch_assoc($result))
                        
                  $AbfrageImArray[]= $row;
                            
                  $x count($AbfrageImArray);     
                          }
                      
                  }

                  /* 
                  Vergleichen der Personal nummer 
                  mit anschliessender abfrage

                  */


                  print("<table width='75%' border='1' cellpadding='0'>");
                  for(
                  $i=0;$i<$x;$i++) 
                  {
                                  print(
                  "<tr>");
                      echo(
                  $AbfrageImArray[$i]['bezeichnung']); 
                       echo(
                  $AbfrageImArray[$i]['anrede']); 
                        echo(
                  $AbfrageImArray[$i]['titel']); 
                      echo(
                  $AbfrageImArray[$i]['vorname']); 
                      echo(
                  $AbfrageImArray[$i]['nachname']); 
                        echo(
                  $AbfrageImArray[$i]['vertragsende']); 
                        echo(
                  $AbfrageImArray[$i]['vertragsanfang']); 
                        echo(
                  $AbfrageImArray[$i]['check0']); 
                        echo(
                  $AbfrageImArray[$i]['check1']); 
                        echo(
                  $AbfrageImArray[$i]['check2']); 
                        echo(
                  $AbfrageImArray[$i]['check3']); 
                    
                    
                      print(
                  "</tr>");


                  }
                  print(
                  "</table>");

                  $verbindung mysql_connect ("localhost",
                  "root""")
                  or die (
                  "keine Verbindung möglich.
                   Benutzername oder Passwort sind falsch"
                  );

                  mysql_select_db("Datenbank"
                  or die (
                  "Die Datenbank existiert nicht."); 
                      
                  /* 
                  Sind die Datensätze nicht in beiden Tabellen vorhanden so werden sie hier nachträglich übernommen

                  */    

                    
                  for($i=0;$i<$x;$i++) 
                    {
                    
                  $bez1= ($AbfrageImArray[$i]['bezeichnung']); 
                       
                  $bez2= ($AbfrageImArray[$i]['anrede']); 
                    
                  $bez3= ($AbfrageImArray[$i]['titel']); 
                    
                  $bez4= ($AbfrageImArray[$i]['vorname']); 
                    
                  $bez5= ($AbfrageImArray[$i]['nachname']); 
                    
                  $bez6= ($AbfrageImArray[$i]['vertragsende']); 
                    
                  $bez7= ($AbfrageImArray[$i]['vertragsanfang']); 
                    
                  $bez8= ($AbfrageImArray[$i]['check0']); 
                    
                  $bez9= ($AbfrageImArray[$i]['check1']); 
                    
                  $bez10= ($AbfrageImArray[$i]['check2']); 
                    
                  $bez11= ($AbfrageImArray[$i]['check3']); 
                      
                       

                    
                  $sql "INSERT INTO mitarbeiter (bezeichnung, anrede, titel, 
                  vorname, nachname, vertragsende, vertragsanfang, 
                  check0, check1, check2, check3) 
                            VALUES ('
                  $bez1', '$bez2', '$bez3', '$bez4', '$bez5', 
                  '
                  $bez6', '$bez7', '$bez8', '$bez9', '$bez10', '$bez11')"
                    
                  $eintragen mysql_query($sql);
                   
                    }


                  unset(
                  $AbfrageImArray);

                  echo
                  "<p>Hinweis: Datenupdate erfolgreich abgeschlossen</p>";

                  ?>

                  Kommentar


                  • #10
                    Kurzer Lösungsansatz, bevor ich in den Feierabend verschwinde.

                    Du hast ja mit der Personalnummer einen eindeutigen Schlüsser. Mache einen LEFT JOIN mit diesem Schlüssel aus beiden Tabellen und schaue, wo in der einen Datenbank die Werte NULL sind, zB. mit WHERE t2.name IS NULL.

                    Damit kriegst Du alle Datensätze raus, die in der anderen Tabelle fehlen. Wenn die PErsonalnummer jetzt noch ein UNIQUE key ist, dann bist Du fein raus, denn dann kannst Du mit REPLACE INTO t2 SELECT * FROM t2 die fehlenden Daten von der einen in die andere Tabelle kopieren.

                    Ausführlicher geht's im Augenblick nicht, weil die Freiheit ruft.
                    Happiness is an empty error log

                    Kommentar


                    • #11
                      RESPEKT

                      Ich empfehle Dir, SQL zu lernen : gut gemacht geht das alles in einer Abfrage, umständlicher mit zwein

                      OffTopic:
                      $verbindung = mysql_connect ("localhost","root","")


                      gefällt mir , Kann ich das Skript mal live sehen? Was ist denn die URL ?
                      (Ich hoffe Du verstehst, dass Du darauf NICHT antworten solltest!)

                      Als Freiberufler, der sein Geld damit verdient, finde ich es enorm besch***n dass (offensichtlich) Firmen ihre Programmieraufträge nicht von Profis machen lassen wollen

                      PHP, SQL etc sind Programmiersprachen keine Kritzeleien die ebenmal nebenbei gemacht werden sollten...

                      Aber als Tipp : Füge ein TIMESTAMP in Beide Tabellen ein, dass bei UPDATEs und INSERTS automatisch den aktuellen Wert erhält

                      Und dann kannst Du mittels .

                      PHP-Code:
                      INSERT INTO .. SELECT ... WHERE t1.timestamp t2.timestamp .. 
                      etc. alles in einer machen, sogar über zwei DBs hinweg

                      oder ohne timestamp dafür nur in MySQL 4.1 :

                      PHP-Code:
                      INSERT INTO t2 .. SELECT ... FROM t1 WHERE check NOT IN (SELECT ... FROM t2 
                      oder noch besser mit CASE WHEN entscheiden ob UPDATE oder INSERT .....
                      Zuletzt geändert von chansel0049; 30.06.2005, 18:07.
                      chansel0049
                      ----------------------------------------------------
                      if you've reached the bottomline - dig further!
                      Übersetzer gesucht? http://www.babelport.com

                      Kommentar

                      Lädt...
                      X