mackattack
Mitglied
Moin!!
Ich sitze ma wieder vor nem Problem.
Ein derzeitiges Projekt verlangt von mir, Flash, PHP, XML und MySQL miteinander zu verbinden. Im Prinzip kein Problem.
Jetzt bin ich aber auf nen Fall gestossen, wo doch ein Problem auftaucht.
Und zwar habe ich eine Klasse in PHP namens "swiffSQL", welche mir bei Angabe eines Querys ein komplettes XML zurück liefert. Somit kann ich aus Flash direkt SQL-Querys senden und bekomme sofort das benötigte XML.
Die Klasse holt sich alle Felder aus der DB, die vom Query ausgegeben werden sollen und stellt diese so dar:
Was ist, wenn der Artikelname in der Datenbank mit irgendwelchen Formatierungsgeschichten steht (z.B. <b>Artikel</b><i>150</i>) ?
Ja, dann gibt mir der XML-Parser nen Fehler zurück von wegen "Das Zeichen '<' darf nicht in Attributen auftauchen" oder sowas... Jetzt habe ich probiert, die Felder, wo solche Zeichen auftauchen könnten, als CDATA-Block zu definieren. Geht aber auch in die Hose, wird auch mit nem "<" eingeleitet
Nervig an der ganzen Geschichte ist, dass ich kein SimpleXML/DOM zur Verfügung habe, da auf dem Server des Kunden kein PHP5 installiert ist und auch nicht installiert wird.
Kennt einer von euch vielleicht eine Lösung? Z.B. eine Klasse, die mir aus einem Array ein XML erzeugt? Oder vllt. kann sich ja mal jemand die swiffSQL Klasse anschauen und mir mal nen Denkanstoss geben, wie ich diese ändern/erweitern könnte, damit ich zur Lösung komme!
Hier nochmal die besagte Klasse:
Vielen Dank schonmal im Vorraus ...
MackAttack
Ich sitze ma wieder vor nem Problem.
Ein derzeitiges Projekt verlangt von mir, Flash, PHP, XML und MySQL miteinander zu verbinden. Im Prinzip kein Problem.
Jetzt bin ich aber auf nen Fall gestossen, wo doch ein Problem auftaucht.
Und zwar habe ich eine Klasse in PHP namens "swiffSQL", welche mir bei Angabe eines Querys ein komplettes XML zurück liefert. Somit kann ich aus Flash direkt SQL-Querys senden und bekomme sofort das benötigte XML.
Die Klasse holt sich alle Felder aus der DB, die vom Query ausgegeben werden sollen und stellt diese so dar:
Code:
<?xml version="1.0" encoding="iso-8859-1" ?>
<result value="1">
<row artikelid="55" kategorieid="70" id="55" artikel_nr="030035-002" artikel_name="Artikelname 1" />
<row artikelid="24" kategorieid="70" id="24" artikel_nr="030033-002" artikel_name="Artikelname 2" />
</result>
Was ist, wenn der Artikelname in der Datenbank mit irgendwelchen Formatierungsgeschichten steht (z.B. <b>Artikel</b><i>150</i>) ?
Ja, dann gibt mir der XML-Parser nen Fehler zurück von wegen "Das Zeichen '<' darf nicht in Attributen auftauchen" oder sowas... Jetzt habe ich probiert, die Felder, wo solche Zeichen auftauchen könnten, als CDATA-Block zu definieren. Geht aber auch in die Hose, wird auch mit nem "<" eingeleitet
Nervig an der ganzen Geschichte ist, dass ich kein SimpleXML/DOM zur Verfügung habe, da auf dem Server des Kunden kein PHP5 installiert ist und auch nicht installiert wird.
Kennt einer von euch vielleicht eine Lösung? Z.B. eine Klasse, die mir aus einem Array ein XML erzeugt? Oder vllt. kann sich ja mal jemand die swiffSQL Klasse anschauen und mir mal nen Denkanstoss geben, wie ich diese ändern/erweitern könnte, damit ich zur Lösung komme!
Hier nochmal die besagte Klasse:
PHP:
class swiffSQL {
var $m_access = array();
var $m_conn;
var $m_result;
var $m_outputType = "";
var $m_db_selected;
function swiffSQL ($outputType,$database,$host = "localhost",$user = "root",$password = "",$port = 3306)
{
$this->setOutput($outputType);
$this->setPermissions();
if(!$this->m_conn = mysql_connect($host.":".$port,$user,$password)) {
$this->showError(mysql_error());
return;
}
if(!$this->m_db_selected = $this->selectDatabase($database)) {
$this->showError(mysql_error());
return;
}
}
function echoVar($varName, $varValue, $urlEncode = FALSE)
{
if ($urlEncode)
{
$varValue = urlencode($varValue);
} //~ end if
echo "&".$varName."=".$varValue."&\n";
} //~ end function echoVar
function showError($error)
{
if($this->m_outputType == "VAR") {
$this->echoVar("error",$error,TRUE);
$this->echoVar("result",0);
} else if ($this->m_outputType == "XML") {
$this->xmlHeader();
echo "<error text=\"".$error."\" />";
} else {
echo "<b>Error:</b> ".$error;
}
//exit();
}
function xmlHeader()
{
if (!headers_sent()) {
header ("Content-type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>";
}
}
function outputXML ()
{
$this->xmlHeader();
echo "<result value=\"1\">";
while ($row = mysql_fetch_assoc($this->m_result)) {
$attributes = "";
while (list($key,$value) = each ($row)) {
$attributes .= " ".$key."=\"".$value."\"";
}
echo "<row".$attributes." />";
}
echo "</result>";
}
function outputVariables ()
{
$i = 0;
while ($row = mysql_fetch_assoc($this->m_result)) {
while (list($key,$value) = each($row)) {
$this->echoVar($key."_".$i,$value,TRUE);
}
$i++;
}
}
function setOutput ($type)
{
//~ valid values are: VAR,XML
$type = strtoupper($type);
if ($type == "XML" OR $type == "VAR") {
$this->m_outputType = $type;
} else {
$this->showError("No valid output type specified!");
return;
}
}
function selectDatabase ($database) {
$result = mysql_select_db($database,$this->m_conn);
return $result;
}
function setPermissions ($select = TRUE,$insert = FALSE,$update = FALSE,$delete = FALSE,$truncate = FALSE,$drop = FALSE)
{
$this->m_access["SELECT"] = $select;
$this->m_access["INSERT"] = $insert;
$this->m_access["UPDATE"] = $update;
$this->m_access["DELETE"] = $delete;
$this->m_access["TRUNCATE"] = $truncate;
$this->m_access["DROP"] = $drop;
$this->m_access[0] = 0;
}
function getQueryType ($sqlString)
{
$pattern["SELECT"] = "/^([\s]*)(SELECT)([\s]+)/i";
$pattern["INSERT"] = "/^([\s]*)(INSERT)([\s]+)/i";
$pattern["UPDATE"] = "/^([\s]*)(UPDATE)([\s]+)/i";
$pattern["DELETE"] = "/^([\s]*)(DELETE)([\s]+)/i";
$pattern["TRUNCATE"] = "/^([\s]*)(TRUNCATE)([\s]+)/i";
$pattern["DROP"] = "/^([\s]*)(DROP)([\s]+)/i";
$res = 0;
while (list($key,$value) = each($pattern)) {
if (preg_match($value,$sqlString)) {
$res = $key;
break;
} //~ end if
} //~ end while
return strtoupper($res);
}
function query ($sqlString)
{
$sqlString = stripslashes($sqlString);
if(!$this->m_conn OR !$this->m_db_selected) {
// $this->showError(mysql_error());
return;
}
if (empty($sqlString)) {
$this->showError("SQL string needed!");
return;
}
if(!$queryType = $this->getQueryType($sqlString)) {
$this->showError("Command not recognized!");
return;
}
if (!$this->m_access[$queryType]) {
$this->showError("Access not allowed!");
return;
}
if (!$this->m_result = mysql_query($sqlString,$this->m_conn)) {
$this->showError(mysql_error());
return;
} else {
if ($queryType == "SELECT") {
if ($this->m_outputType == "XML") {
$this->outputXML();
} else if ($this->m_outputType == "VAR") {
$this->outputVariables();
$this->echoVar("result_total",mysql_num_rows($this->m_result));
$this->echoVar("result",1);
}
@mysql_free_result($this->m_result);
} else if ($queryType == "INSERT") {
$insert_id = mysql_insert_id($this->m_conn);
if ($this->m_outputType == "XML") {
$this->xmlHeader();
echo "<insert_id value=\"".$insert_id."\" />";
} else if ($this->m_outputType == "VAR") {
$this->echoVar("insert_id",$insert_id);
$this->echoVar("result",1);
}
} else if ($queryType == "DELETE" OR $queryType == "UPDATE") {
$affected_rows = mysql_affected_rows($this->m_conn);
if ($this->m_outputType == "XML") {
$this->xmlHeader();
echo "<affected_rows value=\"".$affected_rows."\" />";
} else if ($this->m_outputType == "VAR") {
$this->echoVar("affected_rows",$affected_rows);
$this->echoVar("result",1);
}
} else {
if ($this->m_outputType == "XML") {
$this->xmlHeader();
echo "<result value=\"1\" />";
} else if ($this->m_outputType == "VAR") {
$this->echoVar("result",1);
}
}
} //~ end if else
} //~ end function query
function close()
{
@mysql_close($this->m_conn);
}
}
Vielen Dank schonmal im Vorraus ...
MackAttack