将 XML 数据写入 Oracle 数据库

3

我已经创建了一个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); 
    }
}

插入查询语句如下: INSERT INTO Internationalization VALUES (seq_id.nextval,$text)
$stid2 = oci_parse(
    $conn, 
    "INSERT INTO UILABELINT VALUES (seq_uilabelint_id.nextval,'".$localeid."','".$filename."','".$value['ID']."',$t‌​ext)"
);

我的实际问题是有时数据被正确插入,有时html标签未正确编码。

有人能给我建议吗?

  1. 我是否应该使用htmlentities()。
  2. 我应该怎么做才能在html5中显示这些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>

请引用您正在使用的确切插入查询。 - jondinham
$stid2 = oci_parse($conn, "INSERT INTO UILABELINT VALUES (seq_uilabelint_id.nextval,'".$localeid."','".$filename."','".$value['ID']."',$text)"); - kaustubh badamikar
你能分享一下未正确编码的html标签的例子吗? - ivan.sim
是的,<a href> 这个已经编码为 <a href>。 - kaustubh badamikar
嗯... &st; 不是一个有效的 HTML 实体。不确定 htmlspecialchars 是否会有所不同,但你试过了吗? - ivan.sim
顺便提一下,你可以尝试使用htmlentities($value->translatedtext, ENT_HTML5|ENT_QUOTES, "UTF-8");代替str_replace - ivan.sim
1个回答

1
你应该在现代软件开发中使用参数化查询来避免注入攻击和由特殊字符引起的错误。
用参数化查询替换这行代码:
$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);

最后执行语句时,您不再需要使用“str_replace”或“htmlentities”。只需直接获取文本即可:
$text = $value->translatedtext;

了解有关OCI参数化的更多信息,请参见:http://php.net/manual/en/function.oci-bind-by-name.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接