запись xml-данных в базу данных oracle


Я создал 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']."',$t‌​ext)"
);

Моя настоящая проблема заключается в том, что иногда данные вставляются правильно, а иногда теги html неправильно кодируются.

Может ли любое тело предложи мне

  1. погода я должен использовать htmlentities() или нет.
  2. Что я должен сделать, чтобы отобразить эти html-теги в html5.

Пример 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>
Author: jondinham, 2014-08-28

1 answers

В современной разработке программного обеспечения следует использовать параметризованные запросы. Это делается для того, чтобы избежать взлома инъекций и ошибок из-за специальных символов.

Заменить строку:

$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

 1
Author: jondinham, 2014-08-28 04:37:37