Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

In einem PHP Script doppelte Werte verwerfen

Frage Entwicklung PHP

Mitglied: gechger

gechger (Level 1) - Jetzt verbinden

08.03.2010, aktualisiert 25.05.2010, 4178 Aufrufe, 4 Kommentare

Währen deines Schleifendurchlaus (Datenbankabfrage) können Werte doppelt ausgegeben werden. Ich will aber keine doppelten Werte in der Ausgabe

Hallo Forum,

eine vergleichbare Ausgabe bekomme ich bei meiner Datenbankabfrage:

bDAT=2010-03-01_14:56:49--bGPS=V,4952.7818,N,00909.0253,E,--bLOG=1468

Ich möchte nun auf den Wert blog=xxxx prüfen. Der Wert steht in einem Array $werte[3].
Wenn ein Wert existiert, will ich ihn ausgeben. Taucht er ein zweites Mal auf, soll er verworfen werden.
Ich will als Ergebnis alle blog-Werte haben, die das Kriterium erfüllen, ohne eine unübersichtlich lange Liste auszugeben.

Wie fange ich das am geschicktesten an?

Hinweis: Die Anzahl der gefundenen Datensätze bekomme ich bereits.

01.
 
02.
$count="0"
03.
 
04.
        $dbconnect = mysql_connect($host, $user, $kennwort); // or die(mysql_error()); 
05.
        mysql_select_db($dbname); 
06.
        $sql="SELECT * FROM kddaten order by 'name' " or die( mysql_error()); 
07.
        $result = mysql_query($sql) ; 
08.
        while($temp=mysql_fetch_assoc($result)){ 
09.
                $kdarray[]=$temp
10.
11.
         mysql_close($dbconnect); 
12.
 
13.
 
14.
 
15.
 foreach($kdarray as $key => $kunden_array) { 
16.
 
17.
 $conn=mysql_connect($kunden_array[host], $kunden_array[anmeldung], $kunden_array[kennwort]); 
18.
 $db=mysql_select_db($kunden_array[dbname]); 
19.
 
20.
   if (($kunden_array[dbname] == "localhost") or ($kunden_array[name] == "mztest") or ($kunden_array[name] == "Mobilzeit") or ($kunden_array[name] == "Mobilzeit NEU")) 
21.
22.
      continue
23.
24.
      $now = date("H:i:s" , $_SERVER['REQUEST_TIME']); 
25.
      $sql = "SELECT datum, werte FROM $kunden_array[tabelle] where DATE_SUB(now(), INTERVAL 7 DAY) < datum" or die( mysql_error()); 
26.
      //echo "SQL: $sql","<br>"
27.
      $abfrage = mysql_db_query($kunden_array[dbname],$sql); // or die(mysql_error()); 
28.
      while($fetch=mysql_fetch_row($abfrage)) 
29.
30.
               //echo "<pre>"
31.
               //print_r($fetch[1]); 
32.
               //echo "</pre>"
33.
            $werte = explode( "\t", $fetch[1] ); 
34.
 
35.
                  $datum=$werte[0]; 
36.
                  $table=$werte[1]; 
37.
                  $btyp=$werte[2]; 
38.
                  $blog=$werte[3]; 
39.
                  $bdat=$werte[4]; 
40.
                  $bimp=$werte[5]; 
41.
                  $bflag=$werte[6]; 
42.
                  $bgps=$werte[7]; 
43.
                  //echo "GPS: $bgps","<br>"
44.
                  $bter=$werte[8]; 
45.
                  $bper=$werte[9]; 
46.
 
47.
 
48.
            if ($table=="table=BB" and (substr($bgps,5,1)=="B" or substr($bgps,5,1)=="D" or substr($bgps,5,1)=="V")) 
49.
50.
               if  ($kunden_array[name] == $lastkunde
51.
52.
                  echo "$kunden_array[name]"."--"." $lastkunde"."--"."$werte[4]"."--"."$werte[7]"."--"."$werte[3]","<br>"
53.
                  $count++; 
54.
55.
                  if ($kunden_array[name] != $lastkunde
56.
57.
                     echo "$lastkunde","$count","<br>"
58.
                     $count="0"
59.
60.
 
61.
 
62.
           $lastkunde=$kunden_array[name]; 
63.
               //echo "$kunden_array[name]"." | "."$blog"." |  "."$bdat"."  |  "."$bgps","<br>"
64.
65.
66.
 
67.
 
68.
 
69.
                                mysql_close($conn); 
70.
 
71.
72.
?>
Vielen Dank für jede Idee.

Viele Grüße
Chris
Mitglied: Arano
08.03.2010 um 11:00 Uhr
Guten Morgen Christof,

01.
$sql="SELECT * FROM kddaten order by 'name' " or die( mysql_error());
War das Absicht ? Die Zuweisung des Werte in die Variable wird wohl immer erfolgreich sein und somit das die() niemals ausgelöst Das die() müsstest du in diesem Fall schon hinter das mysql_query() setzen damit ein Fehler beim ausführen des Querys zur Auslösung des die()s führt.
Aber eine schöne Fehlerbehandlung ist das auch nicht
Diesen Fehler machst du leider noch ein weiteres mal...

01.
$kunden_array[host]
Hier machst du grundsätzlich den Fehler das du bei dem Index die Anführungszeichen weg lässt. Das ist nicht richtig ! So wird davon ausgegangen, das es sich (in diesem Beispiel) bei "host" um eine Konstante handelt die vorher irgendwo definiert sein müsste.
01.
$kunden_array['host'] //oder 
02.
$kunden_array["host"]
währen hier die richtigen Schreibweisen ! Das gilt weitestgehend für __alle__ deine Array Zugriffe.
Schau dir mal deine Log's und/oder die error_reporting Direktive in der PHP.ini an, dieser Fehler sollte mindestens eine PHP-Fehlermeldung des Levels: "E_NOTICE" (Notice: Use of undefined constant host - assumed 'host' )geben die dir scheinbar nicht angezeigt wird. So oft wie du diesen Fehler aber gemacht hast, müsstest du eigentlich vor lauter Hinweisen nichts anderes mehr sehen können *g* Beim entwickeln ist es immer hilfreich alle möglichen Fehlermeldungen angezeigt zu bekommen - __und zu beseitigen__

01.
foreach($kdarray as $key => $kunden_array)  
02.
03.
    $conn=mysql_connect($kunden_array[host], $kunden_array[anmeldung], $kunden_array[kennwort]);  
04.
    $db=mysql_select_db($kunden_array[dbname]); 
05.
    if (($kunden_array[dbname] == "localhost") or ($kunden_array[name] == "mztest") or ($kunden_array[name] == "Mobilzeit") or ($kunden_array[name] == "Mobilzeit NEU"))  
06.
07.
        continue;  
08.
09.
    // ...weitere code... 
10.
}
Du stellst erst eine Verbindung zum Server und der Datenbank her um anschließend festzustellen das du zu dieser nicht verbinden möchtest und springst direkt zum nächsten Verbinden. (Und das noch ohne die vorher aufgebaute Verbindung wieder zu trennen) !?
Prüfe erst ob es eine der Datenbanken ist zu denen du verbinden möchtest und erst wenn das der Fall ist tue dies
01.
foreach( ...  ) 
02.
03.
    // wenn name in "unerwünschtliste", überspringe. 
04.
    if(in_array(DB_NAME,array('name','name2','name3','name4'))) 
05.
        continue
06.
     
07.
    // name ist nicht in "unerwünschtliste", verarbeite ihn. 
08.
    mysql_connect(); 
09.
    mysql_select_db(); 
10.
    // ... 
11.
}
__Zu deiner Frage__:
Erstelle dir ein weiteres Array in dem du alle schon Ausgegebenen bLOG-Nummern hinzufügst. Vor der Ausgabe eines weiteren Eintrages prüfst du nun ob die bLOG-Nummer schon in dem Array steht oder nicht.
ACHTUNG: ungetestete Gedanken die in den Browser getippt wurden
01.
foreach($kdarray as $key => $kunden_array
02.
03.
    // hier platziert, damit fuer jeden kunden mit einem leerem array gearbeitet wird, 
04.
    // falls die bLOG-Nummern sich ueberschneiden  koenen 
05.
    $arrKnown = array(); 
06.
    while($fetch=mysql_fetch_row($abfrage)) 
07.
08.
        // explode 
09.
        // if B or D or
10.
         
11.
        // prüfe ob der bLOG bereit ausgegeben wurde (bekannt ist) 
12.
        // wenn er noch unbekannt ist: 
13.
        if(!in_array($werte3, $arrKnown)) 
14.
15.
            // gebe ihn aus und füge ihn zu den bekannten hinzu: 
16.
            $arrKnow[] = $werte[3]; 
17.
            echo 'Hier die Ausgabe der Daten des bLOGs'
18.
19.
20.
}

Einen schönen Montag
~Arano

Edit: Ein paar Fehler beseitigt und Text erweitert.
Edit: Das $arrKnown IN die foreach-Kunden-Schleife gesetzt, siehe Kommentar.
Bitte warten ..
Mitglied: gechger
09.03.2010 um 08:42 Uhr
Grüß Dich Arano,

wow, mit so einer ausführlichen Antwort habe ich nun wirklich nicht gerechnet

Zum besseren Verständnis:
was ich nicht mit gepostet habe sind die Zugangsdaten zu einer Datenbank, die alle Informationen / Zugangsdaten der Kunden-Datenbanken enthält. Aus dieser frage ich die Zugangsdaten ab, schreibe sie in ein array, verbinde mich mit der Datenbank und durchsuche sie. Deshalb könnte die sql-Abfrage schon mal ins Leere laufen und wird mit 'or die' beendet.

Wegen der Schreibweise danke ich Dir für den Hinweis. Ich habe bis heute nicht so richtig verstanden, wann man Hochkomma, Anführungstriche oder gar nichts zu verwenden hat.


Zu Deinem Vorschlag:
Das "in_array* hört sich gut an. das werde ich mal einbauen und berichte dann.


Vielen Dank für Deine Antwort
Chris
Bitte warten ..
Mitglied: Arano
09.03.2010 um 10:17 Uhr
Morgen Chris

Zum besseren Verständnis:
was ich nicht mit gepostet habe sind die Zugangsdaten zu einer Datenbank, die alle Informationen / Zugangsdaten der
Kunden-Datenbanken enthält. Aus dieser frage ich die Zugangsdaten ab, schreibe sie in ein array, verbinde mich mit der
Datenbank und durchsuche sie. Deshalb könnte die sql-Abfrage schon mal ins Leere laufen und wird mit 'or die'
beendet.
Öhm.. okay ...aber...
01.
$sql="SELECT * FROM kddaten order by 'name' " or die( mysql_error()); 
enthält nichts aus einer früheren Abfrage und somit ist es eine ganz normale Zuweisung einer Zeichenkette in eine Variable und diese Zuweisung wird niemals einen Fehler werfen und so das die() nie auslösen.
So, jetzt habe ich es selber gerade mal getestet - Fazit: Es funktioniert nicht oder man muss es mir mal zeigen. Bei folgendem Test habe ich nie die Ausgabe eines der die()'s gesehen:
01.
<?php 
02.
 
03.
$var1 = NULL; 
04.
$var2 = 'Variable'
05.
// $var3 - undefiniert ! 
06.
 
07.
$str1 = 'Es folg ein Wert aus einer: '.$var1 or die('zuweisung 1 schlug fehl'); 
08.
$str2 = 'Es folg ein Wert aus einer: '.$var2 or die('zuweisung 2 schlug fehl'); 
09.
$str3 = 'Es folg ein Wert aus einer: '.$var3 or die('zuweisung 3 schlug fehl'); 
10.
 
11.
echo '1. '.$str1.'<br><br>'
12.
     '2. '.$str2.'<br><br>'
13.
     '3. '.$str3.'<br><br>'
14.
 
15.
// Ausgabe 1: "Es folg ein Wert aus einer: " 
16.
// Ausgabe 2: "Es folg ein Wert aus einer: Variable" 
17.
// Ausgabe 3: "Notice: Undefined variable: var3 in /srv/htdocs/test/www/strDie.php on line 8" 
18.
 
19.
?>
Wegen der Schreibweise danke ich Dir für den Hinweis. Ich habe bis heute nicht so richtig verstanden, wann man Hochkomma,
Anführungstriche oder gar nichts zu verwenden hat.
Hihi, ist wohl auch immer noch so denn den unterschied zwischen einfachen Anführungszeichen und doppelten habe ich ja gar nicht angesprochen, hehe.
Mensch, ich meinte auf php.net gäbe es eine Erklärung dazu aber die finde ich gerade natürlich nicht. Ich fasse mich kurz:
01.
$php = 'PHP'
02.
echo "Der Inhalt dieser beiden doppelten Anführungszeichen wird von $php geparst um vorhandene Variabeln zu ersetzen"
03.
echo 'Der Inhalt dieser beiden einfachen Anführungszeichen wird von $php NICHT geparst und so auch keine Variabeln ersetzt'
04.
echo 'Jetzt unterbrechen wir eine Zeichen kette um von '.$php.' einen Variabel einfügen zu lassen\n'
05.
// Das heisst, eigentlich habe wir beim drittem echo "nur" drei Zeichenketten aneinander gehängt. 
06.
// Das funktioniert auch mit Steuerzeichen, das "New line"(\n) ganz am Ende wird z.B. einfach als zwei Zeihen, ein "\" und ein "n" ausgegeben. 
07.
// Deswegen kann man sie auch "mischen":   echo 'wort '."wort ".'wort '."\n".$strFuerZweiteZeille
08.
 
09.
// Ausgabe 1: "Der Inhalt dieser beiden doppelten Anführungszeichen wird von PHP geparst um vorhandene Variabeln zu ersetzen" 
10.
// Ausgabe 2: "Der Inhalt dieser beiden einfachen Anführungszeichen wird von $php NICHT geparst und so auch keine Variabeln ersetzt" 
11.
// Ausgabe 3: "Jetzt unterbrechen wir eine Zeichen kette um von PHP einen Variabel einfügen zu lassen\n"
Zu Deinem Vorschlag:
Das "in_array* hört sich gut an. das werde ich mal einbauen und berichte dann.
Vielen Dank für Deine Antwort
Chris
Aber klar doch, gerne wieder
~Tobias
Bitte warten ..
Mitglied: gechger
16.03.2010 um 08:43 Uhr
Hallo Tobias,

vielen Dank für die ausführliche Antwort.
Das "in_array" liefert genau das, was ich brauchte. Leider hat sich dadurch nun ein anderer logischer Fehler gezeigt, so daß ich die Logik des Scriptes komplett überdenken muß.
Ich bekomme aus jeder Datenbank, die ich abfrage, saubere Werte, nur nicht aus der Letzten. Dort greift mein Abfragekriterium nicht (Wechsel der Datenbank), weil es nach der letzten Datenbank eben keine weitere gibt, zu der ich wechseln könnte.

Aber die ursprüngliche Frage ist gelöst.

Schöne Grüße
Christof
Bitte warten ..
Ähnliche Inhalte
Datenbanken
Doppelten Datensatz suchen und Wert erhöhen
gelöst Frage von dax4funDatenbanken1 Kommentar

Moin, es gingen mir schon alle Suchbegriffe beim googlen aus um eine SQL Abfrage zu basteln die folgendes tun ...

Microsoft Office
Wenn Wert doppelt, dann Zeile darunter einfügen
gelöst Frage von PhilosophMicrosoft Office12 Kommentare

Hallo alle zusammen! Ich habe eine Exceldatei mit 5 Spalten. In Spalte A befinden sich Kundennummern, in Spalte B ...

PHP
PHP Dropdown Menü, Werte aus DB
Frage von laladuduPHP3 Kommentare

Hi, ich hoffe jemand versteht mein Problem^^ Folgendes: Ich habe die Tabelle "Geräte" mit Geräte ID (PK) Gerätename raumID ...

PHP
PHP-Script um Online zu zippen
Frage von sbsnewbiePHP3 Kommentare

Hallo Admins, folgende Frage, die bestimmt easy ist, bei der ich aber gerade ein Brett vor dem Kopf habe: ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 19 StundenBatch & Shell8 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 21 StundenHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows 10
Bitlocker nach Verschlüsselung nicht mehr aufrufbar!
gelöst Frage von alexlazaWindows 1013 Kommentare

Hallo, ich besitze ein HP ZBook 17 G4 mit einem Windows 10 Pro Betriebssystem. Bei diesem Problem handelt sich, ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows Server
Sichere Remote Desktop Verbindung wie?
gelöst Frage von nuss33Windows Server11 Kommentare

Hallo zusammen, eins vorweg: Ich besitze einen privaten Windows Server 2008 R2 zu Hause im Netzwerk er wird nicht ...