mysql_real_escape_string und ein XML Objekt

azoo

Mitglied
Hallo Leute,
ich habe in einem third.Party Script, welches XML Daten anfordert, verarbeitet und in einer DB speichert, folgendes gesehen und nicht verstanden.

Der Inhalt der Variable $itemID mit var_dump gezeigt :
HTML:
object(SimpleXMLElement)#10 (1) {
  [0]=>
  string(12) "150777155801"
}

Zu einem späteren Zeitpunkt wird $itemId in eine mysql DB geschrieben, dazu wird die Variable mit mysql_real_escape_string bearbeitet und die Ausgabe via var_dump wäre:
HTML:
string(12) "150777155801"

Die Funktion escape_string scheint $itemId so zu bereinigen das sie nur noch den String 150777155801 enthält.
Warum ist das so und ist das eine gängige Verfahrensweise?

Die Doku zu mysql_real_escape_string ist nämlich folgende:
Maskiert spezielle Zeichen im unescaped_string unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung, so dass das Ergebnis ohne Probleme in mysql_query() verwendet werden kann. Wenn Sie Binärdaten einfügen wollen, müssen Sie die Funktion auf jeden Fall verwenden.

mysql_real_escape_string() ruft die Funktion mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit einem Backslash ('\') versieht: \x00, \n, \r, \, ', " und \x1a.

Die Funktion muss immer (mit wenigen Ausnahmen) verwendet werden, um Daten abzusichern, bevor sie per Query an MySQL übermittelt werden.

Gruß Markus
 
Wahrscheinlich implementiert die Klasse SimpleXMLElement eine __toString()-Methode, welche den Inhalt aller Kindelemente ausgibt.
Und in [phpf]mysql_real_escape_string[/phpf] wird das Objekt zu einem String konvertiert - sprich die __toString()-Methode wird aufgerufen und somit verarbeitet [phpf]mysql_real_escape_string[/phpf] nur den String 150777155801 .

Dies ist aber nur eine Vermutung, genaueres wird sich auf php.net finden.

// Edit

Zwar wird in der PHP-Dokumentation keine __toString-Methode gelistet, aber ich habe mal folgenden Test ausgeführt:
PHP:
<?php

class ABC
{
  public $data;
  
  public function __construct($_data)
  {
    $this->data = $_data;
  }
  
  public function __toString()
  {
    return $this->data;
  }
}
mysql_connect('localhost', '...', '...') or die('MySQL error!');
$obj = new ABC('escape here: \'');
echo mysql_real_escape_string( $obj );
Und siehe da, [phpf]mysql_real_escape_string[/phpf] konvertiert wirklich das Objekt in einen String gibt folgendes aus:
Code:
escape here: \'
 
Ja das habe ich ja hier auch schon getestet und genau weil die PHP-Dokumentation in Bezug auf mysql_real_escape_string() dazu nichts sagt, stellte sich mir hier die Frage ob man diesem "Nebeneffekt" vertrauen kann. Das Script läuft so nun schon gefühlte zwei Jahre und funktioniert aber da ich nun von mysql_escape_string auf "real" umstellen muß, will ich sicher sein.

Gruß Markus
 
Laut Dokumentation sollte der 1. Parameter ein String sein und das so sollte man auch diese Funktion "bedienen".

Auch wenn jemand anderes dein Skript liest, wird er sich fragen wieso du [phpf]mysql_real_escape_string[/phpf] ein SimpleXMLElement-Objekt übergibst.
 
Zurück