Проблема кодировки символов в PHP / MySQL / jQuery - PullRequest
3 голосов
/ 01 февраля 2010

Я сделал несколько CMS на PHP, которые манипулируют данными из MySQL.
В моей CMS у меня есть несколько полей ввода, в которые я хотел бы внедрить причудливое автозаполнение jQuery. По сути, идея заключается в создании массивов jQuery из таблиц MySQL ...

Я работаю с PHP 5.3.0, MySQL 5.0.82 и Eclipse 3.4.2. Мой PHP-проект в Eclipse имеет кодировку UTF-8. Мои страницы CMS имеют кодировку UTF-8 (<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />). Сам сайт также находится в кодировке UTF-8. База данных MySQL и все таблицы в формате UTF-8 (utf8_general_ci).

На данный момент все работает нормально, если я ввожу только буквы (даже международные и некоторые странные символы), но если я ввожу некоторые из этих символов ", &, < или >, я запускаю в некоторые серьезные проблемы ...

Когда я ввожу такой текст, все выглядит нормально в моей базе данных, но когда я пытаюсь создать массив для jQuery, он создает ошибку из-за кавычек (я полагаю, что даже одиночные кавычки здесь проблемы) ... Предположим, я должен как-то избежать их, верно? Затем я использую PHP htmlspecialchars, и массив jQuery создается правильно. Даже когда я щелкаю внутри поля ввода и начинаю печатать текст, автозаполнение показывает все эти символы правильно. Но если я на самом деле выберу одну из записей с этими символами, они внезапно появятся как экранированные символы html (&quot;, &amp;, &lt;, &gt;). Поэтому я попытался применить htmlspecialchars_decode к тому же полю ввода, но это не помогло ... Есть ли способ правильно отобразить эти символы в моем поле ввода при выборе записи из автозаполнения jQuery?

Я пытался решить проблему, но не смог найти решение ... Пожалуйста, помогите!
Заранее спасибо!


EDIT: Вот как я создаю массив для jQuery ($tags это просто простой массив):

<?php
$t = implode(", ", $tags);
?>
<script>
$(document).ready(function(){
    var data_tags = "<?php echo htmlspecialchars($t); ?>".split(" | ");
    $("#input_tags").autocomplete(data_tags, { multiple: true, multipleSeparator: ", " });
});
</script>

Я знаю, что, возможно, это не самый лучший способ, но в целом это работает :) 1029 *

Я генерирую поле ввода следующим образом:

<?php

function inputField($label, $name, $type, $size, $default=NULL, $misc=NULL){

    $printInput = "<tr><td align=\"right\" valign=\"top\">\n";
    $printInput .= $label;
    $printInput .= "</td><td>\n";
    $printInput .= "<input type=\"".$type."\" size=\"".$size."\" name=\"".$name."\" id=\"".$name."\" value=\"".$default."\"> ".$misc."\n";
    $printInput .= "</td></tr>\n";

    return $printInput;

}

echo inputField("TAGS", "input_tags", "text", 70, $db_tags);
?>

Ответы [ 2 ]

4 голосов
/ 01 февраля 2010

Попробуйте json_encode(), для чего требуется PHP 5.2.0 или выше.

РЕДАКТИРОВАТЬ Вам не нужны кавычки вокруг значения json_encoded:

var data_tags = <?php echo json_encode($t); ?>;
0 голосов
/ 01 февраля 2010

Попробуйте использовать htmlentities();.

...