代码之家  ›  专栏  ›  技术社区  ›  Dycey

在mysql中用串行php存储多语言数据

  •  1
  • Dycey  · 技术社区  · 14 年前

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

    <?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样式的数据,以便插入MySQL数据库,以便在获取数据时仍处于 unserializ 可恢复状态。。。

    ... 另外,如果你能将utf8外语字符转换成HTML实体,并从markdown转换成HTML,你就可以获得额外的积分

    2 回复  |  直到 13 年前
        1
  •  0
  •   xil3    14 年前

    你有没有试过删除“mysql\u real\u escape\u string”来看看unserialize是否有效?

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

    然后对它进行解码,在检索时取消序列化。

        2
  •  0
  •   Dycey    14 年前

    谢谢大家的建议。

    事实上,问题是储存的纺织品的混合物(不是降价!)多语种utf-8。将其压缩到MySQL中的解决方案有点粗糙。首先在数据集上运行textile以将其转换为html,然后通过以下操作对其进行munge,以处理对外来字符的编码:

    <?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 可以处理单引号。很高兴结束了。