Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] print_r ($abc) (https://www.delphipraxis.net/145869-%5Bphp%5D-print_r-%24abc.html)

MrSpock 9. Jan 2010 21:27


[PHP] print_r ($abc)
 
Hallo,

print_r sollte doch bei der Ausgabe eines Arrays jedes Element in einer eigenen Zeile anzeigen.
Woran kann es liegen, wenn alle Elemente nebeneinander angezeigt werden?

Daniel 9. Jan 2010 21:29

Re: [PHP] print_r ($abc)
 
Ich fürchte, das liegt an der Art und Weise, wie die Browser den HTML-Code interpretieren. Ich nutze meist
echo "<pre>", print_r($abc), "</pre>";

himitsu 9. Jan 2010 21:31

Re: [PHP] print_r ($abc)
 
Zitat:

Zitat von MrSpock
Woran kann es liegen, wenn alle Elemente nebeneinander angezeigt werden?

Nebeneinander in der HTML-Ausgabe des Browsers oder im Seitenquelltext?

Die webbrowser sehen Zeilenumbrüche (Linebreak) normal nur als Leerzeichen an (
= Zeilenumbruch )

[edit] keine Redbox :shock:

MrSpock 9. Jan 2010 21:36

Re: [PHP] print_r ($abc)
 
Hallo,

also mit der Methode von Daniel funktioniert es. Aber wieso? Warum überschreibt der Browser (übrigens FF genauso wie Safari) die Formatierung von print_r?

@himitsu: In der Ausgabe im Browser.

himitsu 9. Jan 2010 21:40

Re: [PHP] print_r ($abc)
 
Zitat:

Zitat von MrSpock
Warum überschreibt der Browser (übrigens FF genauso wie Safari) die Formatierung von print_r?

Zitat:

Zitat von himitsu
Die Webbrowser sehen Zeilenumbrüche (Linebreak) normal nur als Leerzeichen an (
= Zeilenumbruch )

Weil halt die Formatierungen (Leer-/Trenn-/Formatierungszeichen) im Quelltext laut HTML irrelevant sind
(mehrere Leerzeichen werden auch nur als Eines angezeigt) und mit den Formatierungen in der Ausgabe nichts zu tun haben.

Matze 9. Jan 2010 21:40

Re: [PHP] print_r ($abc)
 
Ein Browser ignoriert eben Leerzeichen, Return etc. und interpretiert nur den HTML-Code. Das ist aber auch gut so. Sonst würde bsp. ordentlich eingerückter HTML-Code im Browser auch entsprechend eingerückt dargestellt werden und das Design komplett durcheinander werfen.
Mir den <pre>-Tags werden auch diese Zeichen berücksichtigt und ausgegeben. Das ist schon korrekt.

MrSpock 9. Jan 2010 21:47

Re: [PHP] print_r ($abc)
 
Hallo,

danke für die Erklärung. Ich habe vor 2 oder 3 Jahren, als ich mich das erstemal mit PHP beschäftigt habe mit dem "PHP 4 Das Praxisbuch" gearbeitet. Dort wurde ein array auch immer mit print_r oder var_dump ausgegeben. In den Beispielen wird das HTML Tag <pre> aber nicht benutzt. In der Ausgabe, die im Buch abgedruckt ist, stehen die Elemente aber trotzdem untereinander und ich bin mir ziemlich sicher, dass mir die Ausgabe wie im Buch gezeigt dargestellt wurde. (Sonst hätte ich schon damals gefragt. :gruebel: )

BUG 9. Jan 2010 21:58

Re: [PHP] print_r ($abc)
 
Dann hat hast du damals evtl. kein HTML ausgegeben und der Browser hat die Ausgabe als reinen Text interpretiert.
Dann sieht man auch die Zeilenumbrüche.


MfG,
Bug

Valle 9. Jan 2010 22:11

Re: [PHP] print_r ($abc)
 
Siehe auch die Funktion nl2br, die genau für solche Probleme gedacht ist. :-)
Leider kann man sie auf die Funktion nicht anwenden, da print_r die Ausgabe nicht zurückgibt, sondern direkt ausgibt. :?

Edit:// print_r unterstützt seit PHP 4.3.0 auch einen zweiten Paramter, der obiges doch ermöglicht:

Code:
echo nl2br(print_r($var, True));
Liebe Grüße,
Valle

MrSpock 9. Jan 2010 22:14

Re: [PHP] print_r ($abc)
 
Hallo Bug,

das könnte prinzipiell schon sein, aber wie kann ich nicht HTML Code ausgeben? Ich meine der Code sieht ja so aus:

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        // put your code here
            function ShowHalloWelt() {
           
            $abc=array(1=>"Hallo", "Welt"=>"Welt",3);
            print '<pre>';
            print_r($abc);
            print_r($b);
            print '
';
         
            print '</pre>';
            }
            ShowHalloWelt();
         ?>
    </body>
</html>

Matze 9. Jan 2010 22:15

Re: [PHP] print_r ($abc)
 
Vielleicht so:

Code:
<?php
    print_r(array('hallo', 'Mr', 'Spock'));
?>
Oder eben mit entsprechendem Header. Aber ich denke, das obige interpretiert der Browser als reinen Text.

Edit: Also ohne weiteren HTML-Code, Doctype etc.
Edit 2: Ne, wird dennoch als HTML interpretiert.

Valle 9. Jan 2010 22:17

Re: [PHP] print_r ($abc)
 
Zitat:

Zitat von MrSpock
aber wie kann ich nicht HTML Code ausgeben?

Meinst du, wie du dem Browser sagst, dass es sich bei deinem Dokument nicht um HTML sodern um reinen Text handelt?
Das würde folgendermaßen gehen:

Code:
header('Content-Type: text/plain');
Wichtig ist, wie auf der Dokumentationsseite zur header-Funktion steht, dass du diese Funktion aufrufst, bevor du irgendwas mit echo oder dergleichen ausgegeben hast. Denke bitte außerdem dran, dass dein ganzer HTML-Cde in deine Dokument sinnlos ist, wenn du das so machst. ;-)

Liebe Grüße,
Valle

SirThornberry 9. Jan 2010 22:18

Re: [PHP] print_r ($abc)
 
du fragst wie du nicht HTML-Code ausgeben kannst, zeigst aber zugleich das du HTML-Tags per PHP an den Browser sendest.
durch
Zitat:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
sagst du dem Browser das es html-code ist und daher interpretiert er es auch so und zeigt entsprechend alles entsprechend an.

Matze 9. Jan 2010 22:19

Re: [PHP] print_r ($abc)
 
@Valle: Das meint Albert wohl nicht. Er hat früher a nach einem PHP-Grundlagenbuch gearbeitet und da wurde der Code als Text interpretiert. Da wird man wohl kaum den Header manuell gesetzt haben.

Valle 9. Jan 2010 22:20

Re: [PHP] print_r ($abc)
 
Zitat:

Zitat von SirThornberry
durch
[...]
sagst du dem Browser das es html-code ist und daher interpretiert er es auch so und zeigt entsprechend alles entsprechend an.

Das ist falsch. PHP sendet automatisch einen HTTP-Header "Content-Type" mit dem Inhalt "text/html" an den Browser. Daran erkennt der Browser, dass es sich um HTML handelt. Am Doctype erkennt er nur, was für'n HTML du da sendest. ;-)

Zitat:

Zitat von Matze
@Valle: Das meint Albert wohl nicht. Er hat früher a nach einem PHP-Grundlagenbuch gearbeitet und da wurde der Code als Text interpretiert. Da wird man wohl kaum den Header manuell gesetzt haben.

Ja, das hat er ja oben geschrieben. Was anderes fällt mir aber nicht ein. Man kann das ganze Dokument mit dem Header-Befehl als Text kennzeichnen oder mit <pre> nur einzelne Passagen. Was das sonst gewesen sein könnte weiß ich nicht.

Liebe Grüße,
Valle

alcaeus 10. Jan 2010 12:23

Re: [PHP] print_r ($abc)
 
Zitat:

Zitat von Valle
Das ist falsch. PHP sendet automatisch einen HTTP-Header "Content-Type" mit dem Inhalt "text/html" an den Browser. Daran erkennt der Browser, dass es sich um HTML handelt. Am Doctype erkennt er nur, was für'n HTML du da sendest. ;-)

Beides ist falsch ;)

Rein theoretisch gibt der Content-Type an, welchen Content (ob Bild, Text, Word-Dokument, etc.) der Browser da geliefert bekommt. Da dies aber nicht immer korrekt gemacht wird (z.B. senden viele Download-Scripte keinen Mime-Type voraus) raten die Browser da gerne mal.

Kleiner Test: rufe ein PHP-Script mit folgendem Code in Firefox und Internet Explorer auf:
Code:
<?php

header('text/plain');

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title>Test</title>
</head>
<body>
[b]Test[/b]
</body>
</html>
Was ist das erwartete Verhalten? Der Browser zeigt den HTML-Code direkt an. Wenn ich es richtig in Erinnerung hab (hab grad keine Zeit zu testen) zeigt der IE in dem Fall nicht den HTML-Code an sondern interpretiert das HTML, weil er sieht, dass da HTML geliefert wurde - und das obwohl text/plain als Content-Type geschickt wurde. Das entsprechende Stichwort heisst "Content-Type Sniffing".

@Albert: in Tutorials und Buechern vergisst man oft so Kleinigkeiten, die man automatisch macht - wie z.B. die von Daniel erwaehnte Verwendung von <pre>.

@Daniel: dein Code ist eigentlich nicht ganz korrekt. print_r() mit einem Parameter gibt void zurueck - also nada. Nur wenn du als zweiten Parameter true uebergibst, gibt die Funktion die Ausgabe nicht direkt aufm Output-Buffer aus sondern gibt ihn zurueck:
Code:
echo '<pre>', print_r($abc, true), '</pre>';
Greetz
alcaeus

Valle 10. Jan 2010 12:28

Re: [PHP] print_r ($abc)
 
Zitat:

Zitat von alcaeus
Beides ist falsch ;) [...]

Ja stimmt, jetzt wo du das sagst erinnere ich mich auch wieder. Das ist vorallem bei Bildern der Fall, da diese oft mit falschen Mimetype vom Server gekennzeichnet werden. Rein theoretisch gesehen ist allerdings der Content-Type dafür zuständig. Im Firefox funktioniert das ja auch. :mrgreen:

Liebe Grüße,
Valle


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz