Probleme mit einer Funktion

SantaCruze

Erfahrenes Mitglied
Hallo allerseits. Um MYSQL Querys zu sparen wollte ich eine Funktion umändern.

Das ganze sieht bei mir bis dato so aus :
PHP:
    //Ermittelt, ob die alle notwendigen Voraussetzungen für ein Object erreicht sind.
    function needs_met($coords, $need_id)
    { 
        $gal = $coords['gal'];
        $sys = $coords['sys'];
        $plan = $coords['plan'];
     
	 $id=$need_id;
	
     switch($id)
	 {
	 case 2:
	 $row['building'] = 1;
	 $row['level'] = 50;
	 break;
	 case 3:
	 $row['building'] = 1;
	 $row['level'] = 50;
	 break;
	 case 12:
	 $row['building'] = 1;
	 $row['level'] = 50;
	 break;
	 }
	 return $row;
        
        $some_hope = true;

        while ($row && $some_hope)
        {
            if (!$this->planets_building_has($coords, $row['building'], $row['level']))
            {
                $some_hope = false;
            } 
        } 
        
        return $some_hope;
    }

Problem ist allerdings, das er anscheinend die werte aus der switch abfrage nicht richtig übergibt. Daher, die Gebäude richten sich nicht nach den Voraussetzungen sondern sind trotzdem sichtbar.

Der alte Querry dazu sah so aus:
$db4->query("SELECT * FROM needs WHERE id='$need_id';");
 
1. Hast du dir $id vor dem Switch mal ausgeben lassen?
2. Ich empfehle dir dringend eine default-Anweisung im Switch zu hinterlassen, sei es auch nur für Debug-Zwecke
3. Du weisst, dass der Teil der Funktion nach return $row; niemals ausgeführt wird, oder? Wenn $id weder 2, 3 oder 12 ist, wird $row einfach leer zurück gegeben. Die return-Anweisung beendet aber die Funktion in jedem Fall.
4. Wenn $need_id kein String ist, würde ich in einem Query direkt id ohne Anführungszeichen prüfen: SELECT [...] FROM `table` WHERE id=$need_id

Ich kann mir vorstellen, dass deine $id nicht 2, 3 oder 12 ist und $row von daher leer zurück gegeben wird, was dann aussieht als würde nichts passieren.

Gruss
Igäl
 
Naja ich will den Querry ja weghaben und diesen durch direktes Auslesen definieren. Kennst Du vielleicht ne bessere möglichkeit als die Switch Abfrage? Die ID soll im Script selbst definiert werden und die Schleife die danach folgt soll einfach die IDs die vorher definiert worden sind abarbeiten.
 
Zuletzt bearbeitet:
Was spricht gegen DB-Abfragen? Erklär mir doch mal, was du hier genau machen möchtest. Ich versteh ein paar Dinge nicht wirklich, die du da geschrieben hast. Beispielsweise warum du nach dem Switch die Funktion abbrechen willst oder warum du über einen Hash mit einem Eintrag eine While-Schleife laufen lässt.

Anscheinend machst du ein Browser-Game :) Erklär aber doch erstmals, was der Codeschnipsel bewirken soll und was die ursprüngliche DB-Abfrage überhaupt ausgelesen hat.
 
Die ABfrage ist folgendermaßen gedacht, er berechnet anhand einer "Need Id" das Gebäude und das entsprechende Level aus der Datenbank. Da ich aber momentan viel zu viele Anfragen an die Datenbank habe, versuche ich grad die Querrys die ich nicht brauche auszubauen und alles über script bzw. funktion auslesen zu lassen.
 
Jo sieht doch gut aus, bis auf das return $row.

Habs mal etwas umgeschrieben. Schau mal, ob du es so brauchen kannst:

PHP:
function needs_met($coords, $need_id) {
	$gal = $coords['gal'];		//Was tust du hier? Die drei Variablen werden ja nirgends gebraucht
	$sys = $coords['sys'];
	$plan = $coords['plan'];

	switch($need_id)	{
		case 2:		$row['building'] = 1;
					$row['level'] = 50;
					break;
		case 3:		$row['building'] = 1;
					$row['level'] = 50;
					break;
		case 12:	$row['building'] = 1;
					$row['level'] = 50;
					break;
	}

	if(!$this->planets_building_has($coords, $row['building'], $row['level']))	{
		return false;
	}else{
		return true;
	}
}

Die while-Schleife hab ich raus genommen, da im $row-Hash ja sowieso nur ein Datensatz vorhanden ist.
 
Sooo :) Also ich danke vielmals, hat alles geklappt wie es sollte. Noch eine Frage habe ich aber, ich will mehrere bestimte Ids auslesen, normal habe ich den befehl

SELECT id FROM test WHERE id<29

verwendet. Also alles was kleiner ist als 29. Nun habe ich aber das problem das bei mir einige IDs durcheinander sind, sprich ich will unter anderem ID 18,25,27 auslesen. Versucht habe ich

WHERE id=18 AND id=25 AND id=27

aber das scheint nicht zu funktionierne. Gibts dafür nen bestimmten Syntax?
 
Wenn du damit meinst, dass du die Datensätze nach der ID sortieren willst, kannst du das mit ORDER BY machen.

SELECT Feld1, Feld2 FROM `table` WHERE id<29 ORDER BY id ASC/DESC

Entweder kannst du hier aufsteigend (ASC) oder absteigend (DESC) sortieren.
 
Häng an das SQL einfach ein "ORDER BY id DESC" oder "ORDER BY id ASC" an, damit sortierst Du die Id's

LG
Andy
 
Nein ich meinte nicht Sortieren.

ICh will z.b. nur bestimmte IDs anzeigen lassen, von 40 IDs z.b. nur id 25,27,39 ohne die resltichen. Gibts dafür ne möglichkeit?

Achja und direkt noch ne frage, in der Switch Schleife habe ich ja immer nur einen case,nun ist es aber so, das in der datenbank manchmal mehrere sachen zutreffen müssen, z.b.
ID 201 braucht id 30 auf 5 und id 40 auf 5.

Kann ich das einfach so umsetzen?
PHP:
 switch($need_id)    {
        case 201: $row['building'] = 30;
                       $row['level'] = 5;
                       $row['building'] = 40;
                       $row['level'] = 5;
                       break;
 
Zurück