Уже раза 4 встречал в книге опечатку, например такое категорически отказалось у меня работать Код (Text): $result = mysql_query("insert into user values ('$usermame', password('$password'), '$email')"); сделал по своему - заработало Код (Text): $query ="INSERT INTO `user` ( `username` , `passwd` , `email`) VALUES ('$username', '$password', '$email')"; $result = mysql_query($query); Ну сейчас не об этом.... дошел до раздела в котором создается форма авторизации пользователя, приведенный код не работает (вернее работает не так как хотелось бы).... может я что-то упустил или в книге не так как должно быть? Файл проверяющий имя и пароль, если они верны регистрирующий переменную сеанса Код (Text): <?php require_once ('bookmark_fns.php'); session_start(); $username=$HTTP_POST_VARS['username']; $passwd=$HTTP_POST_VARS['passwd']; //print_r($_POST); print_r($_SESSION); if ($username && $passwd) { if (login($username, $passwd)) { $HTTP_SESSION_VARS['valid_user'] = $username; } else { do_html_header('Проблема'); echo 'Вход в систему невозможен'; do_html_url('login.php','Вход'); do_html_footer(); exit; } } do_html_header('Домашняя страница'); check_valid_user(); ?> Есть функции во включаемом файле Код (Text): function login($username, $password) { $conn = db_connect(); if(!$conn) return 0; $query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`='$password'"; $result = mysql_query($query); if (!$result) return 0; if (mysql_num_rows($result)>0) return 1; else return 0; } function check_valid_user() { global $valid_user; if (session_is_registered(valid_user)) { echo "Вы вошли как $valid_user"; } else { do_html_header('Проблема'); echo 'Вы не вошли в систему'; do_html_url('login.php','Вход'); do_html_footer(); exit; } } Ну не хочет он у меня выводить echo "Вы вошли как $valid_user"; хотя при проверке пишет, что переменная имеет значенее
а почему session_is_registered, а не isset($_SESSION['valid_user']) ? Кстати, под session_is_registered(valid_user) имеется в виду session_is_registered($valid_user) или session_is_registered('valid_user') ?
разбирал эту книгу, тут $result = mysql_query("insert into user values ('$usermame', password('$password'), '$email')"); нужно было password('".$password."') если не ошибаюсь...
зачем вообще городить password('".$password."') - и что в данном случае значит первое password? не проще сделать как я сделал?
PHP: <?php $usermame = 'nik'; $password = '123'; $email = [email='hg@ghhjg.ru]'hg@ghhjg.ru[/email]'; if ($db = @mysql_connect('localhost', 'root', '')) { mysql_select_db('testDB'); mysql_query('SET NAMES cp1251'); mysql_query("insert into user values ('$usermame', password('$password'), '$email')") or die(mysql_error()); mysql_close($db); } else { echo 'Не удалось установить подключение к базе данных'; } ?> Отработало без проблем ... А вот за такое надо руки оторвать... При таких введенных в форму данных, я получу полный доступ в вашу систему!!! PHP: $_POST['username'] = "' OR ''='"; $_POST['passwd'] = "' OR ''='"; Прежде чем вставлять данные полученные из формы необходимо обработать их функцией mysql_real_escape_string() внутри функции login(). А все таки книга уже устарела так уже лучше не писать. Лучше так: PHP: $_SESSION['valid_user'] = $username; Это то же не айс Лучше так PHP: if (isset($_SESSION['valid_user']))
в книге именно if (session_is_registered("valid_user")) , я пробовал по-разгому, результата все равно не получил...
unicross спасибо, я только учусь, обязательно учту сделал так - заработало Код (Text): function check_valid_user() { global $valid_user; if (isset($_SESSION['valid_user'])) { echo 'Вы вошли как '; echo $_SESSION['valid_user']; } Расскажите подробнее пожалуйста про $_POST['username'] = "' OR ''='"; что и перед какими кавычками писать и т.д., боюсь в запятых запутаюсь
понял, спасиб попробую поэксперементировать странно, значит и при запросе имя пользователя и пароля при входе необходимо использовать функцию password, в книге ее нету (((
При таких введенных данных получится такой запрос Код (Text): SELECT * FROM user WHERE username='' OR ''='' AND passwd='' OR ''='' Условие OR ''='' всегда истинно, по этой причине войти можно под любым логином и паролем... А так проблем не будет PHP: $username = mysql_real_escape_string($username); $password = mysql_real_escape_string($password); $query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`='$password'"; $result = mysql_query($query);
не просто, как-раз из-за этого ты и не можешь зайти в систему, т.к. 1. password() - зашифровывает пароль 2. я помню книгу, там если ты уберешь password('$password') и поставить $password без функции шифрования то твой пароль будет не зашифрован а когда ты входишь проверка идет именно по шифрованию ты вводишь пароль он зашифр, и сравнивается с тем, что в бд ну а теперь подумай...) что с чем оно будет его сравнивать...
спасиб, я так и сделал, только еще password использовал т.к. если не использовать, парольне совпадает Код (Text): query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`=password('$password')";
Покажите код куда вставили функцию mysql_real_escape_string Функцию можно использовать только после подключения к базе данных!!!
учитывая описание функции (mysql_real_escape_string - мнемонизирует специальные символы в строке для использования в операторе SQL с учётом текущего набора символов/charset соединения.) я подумал, что ею полезно обрабатывать данные из формы до записи их в базу при регистрации. В результате кода предвтавленного ниже, регистрация проходит, но в базу записывается пустая строка Код (Text): <?php function registr($username, $email, $password) { $username = mysql_real_escape_string($username); $password = mysql_real_escape_string($password); $email = mysql_real_escape_string($email); //подключаемся к БД $conn = db_connect(); if (!$conn) return 'Невозможно подключиться к серверу БД'; //Проверить уникально ли имя пользователя $result = mysql_query("select * from user where username='$username'"); if(!$result) return 'Не удалось выполнить запрос к БД'; if (mysql_num_rows($result)>0) return 'Это имя пользователя уже занято'; //Если все гуд, сохранить информацию в БД //$result = mysql_query("insert into user values ('$usermame', password('$password'), '$email')"); $query ="INSERT INTO `user` ( `username` , `passwd` , `email`) VALUES ('$username', password('$password'), '$email')"; $result = mysql_query($query); if (!$result) return 'Невозможно произвести запись в БД - попытайтесь позже.'; return true; } если же функцию добавить в login Код (Text): function login($username, $password) { $username = mysql_real_escape_string($username); $password = mysql_real_escape_string($password); $conn = db_connect(); if(!$conn) return 0; $query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`=password('$password')"; $result = mysql_query($query); if (!$result) return 0; if (mysql_num_rows($result)>0) return 1; else return 0; } вылазит ряд ошибок, описанных выше
PHP: //подключаемся к БД $conn = db_connect(); if (!$conn) return 'Невозможно подключиться к серверу БД'; $username = mysql_real_escape_string($username); $password = mysql_real_escape_string($password); $email = mysql_real_escape_string($email); PHP: $conn = db_connect(); if(!$conn) return 0; $username = mysql_real_escape_string($username); $password = mysql_real_escape_string($password);
а вот про это никто не говорил огромное спасибо за терпение, простите нуба если чего не так 8) Москва она ведь тоже не сразу строилась.... насяльника
А вообще какими функциями вы пользуетесь для обрабатывания данных от пользователя? Я читал про добавления слешей, про их убирание перед выводом, про обрезание пробелов и т.д... какой способ лучше применять в современных условиях? Может стоит все данные проверять через регулярки или достаточно встроенных функций?
1. по поводу регулярок - их стоит применять только тогда когда стоит , когда нужно проверить на правильность ввода и т.д. 2. функции обрезки пробелов trim 3. addslashes - экранирует, stripslashes - снимает экран 4. htmlspecialchars - преобразует специальные символы html
это я знаю, но вот лично вы когда и какие используете? в книге, по которой я занимаюсь рекомендуют использовать trim, addslashes и stripslashes, но вот во вчерашнем разговоре мне рекомендовали использовать mysql_real_escape_string перед записью переменных в базу.... в голове некая каша, что и в каких случаях лучше использовать?
Для экранирования для базы - mysql_real_escape_string В остальных случаях читайте у alexeurodnepr. Надеюсь не после вывода из базы данных...