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

Форум MySQL

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

 

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

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

тема: Текст на русском вводится в базу данных не полностью
 
 автор: ruslanaxti   (11.02.2011 в 19:24)   письмо автору
 
 

При выполнении команды INSERT текст на английском из форм вводится в базу полностью. На русском только по первой букве в каждый столбец. Кадировка таблицы utf8, в конфиг файле по умолчанию тоже utf8. Вот только из списка <select></select> на русском вводится нормально.
Прошу кто знает мне помочь

  Ответить  
 
 автор: Trianon   (11.02.2011 в 20:08)   письмо автору
 
   для: ruslanaxti   (11.02.2011 в 19:24)
 

Какая кодировка у файлов скриптов?
Выполняется ли оператор SET NAMES 'utf8' ; ?

  Ответить  
 
 автор: ruslanaxti   (11.02.2011 в 21:32)   письмо автору
 
   для: Trianon   (11.02.2011 в 20:08)
 

файл скрипта в utf8. После SET NAME идет функция mysql_error() ошибок не выдает

  Ответить  
 
 автор: Trianon   (11.02.2011 в 21:54)   письмо автору
 
   для: ruslanaxti   (11.02.2011 в 21:32)
 

Запрос
SHOW CREATE TABLE ИмяТаблицы

что выдает?

  Ответить  
 
 автор: ruslanaxti   (11.02.2011 в 23:48)   письмо автору
 
   для: Trianon   (11.02.2011 в 21:54)
 

Table - user

Create Table -
435245415445205441424c4520607573657 26020280a20206069646020696e74283529 204e4f54204e554c4c206175746f5f2e2e2 e

  Ответить  
 
 автор: Trianon   (11.02.2011 в 23:50)   письмо автору
 
   для: ruslanaxti   (11.02.2011 в 23:48)
 

нет. 2e2e2e не устраивавет.
Показывайте весь отклик, и лучше бы в виде текста, а не в виде шестнадцатеричной шифровки.

  Ответить  
 
 автор: ruslanaxti   (11.02.2011 в 23:52)   письмо автору
 
   для: ruslanaxti   (11.02.2011 в 23:48)
 

это код скрипта


<?php

// Регистрация

if(isset($_POST['sendregist'])) {
if(
empty($_POST['name']) ||
empty($_POST['family']) ||
empty($_POST['pol']) ||
empty($_POST['live_city']) ||
empty($_POST['login']) ||
empty($_POST['password']) ||
empty($_POST['password2'])){

echo "Заполните все поля";
}
else{


// Проверка на регулярные выражения

if(preg_match("/[а-яa-z]/i",$_POST['name']) ||
preg_match("/[а-яa-z]/i",$_POST['family']) ||
preg_match("/[а-я]/i",$_POST['pol']) ||
preg_match("/[a-zа-я\\._ -]/i",$_POST['live_city']) ||
preg_match("/[0-9a-z\\._ -]/i",$_POST['login']) ||
preg_match("/[0-9a-zA-Z\\. -]/",$_POST['password']) ||
preg_match("/[0-9a-zA-Z\\. -]/",$_POST['password2']))

{

if($password===$password2){


// Форматирование введеных полей

$name=ucfirst(strtolower(trim($_POST['name'])));
$family=ucfirst(strtolower(trim($_POST['family'])));
$pol=trim($_POST['pol']);
$live_city=ucfirst(strtolower(trim($_POST['live_city'])));
$login=strtolower(trim($_POST['login']));
$password=trim($_POST['password']);
$password2=trim($_POST['password2']);


// Функция экранирования переменных
function quote_smart($value)
{
// если magic_quotes_gpc включена - используем stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}


$connect=mysql_connect('localhost','root','2132');

if (!$connect) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}


if (mysql_select_db("mycms")){
}
else{
echo "Unable to select table: " . mysql_error();
exit;
}

// Составляем безопасный запрос
// $query_insert="INSERT INTO user (name,family,pol,live_city,login,passw) VALUES
// ('$name','$family','$pol','$live_city','$login','$password')";

$query_insert = sprintf("INSERT INTO user (login,passw,name,family,pol,live_city) VALUES (%s,%s,%s,%s,%s,%s)",
quote_smart($login),
quote_smart($password),
quote_smart($name),
quote_smart($family),
quote_smart($pol),
quote_smart($live_city));


$row=mysql_query($query_insert);


if (!$row) {
echo "Could not successfully run query (".$row.") from DB: " . mysql_error();


// закрываем соединение

mysql_close($connect);

exit;
}

} else { echo "Пароли не совпадают";}

} else { echo "Введены недопустимые символы"; }


}}

?>

  Ответить  
 
 автор: ruslanaxti   (11.02.2011 в 23:54)   письмо автору
 
   для: ruslanaxti   (11.02.2011 в 23:52)
 

это запрос создания таблицы


Создание базы данных
CREATE DATABASE `MyCMS` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Создание таблицы users
CREATE TABLE `MyCMS`.`user` (
`id` INT( 5 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`login` VARCHAR( 20 ) NOT NULL ,
`passw` VARCHAR( 30 ) NOT NULL ,
`name` VARCHAR( 20 ) NOT NULL ,
`family` VARCHAR( 20 ) NOT NULL ,
`pol` VARCHAR( 7 ) NOT NULL ,
`live_citi` VARCHAR( 20 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

  Ответить  
 
 автор: Trianon   (11.02.2011 в 23:56)   письмо автору
 
   для: ruslanaxti   (11.02.2011 в 23:52)
 

Вы сказали, что выполняете запрос SET NAMES utf8
В этом коде его нет.
Где правда?

  Ответить  
 
 автор: ruslanaxti   (12.02.2011 в 00:03)   письмо автору
 
   для: Trianon   (11.02.2011 в 23:56)
 

Ой! я только что перед вставкой этого кода сюда его убрал за непригодность

  Ответить  
 
 автор: ruslanaxti   (12.02.2011 в 00:06)   письмо автору
 
   для: ruslanaxti   (12.02.2011 в 00:03)
 

он был вот так, после

$connect=mysql_connect('localhost','root','2132');

if (!$connect) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}

здесь еще было

else {
mysql_query('SET character_set_database = utf8');
mysql_query('SET NAMES utf8');
}

  Ответить  
 
 автор: Trianon   (12.02.2011 в 00:15)   письмо автору
 
   для: ruslanaxti   (12.02.2011 в 00:03)
 

в каком смысле - непригодность?
без этого запроса у Вас на 98% ничего хорошего не выйдет.

  Ответить  
 
 автор: ruslanaxti   (12.02.2011 в 00:23)   письмо автору
 
   для: Trianon   (12.02.2011 в 00:15)
 

Просто я пробовал с ним (все время) и без него, все одинаково, данные не вставляются. Искал в инете, везде пишут что если база данных создана в utf8 и в конфиг фаиле установлено utf8 все должно работать и SET NAME не нужен будит. Но его поставлю опять пусть там будит.

  Ответить  
 
 автор: Trianon   (12.02.2011 в 00:46)   письмо автору
 
   для: ruslanaxti   (12.02.2011 в 00:23)
 

>Просто я пробовал с ним (все время) и без него, все одинаково, данные не вставляются.
>Искал в инете, везде пишут что

Вы явно прочли что-то не то.

>если база данных создана в utf8

Кодировка БД имеет слабое прямое влияние на ситуацию.
Куда важнее, в какой кодировке созданы таблицы, и даже их поля.
Хотя при прочих равных таблицы и наследуют кодировку БД.

>и в конфиг фаиле установлено utf8
В конфигурационном файле куча различных опций.
Сказать в конфиге установлено utf8 - все равно что ничего не сказать.

>все должно работать и SET NAME не нужен будит.

А вот такое бывает, но крайне редко.
И насколько мне известно - никогда не бывает, если коннект выполняется через учетную запись root - как у Вас.

  Ответить  
 
 автор: ruslanaxti   (13.02.2011 в 17:55)   письмо автору
 
   для: Trianon   (12.02.2011 в 00:46)
 

Разобрался с ситуацией. Оказалось из за функции strtolower. В коде есть строка $name=ucfirst(strtolower(trim($_POST['name']))), которая удаляет пробелы из формы, переводит данные в нижний регистр и переводит первую букву слова в верхний регистр. Вот функция strtolower преобразует русские буквы в квадратики и в базу они не заносятся, а применяя функцию ucfirst первая буква принимает нормальный вид.

Вот такие чудеса творятся!

Но теперь другой вопрос. Как иначе перевести весь текст в нижний регистр?

  Ответить  
 
 автор: Trianon   (13.02.2011 в 19:01)   письмо автору
 
   для: ruslanaxti   (13.02.2011 в 17:55)
 

>...В коде есть строка $name=ucfirst(strtolower(trim($_POST['name']))), ...

В приведеном коде не было этой строки.



Касательно преобразовагий строковых в utf-8 - имеет смысл поглядеть
php.net/mbstring

  Ответить  
 
 автор: ruslanaxti   (13.02.2011 в 19:39)   письмо автору
 
   для: Trianon   (13.02.2011 в 19:01)
 

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

  Ответить  
 
 автор: Trianon   (13.02.2011 в 19:44)   письмо автору
 
   для: ruslanaxti   (13.02.2011 в 19:39)
 

да. Но где эта строка и где добавление в таблицу...


Так или иначе большинство обычных строковых функций корректно работать со строками в кодировке utf-8 не будут, поскольку она многобайтовая.
mb_..-аналоги для этих функций разработаны как раз для этих целей.

  Ответить  
 
 автор: ruslanaxti   (13.02.2011 в 20:02)   письмо автору
 
   для: Trianon   (13.02.2011 в 19:44)
 

mb_strtolower помогла, теперь данные корректно вставляются. Вам огромное спасибо.
Но не хочу показаться чайником, теперь функция ucfirst не действует, а среди mb_.. аналогов найти не могу

  Ответить  
 
 автор: Trianon   (13.02.2011 в 20:39)   письмо автору
 
   для: ruslanaxti   (13.02.2011 в 20:02)
 

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

  Ответить  
Rambler's Top100
вверх

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