Помогите решить проблему с кодировкой при регистрации

S
На сайте с 02.12.2015
Offline
0
563

Здравствуйте, форумчане. Помогите новичку.

Пытаюсь прикрутить регистрацию на сайт (PHP+MYSQL).

Исходники скачал в Интернете, все сделал по инструкции.

Тестирую. Если ввожу логин латиницей, все работает нормально, приходит письмо с подтверждением регистрации, проходит активация. Если логин ввожу кириллицей, постоянно выдает ошибку - ваш логин должен состоять минимум из 3-х символов.

Подсказали, что проблема с кодировкой. Вставил в исходники <meta charset="UTF-8">, и изменил кодировку (UTF-8 w/o BOM) самих файлов регистрации через notepad++. Помогло, регистрация проходит, активация проходит, но в БД в поле логин заносит кракозябры - Герда..

Пробовал поставить кодировку соединения с БД mysql_query('SET NAMES utf8'); - работает, но тогда на сайте летит вся кодировка. Потому что сайт сделан в win 1251. Пробовал прописать $login = iconv('UTF-8', 'windows-1251', $login); перед занесением в базу (в файле save_user.php). Помогло, заносит логин кириллицей без каракуль, но тогда не проходит активация по email - выдает ошибку.

Уже несколько дней ничего не получается сделать. Я не программист, ПХП знаю только поверхностно. Можете помочь?

reg.php


<html>
<head>
<title>Регистрация</title>
<meta charset="UTF-8">
</head>
<body>
<h2>Регистрация</h2>
<form action="save_user.php" method="post" enctype="multipart/form-data">
<p>
<label>Ваш логин *:<br></label>
<input name="login" type="text" size="15" maxlength="15">
</p>
<p>
<label>Ваш пароль *:<br></label>
<input name="password" type="password" size="15" maxlength="15">
</p>
<p>
<label>Ваш E-mail *:<br></label>
<input name="email" type="text" size="15" maxlength="100">
</p>
<p>
<label>Выберите аватар. Изображение должно быть формата jpg, gif или png:<br></label>
<input type="FILE" name="fupload">
</p>
<p>Введите код с картинки *:<br>

<p><img src="code/my_codegen.php"></p>
<p><input type="text" name="code"></p>
<p>
<input type="submit" name="submit" value="Зарегистрироваться">
</p></form>
Звездочками (*) обозначены поля, обязательные для заполнения.
</body>
</html>

save_user.php


<?php
header('Content-Type: text/html; charset=UTF-8');
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
if (isset($_POST['code'])) { $code = $_POST['code']; if ($code == '') { unset($code);} }
if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
if (empty($login) or empty($password)or empty($code) or empty($email))
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
}
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
{exit ("Неверно введен е-mail!");}


function generate_code()
{

$hours = date("H");
$minuts = substr(date("H"), 0 , 1);
$mouns = date("m");
$year_day = date("z");

$str = $hours . $minuts . $mouns . $year_day;
$str = md5(md5($str));
$str = strrev($str);
$str = substr($str, 3, 6);

$array_mix = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
srand ((float)microtime()*1000000);
shuffle ($array_mix);
return implode("", $array_mix);
}

function chec_code($code)
{
$code = trim($code);

$array_mix = preg_split ('//', generate_code(), -1, PREG_SPLIT_NO_EMPTY);
$m_code = preg_split ('//', $code, -1, PREG_SPLIT_NO_EMPTY);

$result = array_intersect ($array_mix, $m_code);
if (strlen(generate_code())!=strlen($code))
{
return FALSE;
}
if (sizeof($result) == sizeof($array_mix))
{
return TRUE;
}
else
{
return FALSE;
}
}

if (!chec_code($_POST['code']))
{
exit ("Вы ввели неверно код с картинки.");
}

//если логин и пароль введены,то обрабатываем их
$login = stripslashes($login);
$login = htmlspecialchars($login);

$password = stripslashes($password);
$password = htmlspecialchars($password);

//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);


//добавляем проверку на длину логина и пароля
if (strlen($login) < 3 or strlen($login) > 15) {

exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15.");

}
if (strlen($password) < 3 or strlen($password) > 15) {

exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15.");

}

if (empty($_FILES['fupload']['name']))
{

$avatar = "avatars/net-avatara.jpg";
}

else
{

$path_to_90_directory = 'avatars/';


if(preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['fupload']['name']))//проверка формата исходного изображения
{

$filename = $_FILES['fupload']['name'];
$source = $_FILES['fupload']['tmp_name'];
$target = $path_to_90_directory . $filename;
move_uploaded_file($source, $target);

if(preg_match('/[.](GIF)|(gif)$/', $filename)) {
$im = imagecreatefromgif($path_to_90_directory.$filename) ;
}
if(preg_match('/[.](PNG)|(png)$/', $filename)) {
$im = imagecreatefrompng($path_to_90_directory.$filename) ;
}

if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
$im = imagecreatefromjpeg($path_to_90_directory.$filename);
}

//СОЗДАНИЕ КВАДРАТНОГО ИЗОБРАЖЕНИЯ

// Создание квадрата 90x90
// dest - результирующее изображение
// w - ширина изображения
// ratio - коэффициент пропорциональности

$w = 90; // квадратная 90x90.


$w_src = imagesx($im); //вычисляем ширину
$h_src = imagesy($im); //вычисляем высоту изображения

// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w,$w);

// вырезаем квадратную серединку по x, если фото горизонтальное
if ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));

// вырезаем квадратную верхушку по y,
// если фото вертикальное (хотя можно тоже серединку)
if ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));

// квадратная картинка масштабируется без вырезок
if ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);


$date=time(); //вычисляем время в настоящий момент.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");

$avatar = $path_to_90_directory.$date.".jpg";

$delfull = $path_to_90_directory.$filename;
unlink ($delfull);
}
else
{

exit ("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>");

}
}

$password = md5($password);

$password = strrev($password);

$password = $password."b3p6f";


// подключаемся к базе
include ("bd.php");

// проверка на существование пользователя с таким же логином
$result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) {

exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин.");

}

// если такого нет, то сохраняем данные
$result2 = mysql_query ("INSERT INTO users (login,password,avatar,email,date) VALUES('$login','$password','$avatar','$email',NOW())");
// Проверяем, есть ли ошибки
if ($result2=='TRUE')
{

$result3 = mysql_query ("SELECT id FROM users WHERE login='$login'",$db);
$myrow3 = mysql_fetch_array($result3);
$activation = md5($myrow3['id']).md5($login);

$subject = "Подтверждение регистрации";
$message = "Здравствуйте! Спасибо за регистрацию на citename.ru\nВаш логин: ".$login."\n
Перейдите по ссылке, чтобы активировать ваш аккаунт:\nhttp://site/test3/activation.php?login=".$login."&code=".$activation."\nС уважением,\n
Администрация сайта";//содержание сообщение
mail($email, $subject, $message, "Content-type:text/plane; Charset=windows-1251\r\n");

echo "Вам на E-mail выслано письмо с cсылкой, для подтверждения регистрации. Внимание! Ссылка действительна 1 час. <a href='index.php'>Главная страница</a>";
}

else {
exit ("Ошибка! Вы не зарегистрированы.");
}
?>
Gerga
На сайте с 02.08.2015
Offline
94
#1

Sjca, тогда переводите кир логин в лат.

PN
На сайте с 22.08.2012
Offline
103
#2

Вы никак не решите эту проблему, если не переведете весь сайт и БД в utf-8.

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
totamon
На сайте с 12.05.2007
Offline
437
#3

proksey-net, во времена когда не советовали все на utf8 переходить, как то без него обходились...

Sjca, если на utf8 перейти проблематично, все верните обратно и смотрите в какой кодировке POST передается, через .htaccess попробуйте кодировку задать нужную. просто если в неправильной кодировке приходят данные, то нужно искать как ее поправить, а не костыли придумывать

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
PN
На сайте с 22.08.2012
Offline
103
#4
totamon:
proksey-net, во времена когда не советовали все на utf8 переходить, как то без него обходились...
Sjca, если на utf8 перейти проблематично, все верните обратно и смотрите в какой кодировке POST передается, через .htaccess попробуйте кодировку задать нужную. просто если в неправильной кодировке приходят данные, то нужно искать как ее поправить, а не костыли придумывать

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий