[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ошибка mysql_real_escape_string
Karpo
Здравствуйте.Такая проблема.При использовании функции mysql_real_escape_string() скрипт аварийно завершает работу,т.е. запускается отладчик.По закрытии отладчика на странице появляется надпись Невозможно отобразить веб страницу.Без функции всё работает нормально.Вот скрипт
<?php

if(isset($_POST['login']))
{
include "bdconnect.php";
$sql="SELECT * FROM users WHERE login=".$_POST['login'] ;


echo "ghbdtn";
$result = mysql_query($sql,$dbcnx) ;
$pravda=TRUE;
$pat="![А-Я][а-я]+!";

if($result)
{
echo "Этот ник уже занят.Пожалуйста выберите другой";
$pravda=FALSE;
}
if(!preg_match($pat,$_POST['name']))
{
echo "Проверьте правильность заполнения поля <font id=\"redko\">Имя</font>.Ведены недопустимые символы";
$pravda=FALSE;
}
if(!preg_match($pat,$_POST['family']))
{
echo "Проверьте правильность заполнения поля <font id=\"redko\">Фамилия</font>.Ведены недопустимые символы";
$pravda=FALSE;
}
if(!preg_match($pat,$_POST['father']))
{
echo "Проверьте правильность заполнения поля <font id=\"redko\">Отчество</font>.Ведены недопустимые символы";
$pravda=FALSE;
}
$pat="#^[a-z0-9]{1}[a-z0-9_.-]{1,15}$#i";
if(!preg_match($pat,$_POST['login']))
{
echo "Проверьте правильность заполнения поля <font id=\"redko\">Ник</font>.Ведены недопустимые символы";
$pravda=FALSE;
}
$pat="#^[^а-яё]{6,}$#i";
if(!preg_match($pat,$_POST['password']))
{
echo "Проверьте правильность заполнения поля <font id=\"redko\">Пароль</font>.Ведены недопустимые символы либо пароль слишком короткий.Пароль должен иметь длину не менее 6 символов";
$pravda=FALSE;
}
$pat="!\d{2,2}\.\d{2,2}\.\d{4,4}!";
if(!preg_match($pat,$_POST['born']))
{
echo "Проверьте правильность заполнения поля <font id=\"redko\">Дата рождения</font>.Рассмотрите внимательнее образец";
$pravda=FALSE;
}
$pat="!^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$!";
if(!preg_match($pat,$_POST['e-mail']))
{
echo "Проверьте правильность заполнения поля <font id=\"redko\">E-mail</font>.Введённый e-mail не существует.";
$pravda=FALSE;
}
if($_POST['password']!=$_POST['repassword'])
{
echo "Введённые пароли не совпадают.Повторите ввод!";
$pravda=FALSE;
}
if($pravda)
{
$sql="INSERT INTO `users` (`login`,`password`,`name`,`family`,`father`,`born`,`e-mail`)
VALUES ('"
.$_POST['login']."','".$_POST['password']."','".$_POST['name']."','".$_POST['family']."','".$_POST['father']."','".$_POST['born']."','".$_POST['e-mail']."')";
$sql=mysql_real_escape_string($sql);


$result = mysql_query($sql,$dbcnx) or die( mysql_error() );
echo $sql;
if(!$result)
echo "Неизвестная ошибка.Свяжитесь с администрацией сайта";
else
echo "Регистрация прошла успешно";
}
}

?>




Спустя 3 минуты, 20 секунд (18.09.2010 - 01:28) twin написал(а):
Эк как ты хотел одним махом отделаться. biggrin.gif
Функция эта обрабатывает данные по очереди, а не весь текст запроса.

Спустя 3 часа, 48 минут, 52 секунды (18.09.2010 - 05:17) Ice написал(а):
переменная $pravda улыбнула smile.gif
"Где правда, брат?"(с) biggrin.gif Можно было бы с необычайной легкостью собрать ошибки и без нее.

по сабжу Твин уже отпостил, ну а мы пройдемся по регвырам, хотя нет,.. сперва потопчемся около них:

$pat="![А-Я][а-я]+!";
...
...
...

if(!preg_match($pat,$_POST['name']))
{
...
}

Этот кусок предполагает, что имя пользователя должно быть введено с большой буквы. не было бы более дружелюбным для пользователя пользовать вместо этой констры функцию ucfirst(), которая сама бы...?
То же самое и с фамилией, которая, кстати говоря, на буржуйском звучит, как surname, и с отчеством (patronymic).

А теперь регвыры:
  • #^[a-z0-9]{1}[a-z0-9_.-]{1,15}$#i - как этот паттерн можно было бы записать более правильно? Ответ:#^[a-z0-9][a-z0-9_.-]{1,15}$#i
  • #^[^а-яё]{6,}$#i - поле бесконечной длины... Опасненько, а еще более опасно то, что потом переменная, проверяемая при помощи этого паттерна вставляется в БД нехешированной.
  • !\d{2,2}\.\d{2,2}\.\d{4,4}! - поменялся ограничитель паттерна. Да и ладно, наверное, это был уже следующий день, другое настроение, все дела...smile.gif Как можно переписать данный паттерн более доступно? Ответ: !(?:\d{2}\.){2}\d{4}!
  • !^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$! - этот паттерн, паттерн проверки мыла, очень далек от RFC5322. И как же быть тем, у кого ящик на домене coop, info, travel, museum..?

Я кончил biggrin.gif

Спустя 1 час, 36 минут, 22 секунды (18.09.2010 - 06:53) twin написал(а):
Цитата
не было бы более дружелюбным для пользователя пользовать вместо этой констры функцию ucfirst(), которая сама бы...?

Добавлю. С логином нельзя делать ни того ни другого ни в коем случае.
Вот посмотри на мой ник. Он не просто так с маленькой буквы. Я не хочу, чтобы это было именем нарицательным, у меня есть имя. А это так, пропуск на форум.
А тут меня принуждают, или, что совсем недопустимо, делают это за меня.

Спустя 8 часов, 26 минут, 4 секунды (18.09.2010 - 15:19) Karpo написал(а):
Всем спасибо за замечания,всё исправлю.Получается,каждую переменную нужно отдельно пропускать через mysql_real_escape_string.

Спустя 14 минут, 18 секунд (18.09.2010 - 15:34) Michael написал(а):
Цитата (Karpo @ 18.09.2010 - 14:19)
Всем спасибо за замечания,всё исправлю.Получается,каждую переменную нужно отдельно пропускать через mysql_real_escape_string.

Если это вопрос, то уточню - не все, а те которые строкового типа.

Спустя 1 день, 5 часов, 23 минуты, 31 секунда (19.09.2010 - 20:57) Karpo написал(а):
Почему-то и такая конструкция не действует.
$sql="INSERT INTO `phpsite`.`users` (`login`, `password`, `name`, `family`, `father`, `born`, `e-mail`) 
VALUES ("
.mysql_real_escape_string($_POST['login']).",".
mysql_real_escape_string($_POST['password']).",".
mysql_real_escape_string($_POST['name']).",".
mysql_real_escape_string($_POST['family']).",".
mysql_real_escape_string($_POST['father']).",".
mysql_real_escape_string($_POST['born']).",".
mysql_real_escape_string($_POST['e-mail']).")";

Использование функции mysql_real_escape_string() приводит к вызову обработчика sad.gif

Спустя 7 минут, 40 секунд (19.09.2010 - 21:05) twin написал(а):
А апострофы где?

Спустя 2 минуты, 29 секунд (19.09.2010 - 21:07) Админ написал(а):
чё то тут с синтаксисом полный фарш - никогда такого не видел

Спустя 2 часа, 16 минут, 10 секунд (19.09.2010 - 23:23) Basili4 написал(а):
Цитата (Админ @ 19.09.2010 - 22:07)
чё то тут с синтаксисом полный фарш - никогда такого не видел

ага за неделю изучения пыхапе ты кода насмотрелся smile.gif

По сабжу
и вот это делают обычно как то так

if(!preg_match($pat,$_POST['family']))
{
$error[]= "Проверьте правильность заполнения поля <font id=\"redko\">Фамилия</font>.Ведены недопустимые символы";
}
.....

if (!empty($error)){Выводим ошибки}
но это не критично можно и так оставить

так просто строчек меньше.

Спустя 1 час, 34 минуты, 13 секунд (20.09.2010 - 00:58) Karpo написал(а):
Забыл про апострофы,но с ними mysql_real_escape_string тоже не работает.
Такой код работает
$sql="INSERT INTO `phpsite`.`users` (`login`, `password`, `name`, `family`, `father`, `born`, `e-mail`) 
VALUES ('"
.$_POST['login']."','".
$_POST['password']."','".
$_POST['name']."','".
$_POST['family']."','".
$_POST['father']."','".
$_POST['born']."','".
$_POST['e-mail']."')";

А такой почему-то нет
$sql="INSERT INTO `phpsite`.`users` (`login`, `password`, `name`, `family`, `father`, `born`, `e-mail`) 
VALUES ('"
.mysql_real_escape_string($_POST['login'])."','".
mysql_real_escape_string($_POST['password'])."','".
mysql_real_escape_string($_POST['name'])."','".
mysql_real_escape_string($_POST['family'])."','".
mysql_real_escape_string($_POST['father'])."','".
mysql_real_escape_string($_POST['born'])."','".
mysql_real_escape_string($_POST['e-mail'])."')";

Спустя 6 минут, 5 секунд (20.09.2010 - 01:04) Ice написал(а):
ну, а пишет-то чего?

Спустя 25 минут, 9 секунд (20.09.2010 - 01:29) Karpo написал(а):
Ничего не пишет,скрипт аварийно завершает работу и запускается отладчик от Visual Studio

Спустя 10 минут, 57 секунд (20.09.2010 - 01:40) Ice написал(а):
Никогда не работал с РНР в этом редакторе, только с Сями. А отладчик тоже ничего не пишет?

Спустя 7 минут, 41 секунда (20.09.2010 - 01:47) Админ написал(а):
странно как-то всё вроде идентично - возможно что-то с конфигурацией

Спустя 6 часов, 13 минут, 34 секунды (20.09.2010 - 08:01) twin написал(а):
Цитата
Ничего не пишет,скрипт аварийно завершает работу и запускается отладчик от Visual Studio

А просто без этого наварота, на сервере проверял? Браузером?

Спустя 7 часов, 9 минут, 7 секунд (20.09.2010 - 15:10) Karpo написал(а):
Этот отладчик вообще не при кухне.я в нём проги по C++ для универа пишу.Он запускается как отладчик по умолчанию.Если б Visual установлен не был,была бы просто ошибка.
Цитата
А просто без этого наварота, на сервере проверял? Браузером?

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

Спустя 1 час, 3 минуты, 16 секунд (20.09.2010 - 16:13) twin написал(а):
Так я не понял, ошибка есть или нет? В браузере. Не в отладчике, который тут вообще не при делах.

Спустя 3 часа, 52 минуты, 52 секунды (20.09.2010 - 20:06) Karpo написал(а):
отправляю форму регистрации и в браузере появляется пустая белая страница,браузер думает,запускается отладчик.Закрываю отладчик и браузер выдаёт : Веб-страница недоступна.

Спустя 17 часов, 36 минут, 25 секунд (21.09.2010 - 13:43) Karpo написал(а):
sad.gif

Спустя 9 минут, 7 секунд (21.09.2010 - 13:52) twin написал(а):
Ты делаешь какую то ересь. И ждешь совета... Какой нахрен еще отладчик.

Спустя 55 минут, 58 секунд (21.09.2010 - 14:48) Ice написал(а):
Дебаггир biggrin.gif

Спустя 1 день, 11 часов, 1 минута, 36 секунд (23.09.2010 - 01:49) Karpo написал(а):
Понятно

Спустя 20 часов, 44 минуты, 48 секунд (23.09.2010 - 22:34) Karpo написал(а):
Так и не разобрался.Подозреваю,что что-то с кодировкой.Использую UTF-8.Наверно функция использует не ту кодировку, в которой записана строка.Не работает даже такой код:


$opa="Вот так вот";
$opa=mysql_real_escape_string($opa);


неделю уже медитирую sad.gif

Спустя 1 день, 2 часа, 16 минут, 9 секунд (25.09.2010 - 00:50) Karpo написал(а):
Проблема решена.Удалил mysql,хорошенько почистил комп (обнаружил файлы двух ранее установленных баз).Установил свежий мускул и всё заработало.Ура!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.