MySQL Statement Problem

TTlong

Angesehenes Mitglied
Hi,

ich versuche gerade krampfhaft folgende Abfrage:

QUOTE SELECT Ort FROM <tabelle> WHERE Ort BETWEEN 'a' AND 'n' GROUP BY Ort


Aber die Ausgabe erfolgt immer doppelt, also in etwa so:

Aachen
...
...
...
...
München
Aachen
...
...
...
...
München


Was ist an dem Statement falsch bzw. warum wird das immer 2 mal ausgegeben?

Hier mal die ganze Funktion

QUOTE public function showAllEntries() {

  $sql = "SELECT Ort FROM <tabelle> WHERE Ort BETWEEN 'a' AND 'n' GROUP BY Ort";
  $result = $this->DB->query($sql);
 
  foreach($result as $value){
  $this->listing .= "<p>".$value['Ort']."</p>";
  }

  return $this->listing;
}



Mfg TTlong
 
QUOTE (TTlong @ Di 20.10.2009, 19:50) [...]
Was ist an dem Statement falsch bzw. warum wird das immer 2 mal ausgegeben?
[...]

Hallo,
zwar kenne ich den Sinn und Zweck der Abfrage nicht, aber die doppelten Werten kannst du mit DISTINCT eliminieren.

z.B.

SELECT DISTINCT Ort FROM <tabelle> WHERE Ort BETWEEN 'a' AND 'n' GROUP BY Ort

Gruss
Lenny
 
Lenny, Group By eliminiert bereits Duplikate, ist aufwendiger als Distinct.

Ich vermute, daß die Funktion doppelt aufgerufen wird bzw. doppelt verkettet wird.

Einerseits wird in $this->listing gesammelt, andererseits wird $this->listing zurückgegeben, da muß ja bloß weiter unten etwas wie

QUOTE $this->listing .= showAllEntries()


verwendet werden, schon ist das doppelt.


Sprich: Das wäre gar kein Sql-Problem.
 
QUOTE (Jürgen Auer @ Di 20.10.2009, 20:25) Ich vermute, daß die Funktion doppelt aufgerufen wird bzw. doppelt verkettet wird.

Irgendwie ist da irgendwo was dran.

Ich hab des jetzt mal auseinandergefriemelt und zwei Funktionen draus gemacht (war am Anfang noch bissel dynamischer).

Ziel soll sein: Alle Orte in der DB auszugeben. Einmal mit den Anfangsbuchstaben von A-M und einmal von N-Z.

Funktion A-M

QUOTE public function showA() {

  $sql = "SELECT Ort FROM <tabelle> WHERE Ort BETWEEN 'a' AND 'n' GROUP BY Ort";
  $result = $this->DB->query($sql);
  
  foreach($result as $value){
   $this->listing .= "<p">".$value['Ort']."</p>";
  }

  return $this->listing;
}


Funktion N-Z

QUOTE public function showB() {

  $sql = "SELECT Ort FROM <tabelle> WHERE Ort BETWEEN 'n' AND 'z' GROUP BY Ort";
  $result = $this->DB->query($sql);
  
  foreach($result as $value){
   $this->listing .= "<p">".$value['Ort']."</p>";
  }

  return $this->listing;
}


Mit $obj->showA(); bekomme ich wunderbar nur die gewünschten Einträge. Lasse ich nun eine Zeile weiter aber die zweite Funktion arbeiten ($obj->showB(); ), wird die zweite Ausgabe inkl. der Einträge der ersten Funktion.

Beide alleine funktionieren.
 
Du kannst $this->listing ja leer initialisieren:

CODE $this->listing = "";
foreach($result as $value){
  $this->listing .= "<p">".$value['Ort']."</p>";
 }
 
QUOTE (TTlong @ Di 20.10.2009, 21:37)Mit $obj->showA(); bekomme ich wunderbar nur die gewünschten Einträge. Lasse ich nun eine Zeile weiter aber die zweite Funktion arbeiten ($obj->showB(); ), wird die zweite Ausgabe inkl. der Einträge der ersten Funktion.

Na ja, aber das ist doch zwangsläufig so. Das 'return' ist bei so einem direkten Aufruf ohnehin wirkungslos, das verpufft. Der Wert wird zwar zurückgegeben, aber nicht neu zugewiesen.


Ansonsten wird in der Variablen $this->listing gesammelt. Rufst Du beide Funktionen einmal auf, steht beides hintereinander drin.
 
QUOTE (Jörg Kruse @ Di 20.10.2009, 21:09) Du kannst $this->listing ja leer initialisieren:

Das scheint die Lösung, zumindest funktioniert es so.

Frage: Warum muss ich das vorher leer initalisieren?



Danke und gute Nacht.


MfG TTlong
 
Mit der Initialisierung überschreibst du den Wert, der z.B. durch einen vorhergehenden Funktionsaufruf der Variable zugewiesen wurde.
 
QUOTE (Jürgen Auer @ Di 20.10.2009, 22:16) Ansonsten wird in der Variablen $this->listing gesammelt. Rufst Du beide Funktionen einmal auf, steht beides hintereinander drin.

unter C waren Variablen per default global .... dort muste man sie in funktionen als "local" definieren damit sie nur hier gültig sind

in PHP sind die aber per default "local" und es gibt hier ja keinen expliziten "global"

oder gilt das nur für "normale"Variablen und nicht für Objecte?


ich sehe da eventuell ein Problem das das in der SQLergebnissvar gespeichert wird
( und die eben, weil sie zu SQL gehört, dann global ist wie $_GET oder so Zeugs )

was passiert hier

CODE
public function showAoderB() {

$sql = "SELECT Ort FROM <tabelle> WHERE Ort BETWEEN 'n' AND 'z' GROUP BY Ort";
$result = $this->DB->query($sql);

foreach($result as $value){
$output .= "<p">".$value['Ort']."</p>";
}

return $output;
}

echo('<hr>'. showA() );
echo('<hr>'. showB() );





PS
ich hab Gestern den ganzen Tag nach einem Fehler gesucht .... hab mich voll aufgeregt das PHP keine Fehlermeldung anzeigt (die älteren PHPs haben das immer gemacht)
alles gebackupt und dann stück für stück zurückgeholt um zu sehen wann das Script seinen Dienst einstellt

am Ende wunder ich mich über zwei "close" die unterschiedlich aussehen

CODE
} fclose($handle);
fclode($handle1);


 
QUOTE (800XE @ Mi 21.10.2009, 03:07) in PHP sind die aber per default "local" und es gibt hier ja keinen expliziten "global"

CODE public function showAoderB() {



ähm, ... das "public" ... ist das vielleicht das "global"?
 
Zurück
Oben