Helmi: Zahlen unter Hochkomma oder nicht?

Hallo Leute!

Ich kapier jetzt langsam gar nix mehr. Wann muss man bei PHP Zahlen unter Hochkomma setzen und wann nicht?
Ich komme von Javascript und habs schon dort nicht kapiert. Da gabs ja wieder eine Regelung, dass man bestimmte Zahlen unter Hochkomma setzen muss, damit sie erkannt werden.

Bittebittebitte klärt mich da mal ganz genau auf!

Ich danke euch!

  1. Moin!

    Ich kapier jetzt langsam gar nix mehr. Wann muss man bei PHP Zahlen unter Hochkomma setzen und wann nicht?
    Ich komme von Javascript und habs schon dort nicht kapiert. Da gabs ja wieder eine Regelung, dass man bestimmte Zahlen unter Hochkomma setzen muss, damit sie erkannt werden.

    Javascript und PHP sind in dieser Sache nicht vergleichbar.

    In Javascript haben die Variableninhalte einen Typ, der sich nicht automatisch wechselt. Und es gibt z.B. identische Operatoren zum Addieren von Zahlen und Aneinanderhängen von Strings.

    jsvariable = "1"; -> Erzeugt einen String.

    alert (jsvariable+jsvariable); hängt den String "1" zweimal aneinander: "11".

    jsvariable = 1; -> Erzeugt eine Zahl.

    alert (jsvariable+jsvariable) berechnet 1+1 und zeigt das an: "2".

    Bei PHP werden Variablen je nach Kontext mal als String und mal als Zahl betrachtet. Damit obiges Beispiel eindeutig entschieden werden kann, gibts zum _rechnen_ das Pluszeichen und zum Verbinden von Strings den Operator "Punkt".

    $phpvariable = "1"; -> Erzeugt die Variable.

    echo $phpvariable + $phpvariable; Gibt 1+1 aus, also 2.
    echo $phpvariable . $phpvariable; Hängt die zwei Strings aneinander: "11".

    Interessant wird es immer dann, wenn im String nicht nur eine Zahl drinsteht, sondern auch Text, aber damit gerechnet werden soll.

    Du kannst testen, ob eine Variable (egal ob String oder Zahl) (von Formularen kommen nur Strings!) eine Zahl ist: http://www.php.net/manual/de/function.is-numeric.php

    - Sven Rautenberg

    1. Heißt das also in PHP ist es durchaus egal ob ich eine Abfrage so

      if ($x<"2")

      oder so

      if ($x<2)

      schreibe. Das ist für PHP dasselbe und es besteht keine Gefahr, dass irgendwas verwechselt wird?

      1. Heißt das also in PHP ist es durchaus egal ob ich eine Abfrage so

        if ($x<"2")

        oder so

        if ($x<2)

        schreibe. Das ist für PHP dasselbe und es besteht keine Gefahr, dass irgendwas verwechselt wird?

        Diese Abfragen sind IMO _nicht_ gleich. Denn einmal vergleichst du $x mit einem String (die Anführungszeichen machen den String aus!), und das andere Mal mit einer Zahl.

        Als Faustregel: Wenn du eine Zahl erwartest, vergleiche mit einer Zahl. Wenn du einen String erwartest, vergleiche mit einem String.

        Sollte nämlich in $x etwas stehen, was keine Zahl ist, wie z.B. "B23", dann wäre die erste Bedingung nicht erfüllt, die zweite aber schon (die Zahl, die verglichen wird, ist Null.

        - Sven Rautenberg

        1. Achso. Es ist nämlich so, dass mysql_num_rows() ja eigentlich eine Zahl zurückgeben müsste, nicht? Wenn ich jetzt aber folgende Abfrage mache bekomme ich immer das falsche:

          $x=mysql_num_rows($y);
          if ($x==0) print "Nichts gefunden"
          else print $x." Einträge gefunden";

          Das bleibt auch dasselbe wenn ich statt 0 1 nehme oder 2, 3, 4 etc.

          Es funktioniert erst, wenn ich die Zahl unter Hochkomma setze.

          Also irgendwas stimmt da nicht...

          1. Moin!

            Achso. Es ist nämlich so, dass mysql_num_rows() ja eigentlich eine Zahl zurückgeben müsste, nicht? Wenn ich jetzt aber folgende Abfrage mache bekomme ich immer das falsche:

            So langsam kommen wir zum eigentlichen Kern der Sache, aha!

            Die Frage ist: Was ist "das falsche"? Kann ich doch nur wissen, wenn du mir auch sagst, was "das richtige" ist.

            Ansonsten: Füge einmal testweise einen Befehl ein:

            $x=mysql_num_rows($y);

            var_dump($x); # Variable inkl. Typ ausgeben

            if ($x==0) print "Nichts gefunden"
            else print $x." Einträge gefunden";

            Mir scheint nämlich, daß du ein SQL-Problem hast, bzw. eines mit mysql_num_rows, und keines mit dem Vergleich.

            Ich hab mal getestet: Weise ich $x eine 1 (als Zahl oder "1") zu, wird immer der else-Teil ausgeführt. Weise ich 0, "0" oder "" zu, wird immer der if-Teil ausgeführt. Daran kann es eigentlich nicht liegen.

            Wenn du weißt, was var_dump ausgibt, sieht das Problem gleich viel besser aus.

            - Sven Rautenberg

    2. Hallo Sven

      In Javascript haben die Variableninhalte einen Typ, der sich nicht automatisch wechselt.

      nö, die wechseln schon, solange es sich aus dem Kontext erschließt.

      Und es gibt z.B. identische Operatoren zum Addieren von Zahlen und Aneinanderhängen von Strings.

      jsvariable = "1"; -> Erzeugt einen String.

      alert (jsvariable+jsvariable); hängt den String "1" zweimal aneinander: "11".

      hier "kuckt" JavaScript nach --> String also Verkettung

      alert (jsvariable*1 + jsvariable*1);

      die Multiplikation machte aus deiner jsvariable eine Zahl und schon wird brav addiert und 2 ausgegeben.

      jsvariable = 1; -> Erzeugt eine Zahl.

      alert (jsvariable+jsvariable) berechnet 1+1 und zeigt das an: "2".

      Grundsätzlich gilt in JS, will man auf eine Zahl Stringmethoden oder den Zeichenkettenverknüpfungsoperator anwenden, so muss diese in einen String konvertiert werden.

      Umgekehrt gilt dies auch für Zahlen.

      Damit man sich den Ärger mit Hochkommas erspart, wird einfach an allen Stellen, wo es ein String sein muss, die Methode String() verwendet und wo es eine Zahl sein muss, eben Number()

      Beispiel: alert(Number(jsvariable)+Number(jsvariable)) == 2
                alert(String(jsvariable)+String(jsvariable)) == 11

      und schon ist man auf der sicheren Seite

      Viele Grüße

      Antje