Da Pinky: strings vergleichen - steh auf dem schlauch

hallo,
habe eine datenbank, ein table countrys mit namen und id und dann noch einen table "location" in welchem zu countrys noch regionen und stadte zugeordnet werden.
jetzt möchte ich 2 textstrings vergleichen. der erste ist das ergebniss einer datenbankabfrage ($res['countryname']), der 2. eine variable welche den inhalte der vorherigen zeile ($country_tmp) beinhaltet. jetzt soll jedesmal, wenn in der abfrage ein neues land beginnt dieses als link ausgegeben werden - ansonsten sollen einfach die anderen werte aus der aktuellen spalte ausgegeben werden.
wer mit jetzt nicht folgen kann, für den das ganze nochmal als php-code:

function listcountrys() {
 global $db;
 $out = "";
 $sql = "SELECT l.country_id, l.state_short, l.state_long, c.name as countryname FROM location l INNER JOIN country c ON c.country_id=l.country_id GROUP BY l.country_id, l.state_short, l.state_long, countryname ORDER BY countryname DESC";
 //echo $sql."<br>";
 $erg = $db->query($sql);
    while ($res = $db->getdata($erg)) {
  if(!$country_tmp==$res['countryname']) {
            $country_tmp=$res['countryname'];
   $out .= '<br><h2><a href="?country_id='.$res['country_id'].'">'.$country_tmp.'</a></h2>'."\n";
  }
        $state_tmp=$res['state_short'];
        $out .= ' <a href="?country_id='.$res['country_id'].'&state='.$res['state_short'].'">'.$res['state_long'].'</a> '."\n";
 }
 return $out;
}

wer den fehler nicht sofort findet und es ausprobieren möchte, hier die 2 tables: (2.5kB)
http://www.shareyourride.net/test/transport.sql

jemand mit einer idee hier was in den diesen zeilen falsch ist:
  if(!$country_tmp==$res['countryname']) {
            $country_tmp=$res['countryname'];
   $out .= '<br><h2><a href="?country_id='.$res['country_id'].'">'.$country_tmp.'</a></h2>'."\n";
  }
danke für eure mühen...

  1. Hi Da,

    jemand mit einer idee hier was in den diesen zeilen falsch ist:
      if(!$country_tmp==$res['countryname']) {
                $country_tmp=$res['countryname'];
       $out .= '<br><h2><a href="?country_id='.$res['country_id'].'">'.$country_tmp.'</a></h2>'."\n";
      }

    Ich würde mal mit

    if($country_tmp != $res['countryname'])

    probieren und zu Beginn $country_tmp mit "" initialisieren.

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Crypt::PasswdMD5 jetzt auch in PHP
    Das Leben ist kein Warenhaus - es nimmt nichts zurück. (Anette Louisan)
    1. echo $begrüßung;

      if(!$country_tmp==$res['countryname']) {
                  $country_tmp=$res['countryname'];
      Ich würde mal mit

      if($country_tmp != $res['countryname'])

      probieren

      Die Begründung dazu lautet: ! hat eine höhere Priorität als ==

      Und darum läuft es schief:

      Erster Durchlauf: $country_tmp ist nicht initialisiert. Mal abgesehen von der Notice, dass es diese Variable nicht initialisiert wurde, die gekommen wäre, wenn das error_reporting auf E_ALL gestanden hätte, gibt ein Lesezugriff darauf NULL zurück. Durch die Negation (!) und eine automatische Typumwandlung von NULL nach false, ergibt !$country_tmp true. Das wird verglichen mit einem (hoffentlich existierenden) $res['countryname'] dessen Inhalt vermutlich nicht '' oder '0' ist, also true entspricht. Bedingung erfüllt, Durch die folgende Zuweisung erhält $country_temp enthält nun einen Wert, der als true interpretiert wird.

      Die weiteren Durchläufe: !$country_tmp ergibt nun false, verglichen mit $res['countryname'], was als true gewertet wird, wird die Bedingung nicht erfüllt. Sie würde erst dann erfüllt werden, wenn $res['countryname'] '', '0', 0 oder NULL, also einen Wert, der als false interpretiert wird, beinhalten würde.

      Da Pinky: Im Ausgangsposting fehlt übrigens eine Fehlerbeschreibung. Du schriebst zwar, was passieren soll, nicht jedoch was statt dessen passiert, und dazu die Angabe der genauen Fehlermeldung, so vorhanden. Passiert sein dürfte folgendes: Das erste Land wird angezeigt, die anderen dagegen nicht mehr.

      echo "$verabschiedung $name";

      1. if($country_tmp != $res['countryname'])
        Die Begründung dazu lautet: ! hat eine höhere Priorität als ==

        Da Pinky: Im Ausgangsposting fehlt übrigens eine Fehlerbeschreibung. Du schriebst zwar, was passieren soll, nicht jedoch was statt dessen passiert, und dazu die Angabe der genauen Fehlermeldung, so vorhanden. Passiert sein dürfte folgendes: Das erste Land wird angezeigt, die anderen dagegen nicht mehr.

        ja, stimmt. ich danke natürlich allen die geantwortet haben.
        bei meinem code waren alle variablen definiert, ist aber beim copy&paste mit unter die räder gekommen, da dazwischen noch der sql-string zusammengesetzt wird, je nach übergebenen parameter.

          
         global $db;  
         $out = "";  
          $country_tmp="";  
          $state_tmp="";  
          $city_tmp="";  
        
        

        das ganze funktioniert zwar jetzt, hatte es aber bevor ich das posting hier losgelassen habe auch mit "!=" statt "! $var == $var2" probiert, was aus irgend einem grunde auch nicht so wollte wie ich...

        1. echo $begrüßung;

          ... was aus irgend einem grunde auch nicht so wollte wie ich...

          Für die Fehlersuche im Allgmeinen ist es sinnvoll, einzelne Ausdrücke daraufhin zu testen, ob sie das gewünschte Ergebnis bringen. Dazu eignet sich var_dump() recht gut, weil das auch den Typ des Ergebnisses anzeigt.

          $c = !$a == $b;

          Hier sollte eingentlich erreicht werden, $a mit $b zu vergleichen,

          zu testen mit: var_dump($a == $b);

          und dann soll negiert werden:

          das sollte dann das entgegengesetzte Ergebnis liefern: var_dump(!$a == $b);

          Mit verschieden durchprobierten Eingangswerten sollte man feststellen können, dass das Erwartung und Ergebnis nicht oder nicht immer übereinstimmen.

          Wenn man sich mal nicht über die Operatorenrangfolge im Klaren ist, bzw. der Ausdruck nicht so will, wie man selbst, kann man ihn mit Klammern zu bezwingen versuchen.

          echo "$verabschiedung $name";