|
|
|
| При выполнении команды INSERT текст на английском из форм вводится в базу полностью. На русском только по первой букве в каждый столбец. Кадировка таблицы utf8, в конфиг файле по умолчанию тоже utf8. Вот только из списка <select></select> на русском вводится нормально.
Прошу кто знает мне помочь | |
|
|
|
|
|
|
|
для: ruslanaxti
(11.02.2011 в 19:24)
| | Какая кодировка у файлов скриптов?
Выполняется ли оператор SET NAMES 'utf8' ; ? | |
|
|
|
|
|
|
|
для: Trianon
(11.02.2011 в 20:08)
| | файл скрипта в utf8. После SET NAME идет функция mysql_error() ошибок не выдает | |
|
|
|
|
|
|
|
для: ruslanaxti
(11.02.2011 в 21:32)
| | Запрос
SHOW CREATE TABLE ИмяТаблицы
|
что выдает? | |
|
|
|
|
|
|
|
для: Trianon
(11.02.2011 в 21:54)
| | Table - user
Create Table -
435245415445205441424c4520607573657 26020280a20206069646020696e74283529 204e4f54204e554c4c206175746f5f2e2e2 e | |
|
|
|
|
|
|
|
для: ruslanaxti
(11.02.2011 в 23:48)
| | нет. 2e2e2e не устраивавет.
Показывайте весь отклик, и лучше бы в виде текста, а не в виде шестнадцатеричной шифровки. | |
|
|
|
|
|
|
|
для: 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: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; | |
|
|
|
|
|
|
|
для: ruslanaxti
(11.02.2011 в 23:52)
| | Вы сказали, что выполняете запрос SET NAMES utf8
В этом коде его нет.
Где правда? | |
|
|
|
|
|
|
|
для: Trianon
(11.02.2011 в 23:56)
| | Ой! я только что перед вставкой этого кода сюда его убрал за непригодность | |
|
|
|
|
|
|
|
для: 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');
} | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.02.2011 в 00:03)
| | в каком смысле - непригодность?
без этого запроса у Вас на 98% ничего хорошего не выйдет. | |
|
|
|
|
|
|
|
для: Trianon
(12.02.2011 в 00:15)
| | Просто я пробовал с ним (все время) и без него, все одинаково, данные не вставляются. Искал в инете, везде пишут что если база данных создана в utf8 и в конфиг фаиле установлено utf8 все должно работать и SET NAME не нужен будит. Но его поставлю опять пусть там будит. | |
|
|
|
|
|
|
|
для: ruslanaxti
(12.02.2011 в 00:23)
| | >Просто я пробовал с ним (все время) и без него, все одинаково, данные не вставляются.
>Искал в инете, везде пишут что
Вы явно прочли что-то не то.
>если база данных создана в utf8
Кодировка БД имеет слабое прямое влияние на ситуацию.
Куда важнее, в какой кодировке созданы таблицы, и даже их поля.
Хотя при прочих равных таблицы и наследуют кодировку БД.
>и в конфиг фаиле установлено utf8
В конфигурационном файле куча различных опций.
Сказать в конфиге установлено utf8 - все равно что ничего не сказать.
>все должно работать и SET NAME не нужен будит.
А вот такое бывает, но крайне редко.
И насколько мне известно - никогда не бывает, если коннект выполняется через учетную запись root - как у Вас. | |
|
|
|
|
|
|
|
для: Trianon
(12.02.2011 в 00:46)
| | Разобрался с ситуацией. Оказалось из за функции strtolower. В коде есть строка $name=ucfirst(strtolower(trim($_POST['name']))), которая удаляет пробелы из формы, переводит данные в нижний регистр и переводит первую букву слова в верхний регистр. Вот функция strtolower преобразует русские буквы в квадратики и в базу они не заносятся, а применяя функцию ucfirst первая буква принимает нормальный вид.
Вот такие чудеса творятся!
Но теперь другой вопрос. Как иначе перевести весь текст в нижний регистр? | |
|
|
|
|
|
|
|
для: ruslanaxti
(13.02.2011 в 17:55)
| | >...В коде есть строка $name=ucfirst(strtolower(trim($_POST['name']))), ...
В приведеном коде не было этой строки.
Касательно преобразовагий строковых в utf-8 - имеет смысл поглядеть
php.net/mbstring | |
|
|
|
|
|
|
|
для: Trianon
(13.02.2011 в 19:01)
| | есть же, после проверки на регулярные выражения сразу под ним | |
|
|
|
|
|
|
|
для: ruslanaxti
(13.02.2011 в 19:39)
| | да. Но где эта строка и где добавление в таблицу...
Так или иначе большинство обычных строковых функций корректно работать со строками в кодировке utf-8 не будут, поскольку она многобайтовая.
mb_..-аналоги для этих функций разработаны как раз для этих целей. | |
|
|
|
|
|
|
|
для: Trianon
(13.02.2011 в 19:44)
| | mb_strtolower помогла, теперь данные корректно вставляются. Вам огромное спасибо.
Но не хочу показаться чайником, теперь функция ucfirst не действует, а среди mb_.. аналогов найти не могу | |
|
|
|
|
|
|
|
для: ruslanaxti
(13.02.2011 в 20:02)
| | Тогда наверное придется отделить от строки первый символ, преобразовать его отдельно, а затем добавить оставшуюся часть. | |
|
|
|