miki: variable in $_post["variable"_konstante]

hallo leute
ich habe mich im forum etwas umgesehen, aber keine lösung zu meinem problem gefunden. also ...

ich lese eus einer db verschiedene produkte aus, liste alle mitlamt einem textfel in ein formular. in das textfeld kommt die menge der produkte .. und nun kommt's!

die menge übergebe ich in der form $produkt_menge weiter, undf hole sie mit $_post[] ab.
wie kann ich nun möglichst alle produkte und die dazugehörenden mengen in dem nächsten schritt aufrufen??

das ganze sieht so aus:

<?
  include("dbconnect.php");

$abfrage = "SELECT * FROM tb_products";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))
    {
    $name = $row->name;
    $price = $row->price;
    $menge = "$_POST[$name_menge]";
    echo   $menge . " - ";
    echo   $price . " - ";
    echo   $name . "<br>";
    $price_init = $menge * $price;
    echo   $price_init . "<br>";

}

?>

die zeile

$menge = "$_POST[$name_menge]";

funzt nicht.

wäre wirkllich für hilfe dankbar!

danke und gruss an alle
miki

  1. Hallo,

    die zeile
        $menge = "$_POST[$name_menge]";
    funzt nicht.

    ähm, ich finde auch beim besten Willen nicht die Stelle, an der du $name_menge definierst. Letztendlich fragst du also $_POST[undefined] ab. Dass das nicht furzt (meintest du doch, oder?), dürfte einleuchten.

    Gute Nacht schonmal,

    Martin

    --
    Man gewöhnt sich an allem, sogar am Dativ.
    1. echo $begrüßung;

      $menge = "$_POST[$name_menge]";

      Die Anführungszeichen sind an dieser Stelle hyperliquid.[*]

      ähm, ich finde auch beim besten Willen nicht die Stelle, an der du $name_menge definierst. Letztendlich fragst du also $_POST[undefined] ab.

      Nö, bei Javascript ergäbe das "undefined". Bei PHP gibt es zwei Notice-Meldungen (sofern diese nicht mittels error_reporting unterdrückt werden):

      Undefined variable: name_menge in ...
      Undefined index:   in ...

      Man beachte die Leerstelle zwischen "index:" und "in".

      Nicht vorhandene Variablen ergeben NULL, wenn man einen Lesezugriff darauf versucht. Das Ergebnis des Ausdrucks ist somit NULL.

      [*] Die Anführungszeichen haben hier allerdings eine Wirkung. Aus dem NULL wird ein Leerstring. Allerdings dürfte das in einem Wald- und Wiesen-PHP-Anfängerscript keine weiteren Auswirkungen haben, da sowieso die automatische Typumwandlung sich um das NULL kümmert.

      An den OP: Beim PHP-Entwickeln empfiehlt es sich, das error_reporting auf E_ALL zu stellen. Die angezeigten Notice-Meldungen weisen meist schon frühzeitig auf Fehler hin, die sich später unerwartet auswirken.

      echo "$verabschiedung $name";

      1. Hallo dedlfix.

        Beim PHP-Entwickeln empfiehlt es sich, das error_reporting auf E_ALL zu stellen. Die angezeigten Notice-Meldungen weisen meist schon frühzeitig auf Fehler hin, die sich später unerwartet auswirken.

        In dieser Hinsicht wäre doch 2048 besser geeignet als 2047, oder?

        Einen schönen Mittwoch noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        <mathbr:del.icio.us />
        1. echo $begrüßung;

          [error_reporting]

          In dieser Hinsicht wäre doch 2048 besser geeignet als 2047, oder?

          Nein, 2048 ist nur E_STRICT, also ohne E_ALL. Wenn dann solltest du E_ALL | E_STRICT bzw. 4095 nehmen.

          E_STRICT "benötigt" man nur, wenn man PHP5 verwendet und Notice-Meldungen für PHP4-Klassen-Syntax erhalten möchte.

          class foo {
              var $bar;
              ...
            }

          Hier wird mit dann das "var" angmeckert, weil das zugunsten der neuen Visibility-Deklaratoren (oder wie die dinger korrekt heißen mögen) public, protected oder private deprecated ist.

          Ich lasse eine E_STRICT-Empfehlung absichtlich weg, da sie für die meisten keinen wirklichen Mehrwert bringt. Diese Meldungen verweisen momentan nur auf Schönheitsfehler hin und werden erst dann interessant, wenn obige Syntax aus PHP verschwindet (PHP6 oder 7 oder ...).

          echo "$verabschiedung $name";

          1. Hallo dedlfix.

            [error_reporting]

            In dieser Hinsicht wäre doch 2048 besser geeignet als 2047, oder?

            Nein, 2048 ist nur E_STRICT, also ohne E_ALL. Wenn dann solltest du E_ALL | E_STRICT bzw. 4095 nehmen.

            Ah, da hatte ich wohl gedanklich ein „zusätzlich“ bei 2048 hinzugelesen.

            E_STRICT "benötigt" man nur, wenn man PHP5 verwendet und Notice-Meldungen für PHP4-Klassen-Syntax erhalten möchte.

            Ja, das war mir bereits bewusst, jedoch nicht, dass 2048 nicht 2047 mit sich bringt.

            Einen schönen Mittwoch noch.

            Gruß, Ashura

            --
            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            <mathbr:del.icio.us />
            1. Hi Ashura,

              E_STRICT "benötigt" man nur, wenn man PHP5 verwendet und Notice-Meldungen für PHP4-Klassen-Syntax erhalten möchte.

              Ja, das war mir bereits bewusst, jedoch nicht, dass 2048 nicht 2047 mit sich bringt.

              Wenn du dir die einzelnen Bits eines Integer-Wertes als Schalter der zu meldenden Fehlertypen vorstellst, wird es vermutlich schnell klarer:

              E_STRICT
              [latex][2048]10 = [100000000000]_2[/latex]

              E_ALL
              [latex][2047]10 = [011111111111]_2[/latex]

              Man sieht also sofort, dass bei E_ALL so ziemlich alle Schalter gesetzt sind (E_ERROR (1), E_WARNING (2), E_PARSE (4) usw.) und bei E_STRICT halt nur einer.

              Gruß,
              Andreas.

              1. Hallo Andreas.

                Man sieht also sofort, dass bei E_ALL so ziemlich alle Schalter gesetzt sind (E_ERROR (1), E_WARNING (2), E_PARSE (4) usw.) und bei E_STRICT halt nur einer.

                Ja, in dieser Form wird dies deutlich.

                Da 2047 in 2048 (rechnerisch) enthalten ist, kam ich zu dieser Fehleinschätzung.

                Einen schönen Mittwoch noch.

                Gruß, Ashura

                --
                sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                <mathbr:del.icio.us />
                1. echo $begrüßung;

                  Da 2047 in 2048 (rechnerisch) enthalten ist, kam ich zu dieser Fehleinschätzung.

                  Anscheinend war dir die Methode, die Bits als Flag zu benutzen noch nicht geläufig. Kamst du nicht ins Grübeln, wie man wohl aus Dezimalzahlen eindeutig und vor allem ohne großartige Rechnereien[*] ermitteln kann, ob eine bestimmte Zahl zur Bildung der Summe genutzt wurde, ohne die Bits ihrer Binärdarstellung zu beachten?

                  echo "$verabschiedung $name";

                  [*] man könnte alle möglichen[**] Zweierpotenzen abziehen und schauen, ob es kleiner 0 wird oder nicht
                  [**] erstmal die größtmögliche ermitteln, die kleiner oder gleich der Ausgangs-Dezimalzahl ist und dann alle kleineren.

                  1. Hallo dedlfix.

                    Da 2047 in 2048 (rechnerisch) enthalten ist, kam ich zu dieser Fehleinschätzung.

                    Anscheinend war dir die Methode, die Bits als Flag zu benutzen noch nicht geläufig.

                    Richtig.

                    Kamst du nicht ins Grübeln, wie man wohl aus Dezimalzahlen eindeutig und vor allem ohne großartige Rechnereien[*] ermitteln kann, ob eine bestimmte Zahl zur Bildung der Summe genutzt wurde, ohne die Bits ihrer Binärdarstellung zu beachten?

                    Dieser Satz hat mich ins Grübeln gebracht.

                    Ich bin bisher noch nicht sonderlich weit vom Dezimalen Zahlensystem abgekommen. Ich kann zwar (bedingt durch die Arbeit mit CSS) an einer Hex-Zahl erkennen, welcher Farbe sie in etwa entspricht, aber das war es auch schon mit den Ausflügen.

                    Daher verstehe ich auch nicht allzu viel von dem, was du hier geschrieben hast.

                    Einen schönen Mittwoch noch.

                    Gruß, Ashura

                    --
                    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                    <mathbr:del.icio.us />
                    1. echo $begrüßung;

                      Kamst du nicht ins Grübeln, wie man wohl aus Dezimalzahlen eindeutig und vor allem ohne großartige Rechnereien[*] ermitteln kann, ob eine bestimmte Zahl zur Bildung der Summe genutzt wurde, ohne die Bits ihrer Binärdarstellung zu beachten?

                      Dieser Satz hat mich ins Grübeln gebracht.

                      Die Werte der error_reporting-Konstanten sind alle (E_ALL mal ausgenommen) auffallend Ergebnisse von Zweierpotenzen. In Binärdarstellung ergeben sie

                      E_ERROR             1 000000000001
                      E_WARNING           2 000000000010
                      E_PARSE             4 000000000100
                      E_NOTICE            8 000000001000
                      E_CORE_ERROR       16 000000010000
                      E_CORE_WARNING     32 000000100000
                      E_COMPILE_ERROR    64 000001000000
                      E_COMPILE_WARNING 128 000010000000
                      E_USER_ERROR      256 000100000000
                      E_USER_WARNING    512 001000000000
                      E_USER_NOTICE    1024 010000000000
                      (E_ALL           2047 011111111111)
                      E_STRICT         2048 100000000000

                      Wie zu sehen ist, ist immer genau ein Bit gesetzt, die anderen nicht. Fasst man zwei oder mehr Werte durch Addition oder OR-Verknüpfung zusammen bleiben die gesetzten Bits erhalten.

                      E_WARNING           2 000000000010
                      E_CORE_WARNING     32 000000100000
                      E_USER_WARNING    512 001000000000
                                        546 001000100010

                      Man kann also eindeutig aus der 546 erkennen, dass E_WARNING, E_CORE_WARNING und E_USER_WARNING gemeint sind. Hätte man nur das Dezimalsystem zur Verfügung müsste man von der 546 alle definierten Werte, also 512, 256, 128, 64, 32, 16, 8, 4, 2 und 1 (1024 bis 2048 kann man sich sparen) der Reihe nach und vom größten zum kleinsten durchgehen und subtrahieren ... [viele Worte, die ich grad nicht ausformulieren will]. In Kurzform sieht das so aus:

                      • Der nächst kleinere Wert zu 546 ist 512, also E_USER_WARNING gemerkt und gerechnet: 546-512 = 34.
                      • 256, 128, 64 scheiden aus, weil sie größer als 34 sind.
                      • 32 passt, also E_CORE_WARNING gemerkt und gerechnet: 34-32 = 2
                      • 16, 8, 4 scheiden aus
                      • 2 passt, also E_WARNING gemerkt und gerechnet: 2-2 = 0
                      • 1 scheidet auch aus

                      Wie du siehst ist das viel Aufwand.

                      Und nun kannst du dir sicher auch denken, warum der Defaut-Wert von error_reporting in der php.ini-dist als E_ALL & ~E_NOTICE (AND NOT(bzw. Komplement)) dargestellt ist, wie sich die Bits bei dieser Rechnung verhalten und PHP anhand des Ergebnisses weiß, welche Fehler es anzeigen soll.

                      echo "$verabschiedung $name";

                      1. Hallo dedlfix.

                        echo $begrüßung;

                        Kamst du nicht ins Grübeln, wie man wohl aus Dezimalzahlen eindeutig und vor allem ohne großartige Rechnereien[*] ermitteln kann, ob eine bestimmte Zahl zur Bildung der Summe genutzt wurde, ohne die Bits ihrer Binärdarstellung zu beachten?

                        Dieser Satz hat mich ins Grübeln gebracht.

                        […]

                        Wie du siehst ist das viel Aufwand.

                        In der Tat. Ich danke dir sehr für diese narrensichere Erklärung.
                        Jetzt verstehe ich Andreas' und dein Posting. (Ich dachte unbewusst noch immer summierend anstatt in flags.)

                        Und nun kannst du dir sicher auch denken, warum der Defaut-Wert von error_reporting in der php.ini-dist als E_ALL & ~E_NOTICE (AND NOT(bzw. Komplement)) dargestellt ist, wie sich die Bits bei dieser Rechnung verhalten und PHP anhand des Ergebnisses weiß, welche Fehler es anzeigen soll.

                        Jetzt ja.
                        Es ist doch immer wieder schön, ein kleines bisschen mehr über die Werkzeuge zu erfahren, die man tagtäglich nutzt.

                        Einen schönen Mittwoch noch.

                        Gruß, Ashura

                        --
                        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                        <mathbr:del.icio.us />
  2. hi,

    die zeile
        $menge = "$_POST[$name_menge]";
    funzt nicht.

    Wieso sollte sie auch?
    In deinem Code gibt es keine Variable mit dem Namen $name_menge.

    Möchtest du vielleicht an den Inhalt von $name noch den String "_menge" anhängen? Dann tu das auch.

    Ach ja, und gewöhne dir bitte ab, reine Variablen in doppelte Anführungszeichen zu schreiben -
    $menge = "$_POST[...]";
    ist grober Unfug,
    $menge = $_POST[...];
    wäre korrekt.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. moin  moin ...

      Möchtest du vielleicht an den Inhalt von $name noch den String "_menge" anhängen? Dann tu das auch.

      genau das möchte ich!! an $name den string anhänhen ...
      und kann mir jemand dabei helfen?? wahrscheinlich habe ich eingfach einen knoten bei der syntax!!

      1. moin  moin ...

        Möchtest du vielleicht an den Inhalt von $name noch den String "_menge" anhängen? Dann tu das auch.
        genau das möchte ich!! an $name den string anhänhen ...
        und kann mir jemand dabei helfen?? wahrscheinlich habe ich eingfach einen knoten bei der syntax!!

        Hallo,

        $menge = $_POST[$name.'_menge'];

        oder

        $menge = $_POST[sprintf('%s_menge', $name)];

        oder

        $menge = $_POST["{$name}_menge"];

        Schöne Grüße

        --
        DerFichtl