Array mit werten befüllen - funktioniert nicht

d3mueller

Mitglied
Hi,

hab ein Code geschrieben, der etwas aus der Datenbank holen soll:

PHP:
foreach ($objectId as $key => $value) {
	
	// SQL Befehl wird geschrieben
	// (SQL Befehl funktioniert auch)
	$query = "SELECT objektname,level FROM `Objekte` WHERE `benutzer`='".$this->user."' AND `objektId`='".$value."' AND `planet`='".$planet."'";

	// SQL wird ausgeführt
        // (funktioniert auch)
	$execute = $this->link->query($query) or die("Error in the consult (getUserObjects)..". mysqli_error($this->link));

	// Packt die Daten in ein Array $objects
	$objects = array();

         // Ist im ersten Durchlauf von foreach() 0 und dann 1
	$i = $key;
	
	while($row = mysqli_fetch_array($execute)) {
		$objects[$i]["objektname"] = $row["objektname"];
		$objects[$i]["level"] = $row["level"];

	
	}
			
	}

Der soll folgendes machen:

in $objectId steckt ein Array mit mehreren Werten, also mehreren ObjektIds.

Mit foreach wird jede ObjektId durchgearbeitet. Also erst wird alles mit ID = 0 und dann mit ID = 1 durchgearbeitet.

Das Problem liegt darin, dass array $objects zu befüllen. Es soll später so aussehen:

Code:
$objects[0]["objektname"] = Objekt 1
$objects[0]["level"] = Objektlevel 1
$objects[1]["objektname"] = Objekt 2
$objects[1]["level"] = Objektlevel 2


Aber wenn ich print_r mache, kommt nur das:
Code:
Array ( [1] => Array ( [objektname] => Objekt 2 [level] => Objektlevel 2 ) )

Es kommt also nur das zweite Objekt ins Array, und ich weiß einfach nicht warum.

Die SQL Abfrage funktioniert, die Variablen kommen auch alle an (hab ich einzeln probiert). Und wenn ich innerhalb der while-Schleife ein print_r() mache, dann werden 2 Arrays ausgegeben (2 Durchläufe) und im ersten Array steht alles fürs erste Objekt und im zweiten Array (in dem ja dann beide Objekte sein sollten) steht nur alles für das zweite Objekt.

Ich versteh einfach nicht, warum es nicht geht.

Ich hoffe, ihr versteht wie ich das meine. Ich blick grad gar nichts mehr^^


Danke schon mal

LG
 
PHP:
    $i = $key;
    
    while($row = mysqli_fetch_array($execute)) {
        $objects[$i]["objektname"] = $row["objektname"];
        $objects[$i]["level"] = $row["level"];
    }
$i bleibt immer gleich. Du überschreibst also dauernd dieselbe Position im Array. ABer du kannst es doch einfach so machen:
Lass PHP selber hochzählen. Und, $row hat ja nur diese zwei Felder. Ergo kannst du direkt $row in den Array schreiben.
PHP:
while($row = mysqli_fetch_array($execute)) {
        $objects[] = $row;
    }
 
Danke für die Antwort :)

Aber $i bleibt doch nicht gleich? $key (mit dem $i gleichgesetzt wird) ist doch im ersten Durchlauf null und im zweiten eins. Das hab ich überprüft, indem ich es ausgebe.

Dein Vorschlag ist gut^^, da hab ich das mal wieder zu kompliziert gemacht.

Aber leider funktioniert es nicht :( Kommt das gleiche Ergebnis
 
Oh, ich sehe gerade, das sind 2 Schleifen. Du setzt dein Array innerhalb der foreach-Schleife immer um wieder zurück

Setze $objects = array(); mal ganz an den Anfang
PHP:
$objects = array(); 
foreach ($objectId as $key => $value) { 
    ...
}
 
Kann ich machen, ja. Aber eigentlich kann da nichts passieren, da alle Werte nicht vom User eingegeben werden können. Zumindest nicht direkt, sondern mit Klick auf einen Button beispielsweise. Und den Value dort kann man ja nicht verändern, oder irre ich mich? Aber egal, ich kann das trotzdem mal machen

Wie genau funktioniert das dann? Der gibt doch nur 1 zurück, wenn ein Wert in diesem Array ist. Aber ich verstehe noch nicht, was dann passiert? Kann der dann auch mehrere Reihen auswählen, wenn mehrere passen?
 
Kann ich machen, ja. Aber eigentlich kann da nichts passieren, da alle Werte nicht vom User eingegeben werden können. Zumindest nicht direkt, sondern mit Klick auf einen Button beispielsweise. Und den Value dort kann man ja nicht verändern, oder irre ich mich? Aber egal, ich kann das trotzdem mal machen

Es ist einfach die richtige Vorgehensweise, immer zu escapen. Dann funktioniert der Code immer. Es ist komplizierter, sich Gedanken zu machen, warum möglicherweise nicht escapet werden muss (die Voraussetzungen können sich zudem später mal ändern), als einfach schnell das Escaping hinzuzufügen.

Ein Nutzer kann so ziemlich alles an einem Request manipulieren. Welche Felder abgeschickt werden und welche Werte die haben auf jeden Fall.

So ein Request ist ja im Prinzip nur ein nach bestimmten Regeln (HTTP) formatierter String, der an den Server geschickt wird. Diesen String kannst du auch von Hand in einer Textdatei erstellen und dann an den Server schicken (per wget oder so), ohne auch nur einen Browser zu öffnen.

Wie genau funktioniert das dann? Der gibt doch nur 1 zurück, wenn ein Wert in diesem Array ist. Aber ich verstehe noch nicht, was dann passiert? Kann der dann auch mehrere Reihen auswählen, wenn mehrere passen?

IN() jetzt?

PHP:
<?php

// Sinngemäß:

$planet = 'erde';
$objectIds = array(1, 2, 3, 4, 5);

// Escaping habe ich nicht hinzugefügt

$query = "
    SELECT
            objektId,
            objektname,
            level
    FROM
            `Objekte`
    WHERE
            `benutzer` = '" . $this->user . "'
        AND
            `objektId` IN (" . implode(', ', $objectIds) . ")
        AND
            `planet` = '" . $planet . "'
    ORDER BY
            objektId ASC
    ";

// Und dann eben:
//
// $result = ...
// $objects = array();
//
// while ($row = mysqli_fetch_assoc($result)) {
//     $objects[] = $row;
// }
//
// var_dump($objects);

Es gibt eine Längenbegrenzung für Queries. Die liegt bei: http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_allowed_packet (standardmäßig wohl 4 MiB). Das aber nur der Vollständigkeit halber.
 
Okay, danke :D

Noch eine Frage:

Kann man das hier:

PHP:
...
$execute = $this->link->query($query);
	if ($execute) { // Erfolgreich
} else {
// nicht erfolgreich
}

so schreiben:


PHP:
	if ($this->link->query($query)) {
} else {

}

Hatte damit mal Probleme, weiß aber nicht, ob es an der Schreibweise liegt.
Weil würde man das so machen können, würde man ja vermeiden, 2mal die Variable $execute zu benutzen.

Aber wird der SQL-Befehl so trotzdem noch ausgeführt?
 
Zuletzt bearbeitet:
Ja, wird er. Das ist funktional das gleiche, nur dass du eben den Rückgabewert nicht mehr konkret in einer Variablen vorliegen hast.
 
Zurück