Tino: Php variable in xml

Guten tag,

Ich habe über das wochenende stunden damit verbracht in google zu suchen und etwas schlaues herauszufinden.
Mein problem ist es, wie kriege ich php variablen in ein xml teil herein?

header("Content-type: text/xml; charset=UTF-8");

// send the first part of the XML document  
echo '<?xml version="1.0" encoding="UTF-8" ?>  
<NotificationReply>  
<message>  
<text>$sub $event findet am $date um $time in $wo statt.</text>  
<cost>20</cost>  
</message>  
</NotificationReply>';  

Hier müssten die variablen rein.

Und das hier der vorgängige php code, setze sonst heute noch den kommpleten script sobald ich zugriff darauf habe, für jeden tip bin ich sehr dankbar.

$data = implode('', file('php://input'));  
if (!$data) {  
    fatal("Received no data!");  
}  
echo $event; 
  1. Hi!

    Mein problem ist es, wie kriege ich php variablen in ein xml teil herein?

    PHP-Variablen(namen) oder deren Inhalte? Beides bekommst du haargenau so wie in jegliche andere Ausgabe.

    echo '<?xml version="1.0" encoding="UTF-8" ?>
    <text>$sub $event findet am $date um $time in $wo statt.</text>

    Beachte den Unterschied zwischen ''- und ""-Strings. Schau die auch die Heredoc-Syntax an.

    Eine kontextgerechte Behandlung wäre auch angebracht, sonst erzeugst du dir unter Umständen ungültiges XML.

    Lo!

  2. Hallo,

    auha, wenig Ahnung bisher, oder?

    <irgendwas><?php echo $meineVar?></irgendwas>

    geht in PHP. Damit ist es auf jeden Fall möglich es so zu machen, wie du angedacht hast (nicht xml echoen! nur die php-Vars).

    Besser wäre es vielleicht, PHPs xml-klassen/funktionen zu verwenden.

    Gruß

    jobo

  3. @@Tino:

    nuqneH

    header("Content-type: text/xml; charset=UTF-8");

    Bist du *sicher*? Der Medientyp einer XML-Datei sollte eher application/xml sein.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
  4. So ich bin jetzt ganz am ende mit meinem Latein, leider komme ich nicht mehr weiter, der Script wie er unten steht funktioniert vollständig, das heisst er antwortet mir auf meine SMS nur komme ich vorne und hinten nicht nach wie ich das ganze umschreiben kann damit er mir anstelle des oberen standarttextes meinen Text sendet dehn ich will. Meine Fachliteratur gibt mir keinen Rat und sonst finde ich leider auch nichts, habe es mit variablen versucht jedoch verliert er beim befehl data = implodet alle variablen die ich ihm oben gefüttert habe.

    Vieleicht weiss wer von euch mir einen Rat.

    <?php  
      
    // Copyright (c) 2005 MNC S.A.  
      
    // This simple test program is an HTTP POST receiver that receives a  
    // notification, replies, then send an XML API command as well.  
      
      
    // Ask PHP to keep track of last error in $php_errormsg.  
    ini_set("track_errors", 1);  
      
    // Helper function for fatal errors  
    function fatal($msg) {  
        error_log("Error: $msg");  
        exit;  
    }  
      
    // Get received document. Most portable way seems to use  
    // the php://input stream, as $_POST does key=value parsing  
    // and $HTTP_RAW_POST_DATA can be configured out.  
    $data = implode('', file('php://input'));  
    if (!$data) {  
         fatal("Received no data!");  
    }  
      
    // output the header to indicate the receiver we're sending xml in  
    // UTF-8 IMPORTANT NOTE: this merely is an indication for the  
    // receiver, this will in no way magically send UTF-8! The actual data  
    // send later must be encoded in UTF-8. Several solutions:  
    //  
    // - read a file on disk which is already encoded in UTF-8, and send  
    //   it as-is  
    //  
    // - read a file on disk with another encoding you know, and transcode  
    //   it to UTF-8; you can use iconv, see http://www.php.net/iconv  
    //  
    // - read a file from a database, and make sure that either the database  
    //   will send us data in UTF-8, or transcode its output from the encoding  
    //   it's using, to UTF-8, using for example iconv  
    header("Content-type: text/xml; charset=UTF-8");  
      
    // send the first part of the XML document  
    echo '<?xml version="1.0" encoding="UTF-8" ?>  
    <NotificationReply>  
      <message>  
        <text>response from the notification</text>  
        <cost>20</cost>  
      </message>  
    </NotificationReply>';  
      
      
    // This function will send specified data as an HTTP POST request  
    // to the specified URL. It assumes the data is an UTF-8 encoded  
    // XML document.  
    //  
    // Note: we implement here a simple HTTP POST request at the  
    // socket level, because there is no default library available in  
    // PHP to do that, and we don't want to force you to compile PHP  
    // with the CURL extension if it's not already. Code would be  
    // shorter and simpler using the CURL extension, you might prefer  
    // using it if it is available at your site.  
    //  
    // Returns what parse_answer itself returns, which is an array  
    // containing: response code, headers, body, raw headers.  
    function send($url, $data) {  
      
        // We'll send data by hand, therefore we need to know to  
        // which host, which port and which location data is to be  
        // sent, by parsing the specified URL.  
        if (ereg("^http://([^:/]+)(:([0-9]+))?(/.*)", $url, $regs)) {  
            $host = $regs[1];  
            $port = $regs[3];  
            // If no port was specified, we fallback on default HTTP  
            // port value.  
            if ($port == '')  
                $port = 80;  
            $path = $regs[4];  
        } else {  
            fatal("send: unable to parse URL: $url");  
        }  
      
        // Open the connection using Internet socket connection  
        $fp = @fsockopen($host, $port, $errno, $errstr);  
        if (!$fp) {  
            fatal("send: unable to open connection to $url");  
        }  
      
        // First, send necessary HTTP headers  
        fwrite($fp, "POST $path HTTP/1.0\r\n");  
        fwrite($fp, "Host: $host:$port\r\n");  
        fwrite($fp, "Content-Type: text/xml; charset=UTF-8\r\n");  
        fwrite($fp, "Content-Length: " . strlen_b($data) . "\r\n");  
        fwrite($fp, "\r\n");  
      
        // Second, send data  
        fwrite($fp, $data);  
      
        // Now, read response from the server  
        while (!feof($fp)) {  
            $buf .= fread($fp, 8192);  
            // Parse the HTTP answer and try to extract response code,  
            // headers and body  
            $answer = parse_answer($buf);  
      
            // We need to discover Content-Length, to know when server  
            // finishes sending data  
            if (!$length) {  
                if ($answer[0] == 200)  
                    $length = $answer[1]['content-length'];  
            }  
      
            // When length is available, we can check if response has  
            // been fully transmitted; this is the case when all what  
            // we received equals the headers plus the full contents.  
            if ($length) {  
                if (strlen_b($buf) == strlen_b($answer[3]) + $length)  
                    break;  
            }  
        }  
      
        fclose($fp);  
      
        return $answer;  
    }  
      
    // PHP's strlen should return the length of a string in bytes,  
    // except when using multibyte strings, in which case  
    // mb_orig_strlen must be used (in case strlen was overloaded  
    // with mb_strlen).  
    function strlen_b($str) {  
        if (function_exists('mb_orig_strlen')) {  
            return mb_orig_strlen($str);  
        } else {  
            return strlen($str);  
        }  
    }  
      
    // Parse an HTTP answer to extract response code, headers and body  
    // Returns an array containing: response code, headers, body, raw headers  
    function parse_answer($answer) {  
      
        // This first pattern matching allows to separate first line  
        // (server response status), headers, and data contents  
        if (ereg("^(([^\n]+)\r\n(.*)\r\n\r\n)(.*)", $answer, $regs)) {  
            $full_headers   = $regs[1];  
            $response       = $regs[2];  
            $headers_string = $regs[3];  
            $body           = $regs[4];  
            // Parse first line (server response status)  
            if (ereg("^HTTP/[0-9\.]+ ([0-9]+)", $response, $regs)) {  
                $response_code = $regs[1];  
            } else {  
                fatal("parse_answer: unable to parse response line: $response");  
            }  
            // Parse headers and build a hash with them  
            foreach (split("\r\n", $headers_string) as $line) {  
                if (ereg("^([^:]+): (.*)", $line, $regs)) {  
                    $headers[strtolower($regs[1])] = $regs[2];  
                } else {  
                    fatal("parse_answer: unable to parse header line: $line");  
                }  
            }  
        } else {  
            // Return -1 as response code if parsing was not possible  
            return array(-1);  
        }  
        return array($response_code, $headers, $body, $full_headers);  
    }  
      
    $xml_request = '<?xml version="1.0" encoding="UTF-8" ?>  
    <SMSBoxXMLRequest>  
     <username>user</username>  
     <password>pass</password>  
     <command>WEBSEND</command>  
     <parameters>  
        <receiver>+41761234567</receiver>  
        <operator>sunrise</operator>  
        <service>DUDE</service>  
        <text>message from WEBSEND</text>  
        <cost>20</cost>  
     </parameters>  
    </SMSBoxXMLRequest>';  
      
      
    // Execute the post request using our helper function.  
    $answer = send('http://pro.smsbox.ch:8047/Pro/sms/xml', $xml_request);  
    $response_code = $answer[0];  
    $body = $answer[2];  
      
    // Do anything with $response_code and htmlspecialchars($body)  
      
    ?>
    
    1. Hi!

      der Script wie er unten steht funktioniert vollständig, das heisst er antwortet mir auf meine SMS

      Das fehlende Stück in deiner Schilderung des Verarbeitungsvorgang zwischen dem Senden einer SMS und dem Script ist vermutlich, dass die SMS auf einem Gateway eingeht, das daraufhin einen POST-Request zu einer URL veranlasst, hinter der das gezeigte Script steckt.

      nur komme ich vorne und hinten nicht nach wie ich das ganze umschreiben kann damit er mir anstelle des oberen standarttextes meinen Text sendet dehn ich will. Meine Fachliteratur gibt mir keinen Rat und sonst finde ich leider auch nichts,

      Grundkenntnisse von PHP hast du? Wenn nein, bist du bereit, sie dir anzueignen? Wenn ja, warum hast du dann anscheinend die bereits gegebenen Hinweise noch nicht umgesetzt? Wenn doch, wo ist das Ergebnis davon?

      habe es mit variablen versucht jedoch verliert er beim befehl data = implodet alle variablen die ich ihm oben gefüttert habe.

      Was ist mit "oben" gemeint?

      Vieleicht weiss wer von euch mir einen Rat.

      Der erste: Du solltest beim Scriptersteller nach einer zeitgemäßen Version fragen.

      $data = implode('', file('php://input'));

      file_get_contents() existiert schon eine Weile und erspart das Rumgehampel mit implode().

      if (ereg("^http://([^:/]+)(:([0-9]+))?(/.*)", $url, $regs)) {

      ereg* hat keine Zukunft, preg* (und damit auch die PCRE- statt der Posix-Syntax) ist angesagt.

      $host = $regs[1];
              $port = $regs[3];
              // If no port was specified, we fallback on default HTTP
              // port value.
              if ($port == '')
                  $port = 80;
              $path = $regs[4];

      Unnötige Variablenumkopiererei. $regs[x] ist zwar nicht sprechend, doch den Inhalt hätte man mit einem Kommentar erläutern können.

      Lo!

      1. Hi!

        der Script wie er unten steht funktioniert vollständig, das heisst er antwortet mir auf meine SMS

        Das fehlende Stück in deiner Schilderung des Verarbeitungsvorgang zwischen dem Senden einer SMS und dem Script ist vermutlich, dass die SMS auf einem Gateway eingeht, das daraufhin einen POST-Request zu einer URL veranlasst, hinter der das gezeigte Script steckt.

        nur komme ich vorne und hinten nicht nach wie ich das ganze umschreiben kann damit er mir anstelle des oberen standarttextes meinen Text sendet dehn ich will. Meine Fachliteratur gibt mir keinen Rat und sonst finde ich leider auch nichts,

        Grundkenntnisse von PHP hast du? Wenn nein, bist du bereit, sie dir anzueignen? Wenn ja, warum hast du dann anscheinend die bereits gegebenen Hinweise noch nicht umgesetzt? Wenn doch, wo ist das Ergebnis davon?

        Grundkenntnisse habe ich minimale, kann gerade mal ein Login und Registrierscript erstellen, weiss das ich Variablen abspeichern kann, aber ich weiss nicht wie ich in ein Array erstellen kann so das das richtige im richtigen Array gespeichert ist und wie anwenden weiss ich meistens auch nicht, ich kenne die Kontrollstrukturen also schleifen.
        Anzeigen ist keine Frage das will ich, nur läuft mir die Zeit davon, und die Hinweise verstehe ich einfach nicht wie ich die umsetzen soll.

        habe es mit variablen versucht jedoch verliert er beim befehl data = implodet alle variablen die ich ihm oben gefüttert habe.

        Was ist mit "oben" gemeint?

        oberhalb des Befehls data = implodet kann ich die Variablen mit echo ausgeben, unterhalb des Befehls findet er sie nicht mehr, also gibt mir nichts mehr aus mit echo $x.

        Vieleicht weiss wer von euch mir einen Rat.

        Der erste: Du solltest beim Scriptersteller nach einer zeitgemäßen Version fragen.

        gibt es leider nicht :-(

        $data = implode('', file('php://input'));

        file_get_contents() existiert schon eine Weile und erspart das Rumgehampel mit implode().

        if (ereg("^http://([^:/]+)(:([0-9]+))?(/.*)", $url, $regs)) {

        ereg* hat keine Zukunft, preg* (und damit auch die PCRE- statt der Posix-Syntax) ist angesagt.

        $host = $regs[1];
                $port = $regs[3];
                // If no port was specified, we fallback on default HTTP
                // port value.
                if ($port == '')
                    $port = 80;
                $path = $regs[4];

        Unnötige Variablenumkopiererei. $regs[x] ist zwar nicht sprechend, doch den Inhalt hätte man mit einem Kommentar erläutern können.

        Lo!

        1. Hi!

          habe es mit variablen versucht jedoch verliert er beim befehl data = implodet alle variablen die ich ihm oben gefüttert habe.
          Was ist mit "oben" gemeint?
          oberhalb des Befehls data = implodet kann ich die Variablen mit echo ausgeben, unterhalb des Befehls findet er sie nicht mehr, also gibt mir nichts mehr aus mit echo $x.

          Was denn für Variablen? Da sind keine zu sehen im Script.

          Lo!

          1. Hi!

            habe es mit variablen versucht jedoch verliert er beim befehl data = implodet alle variablen die ich ihm oben gefüttert habe.
            Was ist mit "oben" gemeint?
            oberhalb des Befehls data = implodet kann ich die Variablen mit echo ausgeben, unterhalb des Befehls findet er sie nicht mehr, also gibt mir nichts mehr aus mit echo $x.

            Was denn für Variablen? Da sind keine zu sehen im Script.

            Ou die habe ich wider rausgelöscht, habe die zuoberst per include() aus ner PHP-Datei geholt die nur die SQL abfrage macht, dann wieder gelöscht,

            <?PHP  
              
            include('config.kalender.php');  
              
            $abfrage1 = "SELECT event From kalender LIMIT 1 ";  
            $anlass1 = mysql_query($abfrage1);  
            while($row = mysql_fetch_object($anlass1))  
            {  
            	$event = $row->event;  
            }  
            ?>
            

            Lo!

            1. Hi!

              $abfrage1 = "SELECT event From kalender LIMIT 1 ";
              $anlass1 = mysql_query($abfrage1);
              while($row = mysql_fetch_object($anlass1))
              {
              $event = $row->event;
              }

              Für einen einzigen Datensatz benötigst du keine Abfrage-Schleife.

              Es ist nicht zu erkennen, warum $event an der Stelle noch da sein soll, später aber nicht mehr. Für Kontrollausgaben eignet sich var_dump() auch deutlich besser als echo. Ein echo gibt in einer Reihe von Situationen immer nur einen Leerstring aus, während man mit var_dump() sehen kann, was wirklich in der Variablen steht.

              Lo!

              1. Hi

                Ah gut werde das so machen, ich denke das das irgendwie schon möglich ist.

                [code lang=php]// Get received document. Most portable way seems to use
                // the php://input stream, as $_POST does key=value parsing
                // and $HTTP_RAW_POST_DATA can be configured out.
                $data = implode('', file('php://input'));[/Code]

                Verstehe ich das richti das ich hier mit Post reinschreiben soll? Also über ein Formular die daten senden?

                Tk

                » Hi!

                $abfrage1 = "SELECT event From kalender LIMIT 1 ";
                $anlass1 = mysql_query($abfrage1);
                while($row = mysql_fetch_object($anlass1))
                {
                $event = $row->event;
                }

                Für einen einzigen Datensatz benötigst du keine Abfrage-Schleife.

                Es ist nicht zu erkennen, warum $event an der Stelle noch da sein soll, später aber nicht mehr. Für Kontrollausgaben eignet sich var_dump() auch deutlich besser als echo. Ein echo gibt in einer Reihe von Situationen immer nur einen Leerstring aus, während man mit var_dump() sehen kann, was wirklich in der Variablen steht.

                Lo!

                1. Hi!

                  Bitte zitiere nur die Teile auf die du dich konkret beziehst. Danke.

                  $data = implode('', file('php://input'));
                  Verstehe ich das richti das ich hier mit Post reinschreiben soll? Also über ein Formular die daten senden?

                  Ja, das Script nimmt POST-Daten entgegen. Und ändere diese Zeile bitte wie folgt, wenn du keine uralte PHP-Version hast.

                  $data = file_get_contents('php://input');

                  Das liest die Daten ohne Umweg.

                  Lo!

        2. @@Tino:

          nuqneH

          Grundkenntnisse [von PHP] habe ich minimale, kann gerade mal ein Login und Registrierscript erstellen

          Das widerspricht sich. Mit minimalen Grundkenntnissen kann man kein Login- und Registrierscript erstellen. Man sollte es jedenfalls nicht, sonst reißt man Sicherheitslücken auf wie Scheunentore.

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)