2010-07-04 48 views
1

我必须在MySQL表中插入一些数据。数据将被检索,然后(目前)unserialized在此时正确的显示语言将被选择...在mysql中的序列化php中存储多语言数据

我设法将数据(用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实体并从减价转换为HTML

+1

首先,为什么在这里序列化?我想说的是,将序列化数据放入数据库有90%的可能性,但实际上并没有这样做 - 您将数组分开并将其正确放入SQL中(如果我们忽略了不需要的序列化)。这就是说,为什么你会期望有一个反序列化的数组,当你序列化只是字符串(不需要序列化的第一个地方)? – Amadan 2010-07-04 23:43:48

+0

因为还有遗留的数据没有被翻译,出于政治原因,我需要将多个翻译放到一个mysql文本字段中。我没有说它很优雅。 :-( – Dycey 2010-07-05 00:07:45

+0

我很抱歉,看到我误读你的代码!@Amadan它是一个多维数组,他将数组串行化到'component_data [65]'中,该数组不是每种语言的值。 – 2010-07-05 00:32:33

回答

0

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

事实上,问题原来是存储的纺织品(不是降价!)和多语言的utf-8的混合物。将它挤入MySQL的解决方案有点笨拙。在数据集首轮纺织把它转换成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可以处理单引号。很高兴结束了。

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它和unserialise当你检索它。

+0

我刚更新了我的答案。 – xil3 2010-07-04 23:53:09

+0

你不应该从查询中删除'mysql_real_escape_string'。如果你只是想检查某个函数是否按预期工作 - var_dump()它。 – zerkms 2010-07-04 23:57:14

+0

@zerkms:为什么倒票?这只是一个调试建议 - 这是可悲的... – xil3 2010-07-04 23:59:05

相关问题