Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Кодировка в sql-запросах  (Прочитано 37164 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« : 10-04-2010 18:41 » 

Для скрипта проверки формы "на лету" написал скрипт, но есть косяк: если в поле написано латиницей, то всё хорошо, если же кириллицей, то в любом случае скрипт говорит, что ник свободен.
Мой запрос выглядит так:
Код:
$this->mMysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
$query = $this->mMysqli->query('SELECT nik FROM users WHERE nik="'.$value.'"');
if ($this->mMysqli->affected_rows > 0)
{
$answer = 'Этот ник уже занят.';
return $answer;
}
В интернете видел пример, там после подключения сразу написали:
Код:
$mMysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD,DB_DATABASE);
[b]$mMysqli->query("SET CHARACTER SET cp1251");[/b]
Но мне эта строчка не очень то помогла. Как быть?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 10-04-2010 18:48 » 

а в базе как хранятся?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-04-2010 18:49 » 

cp1251_general_ci
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 10-04-2010 19:08 » 

А чем доказать можешь?

Покажи

SELECT nik FROM users WHERE

и

$value в одинаковой кодировке



С другой стороны, если ты используешь аякс, то возможны проблемы
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 11-04-2010 09:37 » 

Лучше начать с

Код:
SHOW CREATE TABLE users;

Там и кодировку таблицы и столбца можно увидеть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 11-04-2010 09:44 » 

Что-то я вообще не понял что мне делать?  Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 11-04-2010 10:03 » 

Начни с этого: https://forum.shelek.ru/index.php/topic,24042.msg231892.html#msg231892
Покажи результат.



Цитата
Код:
SET CHARACTER SET cp1251

Неверно! Делай так:

Код:
SET NAMES cp1251;
« Последнее редактирование: 11-04-2010 10:04 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-04-2010 16:44 » new

Я просто не пойму, вот это:
Код:
SET CHARACTER SET cp1251
Куда писать? Можете показать как полностью запрос должен выглядеть?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 11-04-2010 18:23 » 

Барин, читай тщательнее!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 11-04-2010 18:47 » 

Да вроде внимательно читал. Может я совсем замотался и туплю, но я что-то не догоняю. Ссылка, которая выше указана, ведёт  на эту же страницу. Можно так ещё раз от начала и до конца?  Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 12-04-2010 03:30 » 

Барин, да-да - еще много-много раз, до полного просветления мозгов.

Зачем тебе давать советы, если ты их не видишь?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 12-04-2010 13:23 » 

Я объясняю ситуацию! По той паре строк нихрена не понятно! Просто прошу привести полный пример, а не одну строку в которой написано: SET CHARACTER SET cp1251. Что это, куда, к чему вообще? Под целым примером я подразумеваю: допустим: строка с подключением к бд, затем допустим строки с установкой кодировки, сам запрос. В таком духе короче. Потому что я пробовал вписывать "SET CHARACTER SET cp1251" в разном порядке: до создания подключения к базе, после, перед запросом и так далее. И ничего не вышло.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 12-04-2010 14:55 » 

Cперва выполни приведенные ниже запросы и покажи здесь результаты, а потом будем обсуждать.

Код:
SHOW CREATE TABLE твоя_таблица;

Код:
SHOW VARIABLES LIKE ' character\_set\_%';
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 12-04-2010 19:01 » 

Я наверное плохо умею объяснять. Так как я так и не понял, я написал такую вещь:
Код:
<?php
$db 
mysql_connect ("localhost","story","password");
mysql_select_db ("story",$db); 
$result mysql_query("SHOW CREATE TABLE users");
$myrow mysql_fetch_array($result);
echo 
$myrow[0];
?>

На страницу выводится слово "users".  Я не знаю что там должно было появиться. Так что если не трудно, напиши мне пример в таком же подробном формате как у меня. Вторую строчку вообще не понял куда писать.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 12-04-2010 19:09 » 

а сделать
Код:
echo $myrow[1];
религия не позволяет?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 12-04-2010 19:44 » 

Я просто не в курсе был, что надо 1 ставить, а не 0. Обычно в таких случаях информация хранится в нулевом элементе массива. С единицей вот что выдаёт:
CREATE TABLE `users` ( `id` int(4) NOT NULL auto_increment, `nik` varchar(30) default NULL, `password` varchar(15) NOT NULL, `name` varchar(20) NOT NULL, `family` varchar(20) NOT NULL, `date_rozd` varchar(12) NOT NULL, `city` varchar(25) NOT NULL, `icq` int(9) NOT NULL, `skype` varchar(50) NOT NULL, `msn` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `url` varchar(50) NOT NULL, `photo` varchar(255) default 'img/standart_avatar.png', `active` int(1) NOT NULL, `date_reg` varchar(12) NOT NULL, `date_last` varchar(12) NOT NULL, `status` varchar(10) NOT NULL, `timestamp` int(12) default '0', `mess_col` int(4) NOT NULL, `story_col` int(2) NOT NULL, `img_col` int(3) NOT NULL, `rep` int(3) NOT NULL, `read_story` int(3) NOT NULL, `author_col` int(3) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 12-04-2010 19:51 » 

Барин, скажи, ты в этой каше что-нибудь понял бы?

У тебя консольный доступ есть? Если есть, запускай там:

Код:
mysql -u твой_логин -p -h хост_mysql

Вот там и выполняй команды.
Когда постишь на форум код или что-то еще форматированное, оборачивай его тегами [code] [/code]

Вопрос вдогонку: какая кодировка используется на странице?
« Последнее редактирование: 12-04-2010 19:55 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 12-04-2010 20:13 » 

 С кодом я что-то не подумал в этот раз. На странице используется windows-1251. На счёт консольного режима я не знаю. У меня сервак Апач. Я пользуюсь только 3-мя ссылками: Start Denwer, Stop Denver, Restart Denver. Улыбаюсь Где там ещё какие функции я не знаю. Если конечно ты расскажешь по подробнее как это, что и как туда зайти, то можно попробывать то, что ты написал.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 12-04-2010 20:17 » 

win+r
cmd
cd Z:\usr\local\mysql-5.1\bin\
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 12-04-2010 20:48 » 

Выполнил то что было написано в последнем сообщении.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 12-04-2010 20:56 » 

И что видишь?

Читаем еще раз:
https://forum.shelek.ru/index.php/topic,24042.msg232070.html#msg232070

Команды тут:
https://forum.shelek.ru/index.php/topic,24042.msg232058.html#msg232058
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 12-04-2010 21:04 » 

Ввёл:
mysql -u story -p -h localhost_mysql
Мне вывелось:
mysql: Character set 'cp1251' is not a compiled character set and is not specifi
ed in the '\usr\local\mysql5\share\charsets\Index.xml' file
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 13-04-2010 03:14 » 

Уже хоть что-то.

Какая версия Денвера?

Попробуй такую команду (результат - сюда):
mysqld --version
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 13-04-2010 16:59 » 

mysqld  Ver 5.0.45-community-nt for Win32 on ia32 (MySQL Community Edition (GPL)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 13-04-2010 20:04 » 

Старая - года 4 давности. Сейчас актуальна 5.0.90 - рекомендую обновить либо MySQL отдельно, либо скачать свежий Денвер. Не имеет смысла выделываться и искать глюки (а может и не глюки, а твои ошибки, но тебя порой фиг поймешь), если они давно решены. Сперва обновись, а потом ждем таки вывода этого:
https://forum.shelek.ru/index.php/topic,24042.msg232058.html#msg232058
« Последнее редактирование: 13-04-2010 20:06 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Сергей Добросклонов
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 17-04-2010 08:58 » 

Решил я свою проблему. Всё что надо было - написать такую вещь:
Код:
<?php
// как было объяснено в источнике: ява-скрипт корректно работает только с utf-8
// в этой строке указано, что значение в windows-1251, но для обработчика перекодировать в utf-8
$value iconv(&#39;utf-8&#39;, &#39;cp1251&#39;, $value);
// затем выполнить запрос
$query $this->mMysqli->query(&#39;SELECT nik FROM users WHERE nik="&#39;.$value.&#39;" LIMIT 1&#39;);
?>

Сам я конечно не знаю. Может что не так понял, но главное что это работает!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 17-04-2010 09:03 » 

Барин, вот в том то и дело, что ничего не понял. Следовательно, ценность опыта нулевая... Жаль
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 17-04-2010 09:08 » 

RXL, ну почему же, понятно...
ajax'ом отправляет запрос на сервер, а он (аякс) работает с utf-8
в базе данные хранятся в cp1251
требуется перекодировка входных данных.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 17-04-2010 09:09 » 

а вот это - бред
SELECT nik FROM users WHERE nik="'.$value.'" LIMIT 1

nik должен быть уникальным в таблице
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 17-04-2010 09:15 » 

И не только - обязательно делать mysql_escape_string() - иначе это цель для SQL-injections.

Слав, это не очевидно. По хорошему, надо анализировать заголовки на предмет установления кодировки запроса.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines