在mysql中的序列化php中存储多语言数据

时间:2010-07-04 23:35:45

标签: php mysql markdown multilingual serialization

我必须将一些数据插入MySQL表中。将检索数据,然后(目前)unserialize d,此时将选择正确的显示语言......

我已经设法将数据(用markdown编码的文本)变成一组PHP语句,大致如下:

<?php
$component_data = array();
$component_data[65] =
  array( // reformatted to avoid side-scrolling
      "en"=>"* Student welfare is our top priority.\n* We 
               have 30 years of experience of running successful 
               courses for Young Learners.",
      "es"=>"* El bienestar de nuestros estudiantes es nuestra 
               principal prioridad.\n* Contamos con experiencia de 
               30 años de exitosa realización de cursos para jóvenes.",
      "de"=>"* Das Wohl des Lernenden ist unsere oberste Priorität.\n 
               *Wir organisieren seit 30 Jahren erfolgreich 
               Sprachkurse für Jugendliche",
      "it"=>"* Il benessere degli studenti è la nostra priorità 
               assoluta.\n* Abbiamo 30 anni di esperienza nei corsi 
               per ragazzi.",
      "fr"=>"* Le bien-être de l’élève a pour nous la priorité absolue.
             \n* Nous avons 30 ans d'expérience dans la gestion de cours 
             réussis pour jeunes étudiants");
?>

我希望使用以下内容将其转换为可以导入MySQL表的格式:

<?php
    foreach ($component_data as $id => $value) {
      echo "UPDATE `components` SET `component_content`='".
        mysql_real_escape_string(serialize($value)).
        "' WHERE `id` = '$id';\n";
    }
?>

不幸的是它确实进入了,但是页面上的结果被破坏了,即它只显示了序列化的字符串,而不是数组(如果它无法设法取消序列化从MySQL获取的字符串,则这是默认行为)

我已经尝试了许多PHP字符串清理功能的排列,我的头脑坦率地旋转。

理想情况下,我希望能够重新格式化PHP样式数据以插入MySQL数据库,以便在获取时它仍处于unserializ状态...

...以及奖励积分,如果您可以将utf8外语字符转换为HTML权限并从markdown转换为HTML

2 个答案:

答案 0 :(得分:0)

您是否尝试删除'mysql_real_escape_string'以查看反序列化是否有效?

您可以尝试的另一件事是序列化数组上的base64编码。

<?php
    foreach ($component_data as $id => $value) {
      echo "UPDATE `components` SET `component_content`='".
        base64_encode(serialize($value)).
        "' WHERE `id` = '$id';\n";
    }
?>

然后base64_decode它并在检索时取消序列化。

答案 1 :(得分:0)

感谢大家提供有用的建议。

实际上,问题原来是存储的纺织品(不是降价!)和多语言的utf-8的混合物。将其压缩到MySQL的解决方案有点夸张。首先在数据集上运行纺织品以将其转换为html,然后通过以下方法进行处理,以处理外来字符的编码:

<?php
include 'data.php'; // contains component data similar to above.

foreach ($component_data as $id => $value) {
  foreach ($value as $language => $translation) {
    $value[$language] = str_replace(
      array("&lt;","&gt;"),
      array('<','>'), 
      htmlentities($translation, ENT_NOQUOTES, "UTF-8")
      );
  }
  echo "UPDATE `components` SET `component_content`='".mysql_real_escape_string(serialize($value))."' WHERE `id` = '$id';\n";
}

?>

重要的一点是ENT_NOQUOTES,这意味着一个简单的str_replace可以处理打开和关闭标签(谢天谢地,文本中没有数学),mysql_real_escape_string可以处理单引号。很高兴结束了。