PHP & MySQL: теория...

программирование базы данных

Уже устал разбираться с этим вопросом... В общем, пытаюсь защитить запросы к бд, и тут мнения разделяются: одни говорят, что если, например, регистрировать пользователя с логином 1'2'3, то в бд должно быть именно 1'2'3, другие же говорят, что в бд не должно быть кавычек, а должно находиться 1\'2\'3. Кто прав? И как добиться последнего варианта, если он верен? У меня все данные в бд идут через mysql_real_escape_string(), но никаких слешей не добавляется, и при этом я логинюсь под этим пользователем спокойно.

Примечание:
ax64, ну, я то в этом и был уверен, меня просто сбило с толку, что мнения разделились...

Тогда еще такой вопрос... Вот такой вод кодец...

$pid = $_GET['pid'];
$passportdatasearch = mysql_query( "SELECT user_login, user_f, user_i, user_o FROM `users` WHERE `user_ID` = '" . $pid . "' LIMIT 1" );
if( mysql_num_rows( $passportdatasearch ) == 1 )
{
$username = mysql_result($passportdatasearch, $username, user_login);
...
}

если user_login содержит кавычки, то он из базы не достается... пишет:
Warning: mysql_result() [function.mysql-result]: Unable to jump to row 1 on MySQL result index 11 in /home/....../public_html/pass.php on line 7

7-я строчка это:
$username = mysql_result($passportdatasearch, $username, user_login);

То есть, как я понимаю, он встречает кавычку в логине и "спотыкается", как исправить?

Примечание:
Так ведь $pid - это число, оно кавычек не содержит (хотя защитить тоже надо).

Примечание:
>>> в этом случае sql будет искать `user_ID`, соответствующий 1'2'3'
Ненене, что экранировать данные надо, это я знаю, только в данном случае $pid - это число, то есть id юзверя, и ошибка тут не в этом, а именно в той строке, которая задает $username. Там, насколько я понял, надо как-то заэкранировать user_login...

Примечание:
ax64, запрос я изменил:

$pid = $_GET['pid'];
$passportdatasearch = mysql_query( "SELECT user_login, user_f, user_i, user_o FROM `users` WHERE `user_ID` = '" . mysql_real_escape_string($pid) . "' LIMIT 1" );

Тем не менее, ошибка то не в этом сейчас. Из базы достается логин в виде 1'2'3, и, видимо, после 1 натыкается на кавычку и стопорится.

Примечание:
Выводится все правильно:

SELECT user_login, user_f, user_i, user_o FROM `users` WHERE `user_ID` = '22' LIMIT 1

здесь 22 - это id пользователя, НЕ логин. И его экранировать не нужно, хотя защиться экранированием стоит, это я уже сделал. Тут с присвоением проблема:

$username = mysql_result($passportdatasearch, $username, user_login);

Тут user_login = 1'2'3

Примечание:
>> $username = mysql_result($passportdatasearch, $username, 'user_login');

пробовал, аналогично.

Примечание:
$arr = mysql_fetch_assoc($passportdatasearch);
$username = $arr['user_login'];

Вот! Так получилось)
Спасибо огромное за помощь, и простите, что столько времени ушло на решение моей проблемы!)
Ответы:
последний вариант неверен!
в базе должно находится то, что ввёл пользователь и ничего лишнего (хотя, конечно, можно держать уже подготовленные к выдаче в браузер, но это ничего общего с экранированием кавычек не имеет)!
если юзер ввёл 1'2'3, то никаких \' быть не должно, т. к. перед выводом на страницу их придётся ещё и очищать с помощью stripslashes()
mysql_real_escape_string() нужно для того, чтобы не получился запрос вида
...WHERE `name` = '1'2'3'' ...
т. е. функция экранирует слеши и приводит их к виду 1\'2\'3\', но в базу они уже попадают как 1'2'3'
Дополнение #1
$pid = mysql_real_escape_string($_GET['pid']);


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.