Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   не работает система авторизации на php mysql и cookie (http://www.flasher.ru/forum/showthread.php?t=89222)

Americanets 10.12.2006 16:56

не работает система авторизации на php mysql и cookie
 
не работает система авторизации на php mysql и cookie, наделал ошибок, не пойму как исправить :(


Код:

CREATE TABLE `members` (
`id` SMALLINT NOT NULL AUTO_INCREMENT ,
`name` TINYTEXT NOT NULL ,
`password` TINYTEXT NOT NULL ,
`info` TEXT,
PRIMARY KEY ( `id` )
);
INSERT INTO `members` VALUES (1, 'demo', 'pass','информация');


Код HTML:

<form action='aut.php' method='POST'>
Логин: <input type='text' name='name'><br>
Пароль: <input type='text' name='pass'><br>
<input type='Submit' name='logs' value='Вход'><br>
</form>


aut.php

PHP код:

$name=$_POST['name'];
$pass=$_POST['pass'];


if( 
$_SERVER['REQUEST_METHOD'] == "POST" && isset( $_POST['logs'] ) )
  {
   if( empty( 
$_POST['name'] ) || empty( $_POST['pass'] ) )
    {  
print 
'не авторизовался, введите данные';

    }
   
auth();
  }
function 
auth()
  {
$result = mysql_query( "SELECT * FROM `members` WHERE `name` = $name AND `password` =$pass  LIMIT 1");
if( 
mysql_num_rows( $result ) == 0 )
    {  
print 
"не верные данные, пользователь не найден!";
    }
   
   
$result=mysql_fetch_array($result);
   
$name=$result['id'];
   
setcookie( "identification" , $name , time() + 900 , "/" );
   
header( "Location: user.php");
  } 

user.php


PHP код:

  $id=$_COOKIE['identification'];
$result = mysql_query( "SELECT `*` FROM `members` WHERE `id` =$id" );
$result=mysql_fetch_array($result);
$info=$result['info'];
print 
$info; 


Mnilionic 10.12.2006 19:10

INSERT INTO `members` VALUES (1, 'demo', 'pass','информация');

Зачем вписывать значение ID если оно у тебя АВТОМАТИЧЕСКИ инкримируется?

Когда случается "тупиковое условие", по типу:
Код:

if( mysql_num_rows( $result ) == 0 ) { 
print "не верные данные, пользователь не найден!";
}

то в твоём варианте лучше останавливать выполнение скрипта, а то дерьмо выйдет.

А вообще разбираться трудно, потому что дикая расцветка у синтаксиса.

Americanets 10.12.2006 19:28

пасибо, подсветка действительно отвлекает, может сцилка на примерчик ись?

Skubent 11.12.2006 12:53

а вообще, покури про массивы $_COOKIE (это чтобы setcookie не дергать) и $_SESSION, чтобы не мучиться с передачей данных.
Кроме того, вкури пару статей про SQL-инъекции и методам защиты от оных.

Americanets 11.12.2006 13:52

спасибо за совет, буду читать, может примером поможете а то очень и очень нужно, а времени все понять не хватит :(

Skubent 11.12.2006 15:34

Лучше день потерять, потом за пять минут долететь (с)

Americanets 11.12.2006 16:49

верно, спасибо, просто щас на работе а вечером боюсь не успею :(

rtm 12.12.2006 16:25

Во-первых: вспомните про область видимости переменных! У вас функция auth() никгда не найдет пользователя, так как не знает что искать (к слову интересных уход от SQL-инъекций). Вот пример из которого все будет ясно:
PHP код:

function f1() {
    
$a = 5;
    echo 
"In f1(): \$a=$a<br>\n";
}
function 
f2() {
    global 
$a;
    
$a = 3;
    echo 
"In f2(): \$a=$a<br>\n";
}

$a = 10;
echo 
"Begin: \$a=$a<br>\n";
f1();
echo 
"After f1(): \$a=$a<br>\n";
f2();
echo 
"After f2(): \$a=$a<br>\n"; 

Во-вторых: как уже было подмечено при ошибках стоит помимо вывода сообщения, что-то делать например завершать работу скрипта.
В-трерьих: функции setcookie() и header() должны указываться ДО любого вывода в браузер, иначе будет выведено сообщение о том что нельзя отправить заголовки, и соответственно ни куки не будут установлены, ни перехода не будет.

Americanets 12.12.2006 16:43

что - то ничего не понятно :(

rtm 12.12.2006 17:20

Хорошо, покажу на вашем примере: попровуйте вывести из функции auth() значения переменных $name и $pass, бьюсь об заклад, что они окажутся пустыми. Для того, чтобы функция auth() работала так, как вы хотите необходимо написать так:
PHP код:

function auth() {
    global 
$name,$pass;
...
} 

Дальше, про setcookie() и header():
PHP код:

if( mysql_num_rows( $result ) == 0 ) 
    {   
print 
"не верные данные, пользователь не найден!"; 
    } 
    
   
$result=mysql_fetch_array($result); 
   
$name=$result['id']; 
   
setcookie( "identification" , $name , time() + 900 , "/" ); 
   
header( "Location: user.php"); 
  } 

Если пользователь не найден, то появится Ваше сообщение и сообщение PHP
Код:

Warning: Cannot modify header information - headers already sent
и никакие куки установлены не будут и перехода не будет. Согласен, может быть и не нужно в этом случае устанавливать куки и делать переход, но, Вы меня извините, строить логику приложения исходя из того, как будет реагировать интерпретатор на логические ошибки в приложении, по крайней мере кощунственно.

Дальше - больше: зачем нужна фукнция auth() если она вызывается только раз, в одном месте и содержит 5 строчек кода, которые нельзя отнести к решению какой-то отдельной логической операции приложения?

Ещё дальше - ещё больше: если $_POST['name'] и $_POST['pass'] пусты, то Вы выводите об этом сообщение. Это хорошо, но зачем в этом случае пытаться проверять если такой пользователь в БД. Понят какие мысли приходят при виде сообщения "не авторизовался, введите данные" и при
"не верные данные, пользователь не найден!". Но какие чувства будет испытавать бедный пользователь, когда увидит оба эти сообщения сразу?!


Часовой пояс GMT +4, время: 21:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.