[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с кодировкой
ne_umeu
Добрый день. Хочу создать словарик. Есть БД со словами в кодировке
utf. Есть скипт поиска:

<?php
//$word="аажы-чаң";
$db=mysql_connect("localhost","root","");
mysql_select_db("voc",$db);
mysql_query("set names 'utf8'");
mysql_query("SET collation_connection = 'utf8_general_ci'");
$res = mysql_query("SELECT word,translation FROM tuvrus WHERE word='$word'", $db);
$data= mysql_fetch_assoc($res);
if ($data['word']=="$word") {
echo $data['word'];
echo $data['translation'];
}
else
echo "Такое слово отсутствует";
?>

При передаче $word из формы поиск не осуществляется. Хотя если задать переменную вручную (разблокировать $word в скрипте), то все работает. Всё сохранено в кодировке utf. Я правильно понимаю, что кодировка данных переданных в $word не совпадает кодировкой БД? Пробовал исправить через iconv(), но не вышло.

 ! 

М
Обрамляйте код специальными тегами !
Winston




Спустя 3 минуты, 38 секунд (16.09.2011 - 18:00) Winston написал(а):
Цитата (ne_umeu @ 16.09.2011 - 17:56)
WHERE word='$word'"
Может стоит попробовать написать ?
$res = mysql_query("SELECT word,translation FROM tuvrus WHERE word='" .$_POST['word']. "'", $db);




Спустя 2 минуты, 5 секунд Winston написал(а):
Цитата (ne_umeu @ 16.09.2011 - 17:56)
mysql_query("set names 'utf8'");
mysql_query("SET collation_connection = 'utf8_general_ci'");

Достаточно одного запроса
mysql_query("SET NAMES utf8");

В ней уже все нужное укомплектовано :)

Спустя 20 минут, 37 секунд (16.09.2011 - 18:20) ne_umeu написал(а):
Пробовал. Не работает. Пробовал также так:
$word=$_POST['word'];

Все равно не работает. Пишет: "Такое слово отсутствует", хотя в бд оно точно есть.

Спустя 1 минута, 49 секунд (16.09.2011 - 18:22) Winston написал(а):
Покажи свою форму



Спустя 1 минута, 59 секунд Winston написал(а):
Цитата (ne_umeu @ 16.09.2011 - 17:56)
if ($data['word']=="$word")  {

Проверяй вот так
if($data['word'] == $word) 

Спустя 6 минут, 5 секунд (16.09.2011 - 18:28) alex12060 написал(а):

$res = mysql_query("SELECT word,translation FROM tuvrus WHERE word='$word'", $db) or die(mysql_error());
$data = mysql_fetch_assoc($res) or die(mysql_error());


Есть ошибки?
А если слово приходит через адресную строку, при том, русское, надо делать так:


urldecode($_POST['word']);

Спустя 12 минут, 29 секунд (16.09.2011 - 18:41) caballero написал(а):
Цитата
Достаточно одного запроса

mysql_query("SET NAMES utf8");

В ней уже все нужное укомплектовано :)


как раз collation зачастую нужно указывать конкретно особенно при работе со всякого рода словарями

Спустя 21 минута, 17 секунд (16.09.2011 - 19:02) ne_umeu написал(а):
Цитата (alex12060 @ 16.09.2011 - 15:28)

$res = mysql_query("SELECT word,translation FROM tuvrus WHERE word='$word'", $db) or die(mysql_error());
$data = mysql_fetch_assoc($res) or die(mysql_error());


Есть ошибки?
А если слово приходит через адресную строку, при том, русское, надо делать так:


urldecode($_POST['word']);


Если добавить конструкцию or die то не выводится вообще ничего (даже "такое слово отсутствует"). Ошибок никаких тоже не выводится.

а куда вставить

urldecode($_POST['word'])?

Вообще я добавил в базу пару слов на латинице. Они находятся нормально. Проблема с кирилицей.

Спустя 3 минуты, 3 секунды (16.09.2011 - 19:05) Winston написал(а):
Цитата (ne_umeu @ 16.09.2011 - 17:56)
Пробовал исправить через iconv(), но не вышло.

Перед поиском так пробовал ?
$word = iconv('WINDOWS-1251', 'UTF-8', $_POST['word']);

Спустя 1 минута, 43 секунды (16.09.2011 - 19:07) ne_umeu написал(а):
Цитата (Winston @ 16.09.2011 - 15:22)
Проверяй вот так
if($data['word'] == $word) 

Сделано

Вот форма:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<
html>
<
head>
<
meta http-equiv="Выберите расширение для паковки" content="text/html; charset=utf-8"></head>
<
title></title>
<
body>
<
form action="./result.php" method="POST">слово:
<
input type="text" name="word">
<
input type="submit" name="go" value="Send">
</
form><br><br>
</
body>
</
html>

Спустя 4 минуты, 3 секунды (16.09.2011 - 19:11) alex12060 написал(а):
Ой, если $_POST, то не надо urldecode.


$db = mysql_connect("localhost","root","");
mysql_select_db("voc",$db);
mysql_query("set names utf8");
$res = mysql_query("SELECT `word`, `translation` FROM `tuvrus` WHERE `word` = '".mysql_real_escape_string($_POST['word'])."'", $db);
$data = mysql_fetch_assoc($res);
if ($data['word'] == $_POST['word']) {
echo $data['word'];
echo $data['translation'];
}
else
echo "Такое слово отсутствует";

Спустя 2 минуты, 39 секунд (16.09.2011 - 19:13) alex12060 написал(а):
Кстати, сделай ка так:
var_dump(get_magic_quotes_gpc());

и скажи, что вывелось?

Спустя 11 минут, 56 секунд (16.09.2011 - 19:25) ne_umeu написал(а):
Цитата (alex12060 @ 16.09.2011 - 16:13)
Кстати, сделай ка так:
var_dump(get_magic_quotes_gpc());

и скажи, что вывелось?

Вывелось int(1)

Последний вариант работоспособного скрипта таков:


<?php
$word = iconv('WINDOWS-1251', 'UTF-8', $_POST['word']);
$db=mysql_connect("localhost","root","");
mysql_select_db("voc",$db);
mysql_query("set names 'utf8'");
$res = mysql_query("SELECT word,translation FROM tuvrus WHERE word='$word'", $db);// or die(mysql_error());
$data= mysql_fetch_assoc($res); // or die(mysql_error());
//$data= urldecode($_POST['word']);

if ($data['word']==$word) {
echo $data['word'];
echo $data['translation'];
}
else
echo "Такое слово отсутствует";
var_dump(get_magic_quotes_gpc());
?>

Нормально ищет слова написанные латиннице и слова написанные "нормальной кирилицей" (типа таких: аажылаар, аазаар).

НЕ ищет слова со спецсимволами типа таких: аажы-чаңныг, аадаң.
Как исправить? Есть соображения?

Спустя 6 минут, 41 секунда (16.09.2011 - 19:32) alex12060 написал(а):

$word = iconv('WINDOWS-1251', 'UTF-8', stripslashes($_POST['word']));

Ну и

$res = mysql_query("SELECT `word`, `translation` FROM `tuvrus` WHERE `word` = '".mysql_real_escape_string($word)."'", $db);

Спустя 12 минут, 12 секунд (16.09.2011 - 19:44) ne_umeu написал(а):
Цитата (alex12060 @ 16.09.2011 - 16:32)

$word = iconv('WINDOWS-1251', 'UTF-8', stripslashes($_POST['word']));

Ну и

$res = mysql_query("SELECT `word`, `translation` FROM `tuvrus` WHERE `word` = '".mysql_real_escape_string($word)."'", $db);

Вставил. Все равно не ищет.

Спустя 40 минут, 16 секунд (16.09.2011 - 20:25) inpost написал(а):
ne_umeu
cлово внутри длинной строки, или полное совпадение записи со словом, которое ищешь?
Почему весь сайт не перевести на нужную тебе кодировку?

Спустя 1 час, 24 минуты, 1 секунда (16.09.2011 - 21:49) rooor написал(а):
Цитата (ne_umeu @ 16.09.2011 - 16:25)
НЕ ищет слова со спецсимволами типа таких: аажы-чаңныг, аадаң.

Может стОит обратотать htmlcpecialchars'ом?

Спустя 15 минут, 19 секунд (16.09.2011 - 22:04) ne_umeu написал(а):
Цитата (inpost @ 16.09.2011 - 17:25)
ne_umeu
cлово внутри длинной строки, или полное совпадение записи со словом, которое ищешь?
Почему весь сайт не перевести на нужную тебе кодировку?

Ищу полное сопвадение. Всё в кодировке utf-8.

Если гора не идет к Магомету...
В общем перезалил базу. Все спецсимволы заменил. Например слово "аадаң" теперь выглядит как "аадан^".
Добавил в самое начало скрипта:
$word=str_replace("ң","н^", $_POST['word']);

Набираю в форме "аадаң" и... ничего.
Что не так?

Спустя 3 минуты, 25 секунд (16.09.2011 - 22:07) Игорь_Vasinsky написал(а):
а почему бы не сделать вывод $_POST['word'] - на странице с результатом поиска, и так же посмотреть весь запрос в БД через echo???

Спустя 30 минут (16.09.2011 - 22:37) ne_umeu написал(а):
Эврика! Всё оказалось донельзя просто.
Пришлось снова перезалить БД. Только на этот раз символы хранятся в таком формате "аадаң" -> "аада#1187;".
Спасибо rooor'у. Его подсказка повела по правильному пути.

Еще можно маленький дилетантский вопрос. Результат поиска отображается в кодировке utf-8, т. е. браузер (IE) выдает что-то типа: нрав, РЅРћСЂРѕРІ, С…
Что нужно прописать, чтобы сразу перекодировалось в нормальный вид?

Спустя 1 минута, 27 секунд (16.09.2011 - 22:39) Игорь_Vasinsky написал(а):
вывод проводи через iconv()

Спустя 23 секунды (16.09.2011 - 22:39) Winston написал(а):
В самом начале файла
header('Content-Type: text/html; charsetutf-8');

Спустя 1 минута (16.09.2011 - 22:40) Игорь_Vasinsky написал(а):
у него же сайт вроде в анси ohmy.gif

Спустя 18 минут, 26 секунд (16.09.2011 - 22:59) ne_umeu написал(а):
Вариант с header'ом не получился, проэтому вывел через iconv().
Если вдруг кому интересно окончательный рабочий скрипт таков:

<?php
$word = iconv('WINDOWS-1251', 'UTF-8', stripslashes($_POST['word']));
$db=mysql_connect("localhost","root","");
mysql_select_db("voc",$db);
mysql_query("set names 'utf8'");
$res = mysql_query("SELECT word, translation FROM base WHERE word='".mysql_real_escape_string($word)."'", $db);
$data= mysql_fetch_assoc($res);

if ($data['word']==$word) {
echo iconv('UTF-8','WINDOWS-1251', $data['word']);
?><br><?
echo iconv('UTF-8','WINDOWS-1251', $data['translation']);
}
else
echo "Такое слово отсутствует";

?>


Спасибо всем за то, что вы есть! =)

Спустя 5 минут, 16 секунд (16.09.2011 - 23:04) Игорь_Vasinsky написал(а):
Я бы перестраховался на случай отсутствия POST

Цитата
$word = iconv('WINDOWS-1251', 'UTF-8', stripslashes($_POST['word']));


$word = (!empty(trim($_POST['word'])) OR !isset($_POST['word'])) ? iconv('WINDOWS-1251', 'UTF-8', stripslashes($_POST['word'])) : null;



а дальнейший код запустил бы если нажата кнопа submit или при наличии не пустой переменной $word

if(isset($_POST['имя submit']))
{
//working
}


if(isset($word) AND !empty($word))
{
//working
}

Спустя 12 минут, 59 секунд (16.09.2011 - 23:17) ne_umeu написал(а):
Точно. Я и забыл про это. Спасибо за совет.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.