Доброго всем вечера! Ранее не пользовался куками. Решил освоить эту тему. И столкнулся с тем, что в браузере куки видны, а на странице они не выводятся. Про то, что объявлять куки нужно до любого вывода я в курсе. Сложность в конструкции кода. Сценарий: 1. На странице html-форма (авторизация). После ввода данных информация отправляется через Ajax в php-файл. 2. На стороне сервера идет установка кукисов. 3. После всех проверок JS перенаправит пользователя на php-страницу с проверкой кукисов. Вот как раз на этой странице куки не видны. Может ли это быть потому, что куки ставятся после прохождения Ajax запроса? Не вижу тут никакой связи, но вероятнее всего я просто чего-то не знаю или не понимаю. Код php обработчика, где ставлю куки: PHP: // Присоединяем файл конфигурации require ($_SERVER['DOCUMENT_ROOT'].'/aw-config.php'); // Подключаем AW-PHP библиотеку require ($_SERVER['DOCUMENT_ROOT'].'/'.AW_ENGINE_FOLDER.'/'.AW_FUN_FOLDER.'/'.AW_FUNPHP_FILE); // Принимаем данные из формы $user_login = $_POST['login']; $user_pass = $_POST['pass']; $rememberme = $_POST['rememberme']; // Обнуляем все ошибки $error_login = ''; $error_pass = ''; $error_connectDB = ''; // Подключаемся к MYSQL $connectDB = connectDB ( AW_MYSQLDB_PATCH ); if($connectDB){$error_connectDB = '';} else {$error_connectDB = '<p class="error"><strong>Ошибка:</strong> Произошла внутренняя ошибка системы. Обратитесь к Администратору.</p>';} // Проверяем на валидность введенные данные if($user_login == '' OR strlen($user_login) <= 0) { $error_login = '<p class="atention"><strong>Внимание!</strong> Не заполнено поле «Имя пользователя или e-mail»</p>'; } if($user_pass == '' OR strlen($user_pass) <= 0) { $error_pass = '<p class="atention"><strong>Внимание!</strong> Не заполнено поле «Пароль»</p>'; } // Конвертируем пароль в MD5 дважды $user_pass = md5(MD5($user_pass)); // Ищем пару логин и пароль в базе $sqlAuth = mysql_query("SELECT * FROM ".AW_MYSQL_PREFIX.AW_MYSQL_USERS." WHERE user_login = '".$_POST['login']."' LIMIT 1"); $recAuth = mysql_fetch_array($sqlAuth); // Сравниваем введенный пароль с тем, что записан в базе if($recAuth['user_pass'] == $user_pass) { // $noerror = '<p class="ok"><strong>OK!</strong> Логин найден. Пароли совпали.</p>'; // Генерируем Хэш-код из случайных символов $hash = RandomString(20,'lower, numbers'); // Записываем в БД новый хеш авторизации $sql_Auth = mysql_query("UPDATE ".AW_MYSQL_PREFIX.AW_MYSQL_USERMETA." SET meta_value = '$hash' WHERE user_id = '".$recAuth['id']."' AND meta_name = 'hash_code'"); // Устанавливаем куки $userid = $recAuth['id']; setcookie("userid", $userid, time()+60*60*24); setcookie("userhash", $hash, time()+60*60*24); $noerror = "Все прошло успешно! / "; } else { $error_pass = '<p class="error"><strong>Ошибка:</strong> Не верный пароль.</p>'; } // Закрываем базу MYSQL disConnectDB($connectDB); // Заполняем массив данных для отправки ответа $data = array ( 'error_login' => $error_login, 'error_pass' => $error_pass, 'error_connectDB' => $error_connectDB, 'noerror' => $noerror ); // Отправляем ответ в формате JSON header("Content-type: application/json; charset=utf-8"); echo json_encode($data); Страница, на которой вывожу куки: PHP: echo 'id: '.$_COOKIE['userid'].' / hash: '.$_COOKIE['userhash']; Чтобы убедиться создаются ли куки я в браузере удаляю ранее созданные. После запуска все работает как часы - куки браузер снова видит, а скрипт нет Попробовал создать отдельную страницу, на ней установил куки и прочел - все работает. Выходит что причина в моем коде, приведенном выше. Прошу помочь.
а если path дописать: Код (Text): setcookie("userid", $userid, time()+60*60*24, "/"); setcookie("userhash", $hash, time()+60*60*24, "/");
Друг мой, я очень тебе благодарен за помощь Все заработало! А то я тут такой велосипед накручивать начал, что страшно признаться в этом изврате )))) --- Добавлено --- Правильно я понимаю, что если куки установлен в одну папку, а пытаешься вызвать в другом месте, то кукис не будет виден? Или ему нужно указать откуда его читать?
Так и делаю. Куки мне нужны для проверки авторизации, пароль храню только в БД. Или я допустил ошибку в коде?
path=PATH - этот атрибут устанавливает подмножество документов, для которых действительно значение cookie. Например, указание "path=/win" приведет к тому, что значение cookie будет действительно для множества документов в директории /win/, в директории /wings/ и файлов в текущей директории с именами типа wind.html и windows.shtml. Для того, чтобы cookie отсылались при каждом запросе к серверу, необходимо указать корневой каталог сервера, например, "path=/". Если этот атрибут не указан, то значение cookie распространяется только на документы в той же директории, что и документ, в котором было установлено значение cookie.
я так и делаю. Пароль используется только один раз для сверки с его кодированным вариантом. А потом только id пользователя и его hash-код, который ничего общего с паролем или логином не имеет.
@Arhitec, для начала можно делать валидацию по-простому. См. мою статью Как сделать авторизацию пользователя? PHP: $sqlAuth = $recAuth = if($recAuth['user_pass'] == $user_pass) Нужно делать проверки после каждого из присваиваний. И почитайте про сравнение строк, в частности тождественное сравнение.
Нафига мне пробовать? Я «твою старую башку» спасаю, если ты не понял. --- Добавлено --- P.S. И твоя монетка реально глаза мозолит
<?php echo password_hash('miketomlin', PASSWORD_DEFAULT); запусти и пообновляй станичку --- Добавлено --- это тест на человеческую жадность
Про третий параметр слыхал? И недефолтное значение второго? А я думал, на щедрость Хотя мне побоку смысл. Раздражает глаза только размер.
@miketomlin, не надо мне делать одолжений, тем более при таких обстоятельствах где они совершенно не уместны, ты лучше позаботься о себе, и скажи спасибо, что наконец погуглил и разобрался, как работает password_hash. На счёт хамства... поверь я даже не начинал. Наоборот, я не хотел этого говорить, но видимо придётся. Надо быть полным идиотом, что бы отказаться от преимущества password_hash, и от проверки password_verefy, только ради того что бы не доставать хеш пароля из БД. Спрошу тебя твоими же словами, ты про "радужные таблицы" слышал?
Естественно, слышал. Я даже «слышал», что эти функции придумали специально для тупаков, чтобы оторвать их от использования некриптостойких хэшей вроде md5. Вменяемым проггерами они нафиг не нужны. Тем более что в их реализации первоначально была допущена ошибка, кладущая большой болт на всю криптостойкость, ради которой они и создавались. Короче успехов в использовании этих ф-ций. Сейчас у них скорее всего уже нет никаких проблем. Конечно, если не считать идиотизм самого механизма их работы.