2010-01-31 3 views
3

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

Я работаю с 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> 

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

Я генерации в поле ввода таким образом:

<?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); 
?> 
+0

Возможно, они закодированы в двойном кодировании? – alex

+0

Нет. Я вставляю строки и выхожу из db без каких-либо специальных функций ... Просто «как есть» ... :) – errata

ответ

4

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

EDIT Вам не нужны кавычки json_encoded значения:

var data_tags = <?php echo json_encode($t); ?>; 
+0

Если я заменил htmlspecialchars() на json_encode(), я попал в турбо-хаос! Международные символы (например, č, ć, ž, š, đ) все испорчены, даже мой автозаполнение больше не работает! :( – errata

+0

@errata: можете ли вы показать нам пример кода, который вы пишете? –

+0

Конечно, я могу ... Я уже редактировал свой первый пост и обновляю его еще одним кодом ... – errata

0

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

+0

Я уже пробовал это, но если я заменю htmlspecialchars() на htmlentities(), я становлюсь еще хуже, чем с json_encode()! Все символы, которые не являются латинскими буквами, в полном беспорядке! Вы знаете это: :) – errata

Смежные вопросы