Eckige Klammern: Quot

XEMO

Mitglied
Folgendes Szenario;
ich hab ne Userdatenbank,
in der werden Userid + SessionID + etc. gespeichert (logisch). :-)

es existiert eine Klasse/Objekt das für den Datenbankzugriff zuständig ist.
ich kann deshalb die Datenbank folgendermaßen abfragen;

PHP:
$username = prepare_4db ($_GET["user"], 16, false);
$result = $itraxx_user_obj->database_query("SELECT * FROM user WHERE username='$username' LIMIT 1");
$row = $itraxx_user_obj->database_fetch_array($result);

theorethisch kann ich dann jeden beliebige Wert der Zeile folgendermassen abfragen:

PHP:
$row[SPALTENNAME];

Nun stellt sich mir aber die Frage ob ich den Spaltenname in Quots oder einfach so eintragen kann.
Ich hab beide Varianten ausprobiert, jedoch funktioniert die Variante ohne Quots unzuverlässig. D.h. manchmal bekomm ich einen Wert, manchmal auch nicht.
Es ist dabei egal ob es sich um einen String oder eine Zahl als Rückgabewert handelt.

Stellt sich die Frage wonach ich mich richten muss, wann muss ich die Quot-Variante ('SPALTENNAME') verwenden und wann kann ich sie weglassen :confused:

Dies ist keine auf die Klasse bezogene Frage (denn die Stammt von mir :-) ) sondern eine allgemeine PHP-Frage.
Nach welchen Regeln muss ich mich Richten
 
Einfache Antwort: Verwende immer die Methode, die dir keine Warnung ausspuckt, wenn das Script mit error_reporting = LC_ALL läuft.

Erklärung: Wenn du keine Anführungszeichen verwendest, wird der Teil zwischen den eckigen Klammern als Name einer Konstante ausgewertet. Da eine derartige Konstante aber nur in den seltensten Fällen definiert ist, nimmt der PHP-Parser kulanterweise an, dass der Programmierer eigentlich einen String mit dem Namen der Konstante als Inhalt meinte. Existiert allerdings eine derartige Konstante, kann sie einen komplett anderen Wert enthalten und so zu unerwartetem Verhalten führen. Von daher ist man auf der sicheren Seite, wenn man gleich einen String verwendet – also mit Anführungszeichen arbeitet.
 
Ok soweit alles klar;
stellt sich nur die Frage ob ich die Anführungszeichen nur zu machen brauche wenn ich einen string als Outout bekomme oder ob das egal ist.

So wie du das erklärt hast sieht es so aus als wäre das egal. (Stichwort: Konstante)

Fazit: Immer mit Anführungszeichen, damit fährt man am sichersten.
 
XEMO hat gesagt.:
Ok soweit alles klar;
stellt sich nur die Frage ob ich die Anführungszeichen nur zu machen brauche wenn ich einen string als Outout bekomme oder ob das egal ist.
Ein assoziatives Array ist eigentlich ein Hash. Das heißt, es ordnet jedem Datensatz einen String zu, über den er angesprochen werden kann. Deshalb benötigst du beim Zugriff auf einen bestimmten Datensatz den zugehörigen String. Wobei es egal ist, ob es sich beim jeweiligen Datensatz um eine Ganzzahl, ein weiteres Array oder eine Zeichenkette handelt. Also: beim Zugreifen auf assoziative Arrays immer Strings verwenden.
 
Matthias Reitinger hat gesagt.:
Ein assoziatives Array ist eigentlich ein Hash. Das heißt, es ordnet jedem Datensatz einen String zu, über den er angesprochen werden kann. Deshalb benötigst du beim Zugriff auf einen bestimmten Datensatz den zugehörigen String. Wobei es egal ist, ob es sich beim jeweiligen Datensatz um eine Ganzzahl, ein weiteres Array oder eine Zeichenkette handelt. Also: beim Zugreifen auf assoziative Arrays immer Strings verwenden.
Nach dem Post bin ich mal neugierig geworden.
Daher habe ich etwas probiert und es folgt eine pingelige Beschreibung:

Eine Hash-Liste, wie z.B. in Java, ist das Array es in PHP nicht. Das nur Strings als Indizes verwendet werden können stimmt auch nicht.

Folgende Typen können als Index verwendet werden:
  • Ganzzahlen
  • Fließkommazahlen EDIT: werden zu Ganzzahlen gecastet
  • Strings
Folgende Typen können nicht als Index verwendet werden:
  • Arrays
  • Objekte
Getestet habe ich unter PHP5 mit diesem Code (Fehlermeldungen und Ausgabe stehen in der jeweiligen Zeile als Kommentar):
PHP:
<?
class foo {
    var $bar=null;
    function foo($b) {
        $bar=$b;
    }
}

$s0="testString0";
$s1="testString1";
$s2="testString2";
$s3="testString3";
$s4="testString4";
$a=array();
$b=array(1,2,3,6);
$c=array(1,2,3,6);
$d=array(1,2,3);

$f=new foo($b);
$g=new foo(array(1,2,3,6));
$h=new foo(40);

$a[$b]=$s0; //Illegal offset type
$a[1]=$s1;
$a['test']=$s2;
$a[$f]=$s3; //Illegal offset type
$a[13.54623]=$s4;

echo $a[$b]."<br>\n"; //Illegal offset type
echo $a[$c]."<br>\n"; //Illegal offset type
echo $a[$d]."<br>\n"; //Illegal offset type
echo $a[1]."<br>\n"; //testString1
echo $a['test']."<br>\n"; //testString2
echo $a[$f]."<br>\n"; //Illegal offset type
echo $a[$g]."<br>\n"; //Illegal offset type
echo $a[$h]."<br>\n"; //Illegal offset type
echo $a[13.54623]."<br>\n"; //testString4
?>
Gruß hpvw

PS: @Matthias: Die Erklärung in Deinem ersten Post ist echt Klasse gelungen. Wenn Du gestattest, werde ich sie demnächst bei ähnlichen Problemen zitieren.
 
Zuletzt bearbeitet:
hpvw hat gesagt.:
Nach dem Post bin ich mal neugierig geworden.
Daher habe ich etwas probiert und es folgt eine pingelige Beschreibung:

Eine Hash-Liste, wie z.B. in Java, ist das Array es in PHP nicht. Das nur Strings als Indizes verwendet werden können stimmt auch nicht.
Ich habe mich hier nur auf assoziative Arrays bezogen (genau lesen ;)).

Folgende Typen können als Index verwendet werden:
  • Ganzzahlen
  • Fließkommazahlen
  • Strings
Nein, es sind nur Ganzzahlen und Strings möglich! Fließkommazahlen werden vor der Verwendung als Index in eine Ganzzahl gecastet. $a[4.6] = 0; ist also identisch mit $a[4] = 0;.

PS: @Matthias: Die Erklärung in Deinem ersten Post ist echt Klasse gelungen. Wenn Du gestattest, werde ich sie demnächst bei ähnlichen Problemen zitieren.
Gerne :)
 
Die Pingeligkeit nimmt ihren Lauf :D
Matthias Reitinger hat gesagt.:
Ich habe mich hier nur auf assoziative Arrays bezogen (genau lesen ;)).

Nein, es sind nur Ganzzahlen und Strings möglich! Fließkommazahlen werden vor der Verwendung als Index in eine Ganzzahl gecastet. $a[4.6] = 0; ist also identisch mit $a[4] = 0;.
Ich bin mir nicht sicher, ob Ganzzahlen nicht sogar (bei Fließkomma nach dem Cast) zu Strings gecastet werden oder ob unten stehender Code dadurch erklärt wird, dass bei der Abfrage entsprechend gecastet wird.

[tab]An sich ist dieses Autocasting ja ein nettes Feature, aber hier verwirrt es sogar ein wenig. Eine Variable ist in PHP eine Variable und bleibt eine Variable. Eine Variable ist kein Integer, kein Float und kein String. ([phpf]is_int[/phpf], [phpf]is_float[/phpf], [phpf]is_string[/phpf]) Oder doch? Manchmal freue ich mich über Java. Da weiß ich wenigstens, woran ich bin.[/tab]
Auch ein normal nummeriertes Array lässt sich mit String-Indizes ansprechen. Ist es intern vielleicht auch durch Strings indiziert und damit ein assoziatives Array? Ohne einen Link zum Manual, indem die Interna von PHP erklärt werden, wüßte ich nicht, wie ich die letzte Aussage bestätigen oder wiederlegen könnte.

PHP:
<?
class foo {
    var $bar=null;
    function foo($b) {
        $bar=$b;
    }
}

$s0="testString0";
$s1="testString1";
$s2="testString2";
$s3="testString3";
$s4="testString4";
$s5="testString5";
$s6="testString6";
$a=array();
$b=array(1,2,3,6);
$c=array(1,2,3,6);
$d=array(1,2,3);

$f=new foo($b);
$g=new foo(array(1,2,3,6));
$h=new foo(40);

$a[$b]=$s0; //Illegal offset type
$a[1]=$s1;
$a['test']=$s2;
$a[$f]=$s3; //Illegal offset type
$a[13.54623]=$s4;
$a[2]=$s5;
$a["2"]=$s5;

echo $a[$b]."<br>\n"; //Illegal offset type
echo $a[$c]."<br>\n"; //Illegal offset type
echo $a[$d]."<br>\n"; //Illegal offset type
echo $a[1]."<br>\n"; //testString1
echo $a['test']."<br>\n"; //testString2
echo $a[$f]."<br>\n"; //Illegal offset type
echo $a[$g]."<br>\n"; //Illegal offset type
echo $a[$h]."<br>\n"; //Illegal offset type
echo $a[13.54623]."<br>\n"; //testString4
echo $a[13]."<br>\n"; //testString4
echo $a["1"]."<br>\n"; //testString1
echo $a[2]."<br>\n"; //testString5
echo $a["2"]."<br>\n"; //testString5
echo $a["13"]."<br>\n"; //testString4
echo $b["2"]."<br>\n"; //3
?>
Gruß hpvw

EDIT: Ganzzahlen bleiben Ganzzahlen. Als String angegebene Ganzzahlen stehen als Ganzzahl im Index. Ansonsten behalten Strings ihren Typ. Auch als String angegebene Fließkommazahlen bleiben Strings. Fließkommazahlen werden, wie bereits von Matthias erwähnt, zu Ganzzahlen.
Der Code:
PHP:
<?
$s0="testString0";
$s1="testString1";
$s2="testString2";
$s3="testString3";
$s4="testString4";
$s5="testString5";

$a=array();
$a[1]=$s1;
$a['test']=$s2;
$a[13.54623]=$s3;
$a["6.45"]=$s4;
$a["2"]=$s5;

foreach ($a as $key => $value) {
    echo $key." ";
    if (is_int($key)) {
        echo "(int)";
    } else if (is_float($key)) {
        echo "(float)";
    } else if (is_string($key)) {
        echo "(string)";
    } else if (is_object($key)) {
        echo "(object)";
    } else if (is_array($key)) {
        echo "(array)";
    }
    echo " =&gt; ";
    echo $value;
    echo "<br>\n";
}
/* Ausgabe:
1 (int) =&gt; testString1<br>
test (string) =&gt; testString2<br>
13 (int) =&gt; testString3<br>
6.45 (string) =&gt; testString4<br>
2 (int) =&gt; testString5<br>
*/
?>

EDIT: Nachträglicher Edit zu dem auf diesen Post folgenden Post von Matthias
Matthias Reitinger hat gesagt.:
edit: Nachträglich editieren gilt nicht, hpvw :p ;)
Gilt nicht, aber funktioniert :-(
Matthias Reitinger hat gesagt.:
Doch, intern hat jede Variable zu jeder Zeit einen bestimmten Datentyp.
... der in den meisten Fällen jedoch irrelevant ist (außer [phpf]strpos[/phpf] und Vergleichbarem <= im doppelten Sinn) *duck und weg*

Danke für Deine Mühe
 
Zuletzt bearbeitet:
hpvw hat gesagt.:
Ich bin mir nicht sicher, ob Ganzzahlen nicht sogar (bei Fließkomma nach dem Cast) zu Strings gecastet werden oder ob unten stehender Code dadurch erklärt wird, dass bei der Abfrage entsprechend gecastet wird.
Nein, in die andere Richtung ;)
http://de.php.net/manual/de/language.types.array.php hat gesagt.:
Ein Schlüssel kann entweder ein integer oder ein string sein. Wenn ein Schlüssel die Standard-Darstellung einer integer Zahl ist, wird es als solche interpretiert werden, (z.B. "8" wird als 8 interpretiert, während "08" als "08" interpretiert werden wird).

[tab]An sich ist dieses Autocasting ja ein nettes Feature, aber hier verwirrt es sogar ein wenig. Eine Variable ist in PHP eine Variable und bleibt eine Variable. Eine Variable ist kein Integer, kein Float und kein String. ([phpf]is_int[/phpf], [phpf]is_float[/phpf], [phpf]is_string[/phpf]) Oder doch? Manchmal freue ich mich über Java. Da weiß ich wenigstens, woran ich bin.[/tab]
Doch, intern hat jede Variable zu jeder Zeit einen bestimmten Datentyp. Ausgeben kannst du ihn mittels [phpf]var_dump[/phpf]:
PHP:
<?php

$var = 5;
var_dump($var);        // int(5)
$var = substr($var,0);
var_dump($var);        // string(1) "5"
$var = $var / 1.0;
var_dump($var);        // float(5)

?>

Auch ein normal nummeriertes Array lässt sich mit String-Indizes ansprechen. Ist es intern vielleicht auch durch Strings indiziert und damit ein assoziatives Array? Ohne einen Link zum Manual, indem die Interna von PHP erklärt werden, wüßte ich nicht, wie ich die letzte Aussage bestätigen oder wiederlegen könnte.
Siehe oben :)

edit: Nachträglich editieren gilt nicht, hpvw :p ;)
 
Zurück