Хранение многоязычных данных в сериализованном PHP в MySQL - PullRequest
1 голос
/ 05 июля 2010

Я должен вставить некоторые данные в таблицу MySQL.Данные будут извлечены, а затем (в настоящее время) unserialize d, в этот момент будет выбран правильный язык отображения ...

Мне удалось обработать данные (текст, закодированный с уценкой) внабор операторов 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

Ответы [ 2 ]

0 голосов
/ 06 июля 2010

Спасибо всем за полезные советы.

На самом деле проблема заключалась в смеси хранимого текстиля (не уценки!) И многоязычного 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 может обрабатывать одинарные кавычки. Рад, что все кончено.

0 голосов
/ 05 июля 2010

Вы пытались удалить mysql_real_escape_string, чтобы проверить, работает ли unserialize?

Еще одна вещь, которую вы можете попробовать - это кодировка base64 в сериализованном массиве.

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

А затем base64_decode и десериализация при получении.

...