我创建了一个php脚本来从xml读取数据并将其写入oracle数据库 xml数据有html标签。它们有各种语言,如英语,俄语,意大利语,德语。
在php中我正在从xml读取数据
$xml=simplexml_load_file($file);
foreach($xml as $value)
{
$text='';
if($value->englishtext=='')
{
$text=htmlentities(str_replace("'", "'", $value->translatedtext), ENT_HTML5);
}
else
{
$text=htmlentities(str_replace("'", "'", $value->englishtext), ENT_HTML5);
}
}
插入查询是 插入国际化价值(seq_id.nextval,$ text)
$stid2 = oci_parse(
$conn,
"INSERT INTO UILABELINT VALUES (seq_uilabelint_id.nextval,'".$localeid."','".$filename."','".$value['ID']."',$text)"
);
我真正的问题是有时数据插入正确,有时html标签没有正确编码。
任何人都可以建议我
xml数据的示例
<?xml version="1.0" encoding="UTF-8"?>
<Resources>
<Section ID="AddListing">
<englishtext><![CDATA[Add Listing]]></englishtext>
<translatedtext/>
</Section>
<Section ID="DirectPayment">
<englishtext><![CDATA[Receive <b>direct payments</b> from travelers.]]</englishtext>
<translatedtext/>
</Section>
</Resources>
答案 0 :(得分:1)
您应该在现代使用参数化查询&#39;软件开发。这是为了避免由于特殊字符导致的黑客攻击和错误。
替换行:
$stid2 = oci_parse(...);
使用以下语句准备代码:
$stid2 = oci_parse(
$conn,
"INSERT INTO UILABELINT VALUES (".
"seq_uilabelint_id.nextval,':localeId',':fileName',':valueId',':text'".
")"
);
oci_bind_by_name($stid2, ":localeId", $localeid);
oci_bind_by_name($stid2, ":fileName", $filename);
oci_bind_by_name($stid2, ":valueId", $value["ID"]);
oci_bind_by_name($stid2, ":text", $text);
并最终执行该声明,您不需要使用&#39; str_replace&#39;或者&#39; htmlentities&#39;了。直接获取文本:
$text = $value->translatedtext;
有关OCI参数化的更多信息,请参阅:http://php.net/manual/en/function.oci-bind-by-name.php