Daten vergleichen DB <--> Textdatei

speedyggg

Erfahrenes Mitglied
Hallo zusammen,

ich suche nach einer guten Lösung für das folgende Problem:

Ich habe in meiner DB einige Namen gespeichert. Diese Namen tauchen nun auch in einer generierten Textdatei auf. Nun möchte ich wissen welche der Namen in DB nicht in der Textdatei stehen?

Diese möchte ich dann ausgeben.

Wie vergleiche ich diese am besten

Thx im voraus
SpeedyGGG
 
Hi,

probier mal folgendes.

PHP:
$namensarray = file('namensliste.txt'); #Pro Zeile ein Name

$sql = "SELECT name FROM namensliste";
$result = mysql_query($sql) or die(mysql_error());

while($row = mysql_fetch_assoc($result))
{
   if(!in_array($row['name'], $namensarray))
   {
       echo "Der Name ".$row['name']." steht nicht in der Textdatei!";
   }
}

Ungetestet, sollte aber klappen.
 
Zuletzt bearbeitet:
Danke fanste für dein Schnipsel.

Das funktioniert fast so wie ich mir das vorgestellt hatte.
Leider mit einem kleinen Haken.

Und zwar durchläuft und prüft er die Einträge , aber zeigt auch alle Durchläufe an.

D.h. wenn der erste Eintrag der txt- Datei nicht in der DB ist und diese 100 Einträge hat, zeigt er 100 mal "dieser Name ist nicht vorhanden".

Wenn die txt-Datei nun 100 Namen hat die nicht vorhanden sind zeigt mit das Script 100x100 Namen an.

Wie bekommen ich es nun hin das nur die Einträge anzeigt werden die in der txt-Datei fehlen

Vielen Dank im voraus
Speedyggg
 
Kann nicht sein.

Das Script funktioniert so:
Sagen wir mal diese Namen haben wir:
- Hans (In TXT)
- Otto
- Rupert (In TXT)

Dann würde das Script nur
Der Name Otto steht nicht in der Textdatei!
ausgeben, da dieser Name nicht in der TXT Datei steht. Darum auch das ! (Ausrufezeichen) vor in_array(). Damit wird geprüft, ob die Funktion false zurück liefert. Wenn ja, gib aus, das der Name fehlt.

Vielleicht hast du auch einen copy&paste fehler drin. Zeig doch mal deinen Code + die TXT Datei.
 
Hallo fanste,

hier mein Script:
Kurzbeschreibung:

Das Script filterd aus der Textdatei Textzeilen die das Datum von gestern und heute und weiter in den betreffenden Zeile den Namen aus.

Ich bitte die Programmierweise zu entschuldigen .War mein erster Versuch in dem Bereich.
Bevor ich den Vergleich eingebunden hatte wurde die txt-Datei wie oben beschrieben ausgewertet und angezeigt. Dies hat soweit auch funktioniert.

Jetzt will ich halt schauen ob die Daten in der DB den Ist in der txt-Datei entsprechen bzw. nicht entsprechen und diese sollen ausgegeben werden.

Code:
 switch ($para4)
          {
          case 1:
          if (ereg ("([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4})", $para1, $regs))         
                  {
                  $heute = time();             
                  $tsstamp = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
                  $heute   = date("d.m.Y", $tsstamp);
                  $tstamp  = mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));
                  $gestern = date("d.m.Y", $tstamp);            
                  
                  //Unixtimestamp umsetzten der Differenz Zeit
                  $diftime001 = "24"; //variable setzen
                  $prueftime = mktime($diftime001,0,0,0,0,0); // Unixtimestamp generieren          
                  
                  // Unixtimestamp setzten der File/DateiZeit
                  $filetime001 = explode(":", $para5);
                  $tstamp  = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
                  $filetime  = mktime($filetime001[0], $filetime001[1]);
                  
                  //Unixtimestamp jetzt
                  $jetzt    = date("H:i", time()); //jetzt formatieren
                           
                  $diftime1 = $heute- $tstamp; // Differenz berechnen
                  $diftime20 = date("H:i", $diftime1);// formtieren           
                  $time01    = date("H:i", $filetime);
                  $time1    = date("H:i", $diftime);
               
        $dasi    = "$regs[1]" . "_______$para2" . "______$para5";
                  if ($regs[1] == $gestern &&   $heute >= $diftime|| $regs[1]  == $heute)
                          {
                          $i = $i + 1;         
                       
   /////////////////////////////////////////////////
    include ('./db_connect.tpl.inc');
   $sql = "SELECT namehost FROM dasi";
        echo " befehl: $sql</BR>";
        $result = mysql_query($sql) or die(mysql_error());
        while($row = mysql_fetch_assoc($result))
        {
        if(!in_array($row['namehost'], $dasi))
          {
          echo "Der Name ".$row['namehost']." steht nicht in der Textdatei!</br>";
          }
        }
   ////////////////////////////////////////////////////                                                              
        }                
        }     
        break;
          
          case 2:
                  
          if (ereg ("([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4})", $para1, $regs1))
                  {
                  echo "$regs1[1]_________$para2";
                  echo "$dasi<br />";
                  $i = $i + 1;
                  break;
                  }
         }
            
   }

Thx
Speedyggg
 
Dein Vorschlag ist noch zu verbessern, Fanste. Dadurch ist es wesentlich effizienter:
PHP:
<?php

	$content = file('namensliste.txt');

	$query = '
		SELECT
		        `namehost`
		  FROM
		        `dasi`
		  WHERE
		        `namehost` NOT IN ("'.implode('", "', array_map('mysql_real_escape_string', $content)).'")
		';
	$result = mysql_query($query)
		or die(mysql_error());

	while( $row = mysql_fetch_assoc($result) ) {
		echo $row['namehost'] . '<br>';
	}

?>
 
Es wird endlich Zeit, dass ich mein MYSQL/PHP Buch mal durcharbeite. Scheint so, als könnte ich mir dadurch so manche Arbeit (Codezeile) sparen.

Aber mal zu meinem Code. Rein theoretisch müsste der doch das gewünschte Ergebnis liefern, oder habe ich doch irgendwo einen Denkfehler?

EDIT:
@speedyggg
Hast du auch wirklich darauf geachtet, dass immer nur ein Name in der Variable $dasi steht? Ich weiß jetzt nicht, was bei dir in der DB steht um sagen zu können, dass der Wert der Variable stimmt.
 
Zuletzt bearbeitet:
Bislang war es so das anstatt deiner Codezeilen ein einfacher Echo "$dasi</br>"; Befahl stand.

Da wurde dann eine Liste angezeigt inder die maskierten Daten angezeigt wurden. Jeder Eintrag nur einmal.
Ich bin jetzt davon ausgegangen das wenn $dasi als Vergleichvariable nehme , das Scipt die verglichenen und nicht vorhandenen Daten ausgibt.

Ich habe aber scheinbar irgendwo einen Denkfehler da die Ausgabe wie ganz oben angezeigt.
Das Script durchläuft den ersten Eintrag vergleicht dies mit der DB zeigt es . Dann der nächste Eintrag usw.

Noch Ideen
 
Du sagtest doch, dass die Namen in einer Textdatei stehen. Wenn du in der Textdatei nur ein Name pro Zeile (!) schreibst und den Dateinamen im Script noch anpasst, sollte alles funktionieren.
Die Namen in der Datei müssen natürlich genauso geschrieben sein, wie in der DB
 
Grundsätzlich ist es so wie du schreibst.

Ich poste mal einen Auszug aus der Textdatei

Code:
03.11.2005  14:00     1.886.628.352 saf04002
05.11.2005  23:30        23.925.760 saf040022
12.11.2005  23:30        23.196.160 saf040023
19.11.2005  23:30        16.933.888 saf040024
26.11.2005  23:30        47.538.688 saf040025

Ich filtere halt mit meinem Script nur den Namen heraus zB.saf040024.

Und wie ich schon geschrieben habe wenn zwei Namen abgeglichen werden sollen also in der txt-Datei stehen wird bei der Ausgabe alles doppelt ausgegeben.

Also prüft er den ersten Namen vergleich mit DB . Dann den zweiten Namen und zeigt das Ergenbis für jeden Namen einzeln an. Also dann zwei mal die ganzen einträge der DB.
 
Zurück