Henry: Syntaxfehler im PHP-Code finden

Hallo,

ich habe ein kleines PHP Programm gebaut. Im Array scheint wohl ein Syntaxfehler drin zu sein, hab aber leider keine Ahnung was genau falsch ist. Könnt ihr kurz drüber schauen?

<?php 
	$transactionId = "12345";
	$transctionTotal = "46,30 Euro";
	
	$items[0][product_ean]   = "1";
	$items[0][product_name]  = "Produkt 1";
	$items[0][category]  = "Kategorie 1";
	$items[0][product_item_price]  = "10,00 Euro";
	$items[0][product_quantity]  = "1";
	
	$items[1][product_ean]   = "2";
	$items[1][product_name]  = "Produkt 2";
	$items[1][category]  = "Kategorie 2";
	$items[1][product_item_price]  = "20,00 Euro";
	$items[1][product_quantity]  = "2";
	
	$items[2][product_ean]   = "3";
	$items[2][product_name]  = "Produkt 3";
	$items[2][category]  = "Kategorie 3";
	$items[2][product_item_price]  = "30,00 Euro";
	$items[2][product_quantity]  = "3";
?>

<script>
dataLayer = [{
    'transactionId': '1',
    'transactionTotal': '2',
  
    'transactionProducts': [                        
		<?php foreach($items as $item){?>
			{
			    'sku': '<?php print $item->product_ean?>',
			    'name': '<?php print $item->product_name?>',
			    'category': '<?php print $item->category?>',
			    'price': '<?php print $item->product_item_price?>',
			    'quantity': '<?php print $item->product_quantity?>'
			}
		<?php } ?>
    ]
}];
</script>
  1. Hallo und guten Morgen,

    ich habe ein kleines PHP Programm gebaut. Im Array scheint wohl ein Syntaxfehler drin zu sein, hab aber leider keine Ahnung was genau falsch ist. Könnt ihr kurz drüber schauen?

    $items[0][product_ean] = "1"; $items[0][product_name] = "Produkt 1"; $items[0][category] = "Kategorie 1"; $items[0][product_item_price] = "10,00 Euro"; $items[0][product_quantity] = "1";

    $items[1][product_ean] = "2"; $items[1][product_name] = "Produkt 2"; $items[1][category] = "Kategorie 2"; $items[1][product_item_price] = "20,00 Euro"; $items[1][product_quantity] = "2";

    $items[2][product_ean] = "3"; $items[2][product_name] = "Produkt 3"; $items[2][category] = "Kategorie 3"; $items[2][product_item_price] = "30,00 Euro"; $items[2][product_quantity] = "3";

    wenn es sich bei den Elementbezeichnern im Array nicht um Konstanten handelt, ist die Schreibweise schon mal nicht richtig. Die Bezeichner sind Strings und müssen auch entsprechend ausgezeichnet werden.

    	$items[2]['product_item_price']  = 30.00;
    	$items[2]['product_item_curr']  = 1;        ##  1 == Euro, 2 == engl. Pfund, ...
    	$items[2]['product_quantity']  = 3.0;
    

    Außerdem sollte man Rechengrößen auch als Zahlentypen einrichten und die Währung als separates Feld (Währungs-Index) abkoppeln.

    Grüße
    TS

    --
    es wachse der Freifunk
    https://harz.freifunk.net
    1. Außerdem sollte man Rechengrößen auch als Zahlentypen einrichten und die Währung als separates Feld (Währungs-Index) abkoppeln.

      Was genau meinst du hiermit, hast du eine kleines Beispiel beschäftige ich mich erst seit ein paar Tagen mit PHP.

  2. Moin!

    Warum nicht einfach:

    <?php
    $items['transactionId'] = "12345";
    $items['transctionTotal'] = "46,30 Euro";
    
    $items[0][product_ean]   = "1";
    $items[0][product_name]  = "Produkt 1";
    $items[0][category]  = "Kategorie 1";
    $items[0][product_item_price]  = "10,00 Euro";
    $items[0][product_quantity]  = "1";
    #...
    ?>
    <script>
    dataLayer = [<?php echo json_encode($items); ?>]
    </script>
    

    ???

    Bei mir kommt da

    <script>
    dataLayer = [{"transactionId":"12345","$transctionTotal":"46,30 Euro","0":{"product_ean":"1","product_name":"Produkt 1","category":"Kategorie 1","product_item_price":"10,00 Euro","product_quantity":"1"},"1":{"product_ean":"2","product_name":"Produkt 2","category":"Kategorie 2","product_item_price":"20,00 Euro","product_quantity":"2"},"2":{"product_ean":"3","product_name":"Produkt 3","category":"Kategorie 3","product_item_price":"30,00 Euro","product_quantity":"3"}}]
    </script>
    

    (als Einzeiler) raus.

    Jörg Reinholz

    1. @@Jörg Reinholz

      dataLayer = [<?php echo json_encode($items); ?>]
      

      Wozu die eckigen Klammern?

      LLAP 🖖

      --
      Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
      1. Moin!

        Wozu die eckigen Klammern?

        Die hatte ich aus dem Original übernommen. Wozu auch immer das gut sein soll.

        alert (dataLayer[0][0]['product_ean']);
        alert (dataLayer[0]['transctionTotal']);
        

        Gibt erwartungsgemäß eine 1 und dann "46,30 EUR" aus. Wozu auch immer das gut sein soll. Vielleicht braucht der Henry es ja so?

        Jörg Reinholz

        1. Wozu die eckigen Klammern?

          Die hatte ich aus dem Original übernommen. Wozu auch immer das gut sein soll.

          alert (dataLayer[0][0]['product_ean']);
          alert (dataLayer[0]['transctionTotal']);
          

          Gibt erwartungsgemäß eine 1 und dann "46,30 EUR" aus. Wozu auch immer das gut sein soll. Vielleicht braucht der Henry es ja so?

          Ich möchte das E-Commerce-Tracking eines Online-Shop umsetzen indem ich mit dem Google Tag Manager arbeite. Dazu muss ein sogenanter Data-Layer auf der Bestellbestätigungsseite des Online-Shops eingebunden werden. Laut Google werden für diesen DataLayer die eckigen Klammern benötigt. Siehe hierzu folgender Link (unten auf der verlinkten Seite findet Ihr das Codebeispiel):

          https://support.google.com/tagmanager/answer/6106097?hl=de

    2. Moin!

      Warum nicht einfach:

      <?php
      $items['transactionId'] = "12345";
      $items['transctionTotal'] = "46,30 Euro";
      
      $items[0][product_ean]   = "1";
      $items[0][product_name]  = "Produkt 1";
      $items[0][category]  = "Kategorie 1";
      $items[0][product_item_price]  = "10,00 Euro";
      $items[0][product_quantity]  = "1";
      #...
      ?>
      <script>
      dataLayer = [<?php echo json_encode($items); ?>]
      </script>
      

      ???

      Wo genau ist denn der Vorteil von diesem "json_encode"?

      1. Tach!

        Wo genau ist denn der Vorteil von diesem "json_encode"?

        Ich hab dir das ja nicht ohne Grund schon vor langer Zeit empfohlen. Die eigentliche Frage muss lauten: Was ist denn (der Vorteil von) JSON?

        JSON ist ein Format zum Notieren von Daten, die speziell im Javascript-Umfeld verwendet werden sollen. Der Vorteil ist, dass die Syntax im Wesentlichen der Javascript-Syntax zur Objektnotation entspricht. Man kann damit also aus Datenstrukturen quasi Javscript-Code erzeugen. JSON ist mittlerweile sehr weit verbreitet, in jeder relevanten Sprache finden sich entsprechende Bibliotheken zum Lesen und Erstellen von JSON auch außerhalb von Javascript. Im Allgemeinen machen aus die auch aus komplexen Datenstrukturen JSON. Deswegen war ja meine Empfehung von Anfang an, deine Datenstruktur (und zwar komplett und nicht nur Teile) in PHP zu erstellen und die dann einfach json_encode() zu übergeben (und zwar komplett und nicht nur Teile). Fertig ist der Javascript-Code.

        dedlfix.

        1. JSON ist ein Format zum Notieren von Daten, die speziell im Javascript-Umfeld verwendet werden sollen. Der Vorteil ist, dass die Syntax im Wesentlichen der Javascript-Syntax zur Objektnotation entspricht. Man kann damit also aus Datenstrukturen quasi Javscript-Code erzeugen. JSON ist mittlerweile sehr weit verbreitet, in jeder relevanten Sprache finden sich entsprechende Bibliotheken zum Lesen und Erstellen von JSON auch außerhalb von Javascript. Im Allgemeinen machen aus die auch aus komplexen Datenstrukturen JSON. Deswegen war ja meine Empfehung von Anfang an, deine Datenstruktur (und zwar komplett und nicht nur Teile) in PHP zu erstellen und die dann einfach json_encode() zu übergeben (und zwar komplett und nicht nur Teile). Fertig ist der Javascript-Code.

          Werde ich auch alles berücksichtigen, so langsam bin ich was die Problemlösung angeht über den Berg. Werde bis spätestens Montag den fertigen Code hier im Forum posten.

          Momentan einfach ziemlich viel zu tun. Einarbeiten in Mint, in PHP, Tagesgeschäft... :-)

  3. Hallo Henry,

    fehlt da nicht bei der Ausgabe der Elemente für "transactionProducts" ein "," (Komma) nach der geschweiften Klammer? Deine Version gibt vermutlich folgendes aus: transactionProducts:[{...}{....}{....}] Es müsste doch aber wie folgt aussehen: transactionProducts:[{...},{....},{....}]

    Viele Grüße, the-FoX

    1. fehlt da nicht bei der Ausgabe der Elemente für "transactionProducts" ein "," (Komma) nach der geschweiften Klammer? Deine Version gibt vermutlich folgendes aus: transactionProducts:[{...}{....}{....}] Es müsste doch aber wie folgt aussehen: transactionProducts:[{...},{....},{....}]

      Ja, da hast du recht, ich weiß aufgrund meiner noch mangelnden PHP Erfahrung noch nicht wie ich das lösen soll. Setze ich kein Komma in der Schleife (so wie es jetzt ist) kommt das raus:

      [{...}{....}{....}]

      setzte ich ein Komma kommt das raus

      [{...},{....},{....},]

      Das letzte Komma wäre ja überflüssig und würde vermutlich einen Syntaxfehler ergeben. Was kann ich denn tun, damit das letzte Komma nichtmehr gesetzt wird?

      1. @@Henry

        Das letzte Komma wäre ja überflüssig und würde vermutlich einen Syntaxfehler ergeben. Was kann ich denn tun, damit das letzte Komma nichtmehr gesetzt wird?

        Ist deine Frage damit beantwortet?

        LLAP 🖖

        --
        Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
        1. Ist deine Frage damit beantwortet?

          Wenn diese "json_encode" diese Kommas automatisch richtig setzt, dann ist meine Frage beantwortet, danke.

      2. Hallo Henry,

        das läßt sich realisieren, indem Du bei jedem $item ein Komma am Ende einfügst, ausgenommen beim letzten Eintrag des Arrays $items.

        <script>
        dataLayer = [{
            'transactionId': '1',
            'transactionTotal': '2',
          
            'transactionProducts': [                        
                        <?php foreach($items as $item){?>
                                {
                                    'sku': '<?php print $item->product_ean?>',
                                    'name': '<?php print $item->product_name?>',
                                    'category': '<?php print $item->category?>',
                                    'price': '<?php print $item->product_item_price?>',
                                    'quantity': '<?php print $item->product_quantity?>'
                                }
                        <?php 
                           if ($item !== end($items))
                           {
                             // handelt es sich nicht um den letzten Eintrag, dann ein Komma ausgeben
                             echo ',';
                           }
                         } ?>
            ]
        }];
        </script>
        

        Gruß, the-FoX

        1. prima, danke für die Hilfe :-)

  4. Ich habe die Fehler soweit angepasst. Wenn ich nach dem Ausführen auf Eclipse in den Quellcode schaue zeigt dieser mir folgendes an:

    'sku': '<br /><b>Notice</b>:  Trying to get property of non-object in <b>C:\xampp\htdocs\test\newfile1.php</b> on line <b>32</b><br />',
    
    'name': '<br /><b>Notice</b>:  Trying to get property of non-object in <b>C:\xampp\htdocs\test\newfile1.php</b> on line <b>33</b><br />',
    
    'category': '<br /><b>Notice</b>:  Trying to get property of non-object in <b>C:\xampp\htdocs\test\newfile1.php</b> on line <b>34</b><br />',
    
    'price': '<br /><b>Notice</b>:  Trying to get property of non-object in <b>C:\xampp\htdocs\test\newfile1.php</b> on line <b>35</b><br />',
    
    'quantity': '<br /><b>Notice</b>:  Trying to get property of non-object in <b>C:\xampp\htdocs\test\newfile1.php</b> on line <b>36</b><br />'
    
    

    Sind das PHP Fehler oder Java-Script Fehler?

    1. Tach!

      'quantity': '<br /><b>Notice</b>: Trying to get property of non-object in <b>C:\xampp\htdocs\test\newfile1.php</b> on line <b>36</b><br />'

      Sind das PHP Fehler oder Java-Script Fehler?

      PHP-Fehler. Ein Array ist kein Objekt. Du erstellst ein Array, greifst dann aber auf Eigenschaften eines Objekts zu, das keins ist.

      Javascript schreibt seine Fehler in die Console des Browsers.

      dedlfix.