Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Русские значения...
 
 автор: 666   (07.08.2006 в 10:42)   письмо автору
 
 

Подскажите, пожалуйста, что нужно сделать, чтобы можно было добавлять значения в базу на русском языке. Пишу следующий запрос:

<?php
    
require_once("config.php");
    if (!
get_magic_quotes_gpc()){ 
                    
$_POST['Login']    = mysql_real_escape_string($_POST['Login']);
        
$_POST['SurName']    = mysql_real_escape_string($_POST['SurName']);
        
$_POST['FirstName']  = mysql_real_escape_string($_POST['FirstName']);
        
$_POST['Patronymic'] = mysql_real_escape_string($_POST['Patronymic']);
    } 

    
$SearchQuery mysql_query("select * from users where Login = ".$_POST['Login'].";");

    if(
mysql_fetch_array($SearchQuery)){
        exit(
"Логин ".$_POST['Login']." уже существует!");
    }else{
        
$InsertQuery "INSERT INTO Users
        (SurName, FirstName, Patronymic, Login)
        VALUES
        ('
$_POST[SurName]','$_POST[FirstName]','$_POST[Patronymic]','$_POST[Login]')";

        if(!
mysql_query($InsertQuery)) exit(mysql_error()); 
        else echo(
"Запись добавлена!");
    }
?>


Выдается следующее сообщение: Data too long for column 'Surname' at row 1
Добавляю значение: Иванов, в базе размерность поля 15 символов. С английскими значениями все добавляется новмально. Подскажите как исправить.

   
 
 автор: cheops   (07.08.2006 в 12:35)   письмо автору
 
   для: 666   (07.08.2006 в 10:42)
 

Добавьте в конфигурационный файл config.php следующую строку, которая настроит кодировку соединения
<?php
 
@mysql_query("SET NAMES 'cp1251'");
?>

   
 
 автор: 666   (07.08.2006 в 16:18)   письмо автору
 
   для: cheops   (07.08.2006 в 12:35)
 

Правильно ли я Вас понял? Вы имели ввиду файл config.php - для установления соединения с базой и выбор БД? Если да, то там у меня уже присутствует эта строка. Содержимое config.php:

<?php
    $dblocation 
"localhost";
    
$dbname "MailBase";
    
$dbuser "root";
    
$dbpasswd "password";

    
$dbcnx = @mysql_connect($dblocation$dbuser$dbpasswd);

    if (!
$dbcnx){
        exit(
"<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>");}

    if(!@
mysql_select_db($dbname$dbcnx)){
        exit(
"<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>");}

    
$query "SELECT VERSION()";
    
$ver mysql_query($query);

    if(!
$ver)
        exit(
"Ошибка при определении версии MySQL-сервера");

    
$version mysql_result($ver0);
    list(
$major$minor) = explode("."$version);

    
$ver $major.".".$minor;
    if((float)
$ver >= 4.1){
        
mysql_query("SET NAMES 'cp1251'");
    }
?>


Кстати, выдает следующую ошибку:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in
D:\Project\RegUser.php on line 15
Data too long for column 'Surname' at row 1

   
 
 автор: cheops   (07.08.2006 в 17:28)   письмо автору
 
   для: 666   (07.08.2006 в 16:18)
 

Поступите проще
<?php 
    $dblocation 
"localhost"
    
$dbname "MailBase"
    
$dbuser "root"
    
$dbpasswd "password"

    
$dbcnx = @mysql_connect($dblocation$dbuser$dbpasswd); 

    if (!
$dbcnx){ 
        exit(
"<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>");} 

    if(!@
mysql_select_db($dbname$dbcnx)){ 
        exit(
"<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>");} 

    @
mysql_query("SET NAMES 'cp1251'"); 
?>

   
 
 автор: 666   (07.08.2006 в 19:19)   письмо автору
 
   для: cheops   (07.08.2006 в 17:28)
 

Последовал Вашему совету - результат тот же - с данными на английском все замечательно, пытаюсь ввести фамилию русскими буквами выдается все та же ошибка:
Data too long for column 'Surname' at row 1

   
 
 автор: cheops   (07.08.2006 в 19:38)   письмо автору
 
   для: 666   (07.08.2006 в 19:19)
 

А структура таблицы Users какая? Какой тип назначен полю Surname и что туда помещается?

   
 
 автор: 666   (07.08.2006 в 19:52)   письмо автору
 
   для: cheops   (07.08.2006 в 19:38)
 

Таблица Users имеет тип InnoDB. Поле Surname - фамилия имеет тип char(15). Вставляю я туда значения из текстового поля, но перед этим удаляю "ненужные" символы следующим образом:

$_POST['SurName']    = mysql_real_escape_string($_POST['SurName']);

   
 
 автор: Trianon   (07.08.2006 в 19:57)   письмо автору
 
   для: 666   (07.08.2006 в 19:52)
 

а в какой кодировке у Вас выводится html-страница с формой?

   
 
 автор: 666   (07.08.2006 в 20:22)   письмо автору
 
   для: Trianon   (07.08.2006 в 19:57)
 

Кодировка windows-1251

   
 
 автор: cheops   (07.08.2006 в 20:44)   письмо автору
 
   для: 666   (07.08.2006 в 19:52)
 

А какой длины вставляемое поле $_POST['SurName']?

   
 
 автор: 666   (07.08.2006 в 21:12)   письмо автору
 
   для: cheops   (07.08.2006 в 20:44)
 

Например подобная ошибка выводится, при дабовлении строки "Иванов".

   
 
 автор: Trianon   (07.08.2006 в 21:21)   письмо автору
 
   для: 666   (07.08.2006 в 21:12)
 

вот при добавлении строки Иванов - что выдает echo strlen($_POST['SurName']); ?

   
 
 автор: 666   (07.08.2006 в 21:38)   письмо автору
 
   для: Trianon   (07.08.2006 в 21:21)
 

При добавлении строки Иванов, echo strlen($_POST['SurName']); выводит на экран строку
Иванов

   
 
 автор: Trianon   (07.08.2006 в 23:27)   письмо автору
 
   для: 666   (07.08.2006 в 21:38)
 

>При добавлении строки Иванов, echo
>strlen($_POST['SurName']); выводит на экран строку
>Иванов

Это уже сюрр... echo strlen(...) должно число напечатать.
В лучшем случае (в однобайтовой кодировке) - 6
В худшем (html-unicode) - 30.

   
 
 автор: 666   (08.08.2006 в 06:39)   письмо автору
 
   для: Trianon   (07.08.2006 в 23:27)
 

Прошу прощения, trianon, вчера поздно это все делал, и что-то с просони напутал...
Конечно же strlen() выдает число - число 6. А строку Иванов выдает $_POST['SurName'].

   
 
 автор: Trianon   (07.08.2006 в 20:55)   письмо автору
 
   для: 666   (07.08.2006 в 19:52)
 

А если поменять вызовы mysql_real_escape_string на mysql_escape_string, картина остается прежней?

   
 
 автор: 666   (07.08.2006 в 21:15)   письмо автору
 
   для: Trianon   (07.08.2006 в 20:55)
 

Абсолютно такой же результат. Уже мозги кипят...

   
 
 автор: !!!Леха   (08.08.2006 в 11:18)   письмо автору
 
   для: 666   (07.08.2006 в 21:15)
 

Попробуй после выбора базы прописать
это чуть длинее чем та сокращенная функция, но должна работать
mysql_query ("set character_set_client='cp1251'");
mysql_query ("set character_set_results='cp1251'");
mysql_query ("set collation_connection='cp1251_general_ci'");

   
 
 автор: 666   (08.08.2006 в 13:12)   письмо автору
 
   для: !!!Леха   (08.08.2006 в 11:18)
 

Блин, народ выручайте, уже не знаю что делать...
!!!Леха, последовал твоему совету - не помогло.
Увеличил размерность поля в базе до 255 - не помогло.
Проверил, может русские буквы конвертируются в вид %xx - тоже вроди бы все нормально. Везде в переменных записано строка Иванов. И че с этим делать понятия не имею... Подскажите кто знает...

   
 
 автор: Trianon   (08.08.2006 в 14:16)   письмо автору
 
   для: 666   (08.08.2006 в 13:12)
 

Вы бы показали дамп структуры таблицы чтоли...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования