Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   JQuery post запрос и PHP (http://forum.oszone.net/showthread.php?t=155219)

darksmoke 31-10-2009 17:32 1257591

JQuery post запрос и PHP
 
Добрый день.
Ломаю голову уже неделю. Все сил нет, мозг весь съеден.
Как сделать автаризацию? Не могу разделить положительный ответ выданный PHP от ошибки. Т.е. чтобы при положительном ответе пускало в админ панель, а при ошибке выдавала ошибку, мол не правильные логин и пароль или логин может состоять только из латинских букв и знака подчеркивания. И все это без перезагрузки естественно.

имею:
index.php
HTML код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Центр авторизации</title>
<link href="style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
        $('#error').hide();
        $('#btnSubmit').click(function(){
                var name = $('#name').val();
                var password = $('#password').val();
                if ((name=='')&&(password==''))
                {
                        $('#error').text("Введите ваше имя и пароль");
                        $('#error').fadeIn(("slow"),function(){
                                setTimeout(function(){
                                        $('#error').fadeOut("slow");
                                },3000);
                        });
                }
                else if (name=='')
                {
                        $('#error').text("Введите ваше имя");
                        $('#error').fadeIn(("slow"),function(){
                                setTimeout(function(){
                                        $('#error').fadeOut("slow");
                                },3000);
                        });
                }
                else if (password=='')
                {
                        $('#error').text("Введите пароль");
                        $('#error').fadeIn(("slow"),function(){
                                setTimeout(function(){
                                        $('#error').fadeOut("slow");
                                },3000);
                        });
                }
        else
        {
                        $.ajax({
                                type: "POST",
                                url: "test.php",
                                data: "name="+name+"&password="+password,
                                success: function(html){
                                $("#error").append(html);
                                $("#error").slideDown('slow');
                                }
                        });
                }
        });
});
</script>
</head>
<body>
<div id="error"></div>
<div id="auth">
        <span>Центр авторизации</span>
        <form action="#" method="post">
            <div class="formLine">
                <label>Имя:</label><input name="name" type="text" size="20" maxlength="20" id="name"/>
        </div>
        <div class="formLine">
                <label>Пароль:</label><input name="password" type="password" size="20" maxlength="20" id="password"/>
        </div>
                <div class="formLine">
                <input name="btnSubmit" type="button" value="Войти" id="btnSubmit"/>
                </div>
    </form>
</div>
</body>
</html>

test.php
PHP код:

<?php
include './inc/db_config.inc.php';

if(
$_POST)
{
    
$name addslashes(trim($_POST['name']));
    
$query "SELECT * FROM `User` WHERE `name`='".mysql_real_escape_string($name)."' LIMIT 1";
    
$result mysql_query($query);
    
$row mysql_fetch_assoc($result);
    if(!
$row<1)
    {
        
print_r($row);
    }
    else
    {
        echo 
'Fack';
    }
}
else
{
    echo 
"net";
}

mysql_close($link);
?>


Sham 31-10-2009 23:13 1257859

Цитата:

Цитата darksmoke
$name = addslashes(trim($_POST['name'])); »

addslashes не нужен, ибо mysql_real_escape_string (лишние слеши будут)
Цитата:

Цитата darksmoke
if(!$row<1) »

$row у вас массив, поэтому это непрокатит. нужно в if или count($row) или $row[0]
Цитата:

Цитата darksmoke
$.ajax({
type: "POST",
url: "test.php",
data: "name="+name+"&password="+password,
success: function(html){
$("#error").append(html);
$("#error").slideDown('slow');
}
}); »

данные нужно кодировать функцией encodeURIComponent (если не кодируется - не знаю).
вообще нужно запрос проследить firebug'ом (или подобным софтом), чтобы убедиться каким методом шлется все, ибо я не уверен в строке data: (у вас же проверка на $_POST идет).

у вас же в методе "success:" можно все разрулить (проверять ответ скрипта)...

Igor_I 02-11-2009 00:07 1258814

darksmoke, как это, пускало в админпанель, но без перезагрузки.
Эта самая панель такая маленькая, что её можно встроить в обычную страницу?

darksmoke 03-11-2009 00:00 1259876

Всмысле маленькая - нет не маленькая.
Я имел ввиду, что после того как человек прошел авторизацию, он попал в панель администрирования.
Пример с почтой. Вводишь логин и пароль, и попадаешь на свою почту.

darksmoke 04-11-2009 17:41 1261558

Небыло Интернета, раздуплился в JavaScripte. Но вот как сделать что бы дальше попадал человек в защещенную часть сайта, немогу понять. Помогите! Сил нет!
Вот что получилось:
Index.html
HTML код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Центр авторизации</title>
<link href="style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    $('#error').hide();
    $('#btnSubmit').click(function(){
        var name = $('#name').val();
        var password = $('#password').val();
        if ((name=='')&&(password==''))
        {
            $('#error').text("Введите ваше имя и пароль");
            $('#error').fadeIn(("slow"),function(){
                setTimeout(function(){
                    $('#error').fadeOut("slow");
                },3000);
            });
            return false;
        }
        else if (name=='')
        {
            $('#error').text("Введите ваше имя");
            $('#error').fadeIn(("slow"),function(){
                setTimeout(function(){
                    $('#error').fadeOut("slow");
                },3000);
            });
            return false;
        }
        else if (password=='')
        {
            $('#error').text("Введите пароль");
            $('#error').fadeIn(("slow"),function(){
                setTimeout(function(){
                    $('#error').fadeOut("slow");
                },3000);
            });
            return false;
        }
 
        else
        {
            $.ajax({
                type: "POST",
                url: "test1.php",
                data: "name="+name+"&password="+password,
                success: function(res){
                    var r = '**';
                    var a = new Array();
                      a = res.split(r);
                      var result = a[0];
                    var err = a[1];
                    if(result=='Fuck')
                    {
                        $('#error').text('');
                        $('#error').append(err);
                        $('#error').fadeIn(("slow"),function(){
                            setTimeout(function(){
                                $('#error').fadeOut("slow");
                            },3000);
                        });
                        return false;
                    }
                    else
                    {
                        var r = '**';
                        var a = new Array();
                        a = res.split(r);
                        var ip = a[0];
                        var id = a[1];
                        alert(ip+id);
                    }
                }
            });
        }
    });
});
</script>
</head>
<body>
 
<div id="error"></div>
<div id="auth">
    <span>Центр авторизации</span>
    <form action="#" method="post" name="auth">
        <div class="formLine">
            <label>Имя:</label><input name="name" type="text" size="20" maxlength="14" id="name"/>
        </div>
        <div class="formLine">
            <label>Пароль:</label><input name="password" type="password" size="20" maxlength="14" id="password"/>
        </div>
        <div class="formLine">
            <input name="btnSubmit" type="button" id="btnSubmit"  value="Войти"/>
        </div>
    </form>
</div>
</body>
</html>

test1.php
PHP код:

<?php 
include './inc/db_config.inc.php'
 
if(
$_POST

    
$black_list mysql_query("SELECT * FROM `IP_Black_List` WHERE `ip`='".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."' LIMIT 1"); 
    
$row mysql_fetch_assoc($black_list); 
    if(!
$row || $row['try']<7
    { 
    
//если IP в блэк листе нет или кол-во попыток не больше 7, проверяем логин и пароль. 
        
$user_name addslashes(htmlspecialchars(substr(trim($_POST['name']),0,14))); 
        
$user_password addslashes(htmlspecialchars(substr(trim($_POST['password']),0,14))); 
        
$auth "SELECT * FROM `User` WHERE `name`='".mysql_real_escape_string($user_name)."' AND `password`='".mysql_real_escape_string($user_password)."' LIMIT 1"
        
$result_auth mysql_query($auth); 
        
$row_auth mysql_fetch_assoc($result_auth); 
        if(
$row_auth
        { 
            
session_start(); 
            echo 
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']. '**' .$_SESSION['id'] = session_id(); 
            
mysql_query("DELETE FROM `IP_Black_List` WHERE `ip`='".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."'"); 
        } 
        else if(!
$row
        { 
    
//Авторизацию не прошли. Если такого IP еще нет, записываем в блэк лист 
            
$date date("Y-m-d"); 
            
mysql_query("INSERT INTO `IP_Black_List` (`id`,`ip`,`try`,`date`)VALUES('','".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."','1','".mysql_real_escape_string($date)."')"); 
            echo 
'Fuck**Неверное имя или пароль. У вас осталось 6 попыток.';exit; 
        } 
        else 
        { 
    
//Авторизацию не прошли. IP уже есть - добавляем к нему одну попытку 
            
$row['try']++; 
            
mysql_query("UPDATE `IP_Black_List` set `try`='".mysql_real_escape_string($row['try'])."' WHERE (`ip`='".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."')"); 
            switch (
$row['try']) { 
              case 
2:$b="5 попыток"; break; 
              case 
3:$b="4 попытки"; break; 
              case 
4:$b="3 попытки"; break; 
              case 
5:$b="2 попытки"; break; 
              case 
6:$b="1 попытка"; break; 
              case 
7:$b="Ваш IP адрес заблокирован"; break; 
            } 
            if(
$row['try']!==7
            { 
                echo 
'Fuck**Не верное имя или пароль. У вас осталось '.$b
            } 
            else 
            { 
                echo 
'Fuck**'.$b
            } 
        } 
    } 
    else if(
$row>6
    { 
    
//Если кол-во попыток больше 7 - баним. 
        
echo 'Fuck**Ваш IP адрес заблокирован'; exit; 
    } 

else 

// Если POST'а небыло - отправляем на авторизацию 
    
header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])); 

mysql_close($link); 
?>


Igor_I 04-11-2009 19:57 1261682

Я сделал немного по-другому, потому и спрашивал. Пользователь вводит ник и пароль, если они неправильны - выводится сообщение об ошибке. Если они верны, делается редирект. Потому как движок сайта опирается на куки, сесии и т.д. По мне проще сделать редиректкуда надо, чем разбирать ответ от сервера на клиенте. Хотя может быть это я так сейчас считаю. :)

Sham 05-11-2009 01:34 1261959

Цитата:

Цитата darksmoke
else if($row>6) »

я же писал, что $row это массив, а в условии у вас как целое число... разберитесь
Цитата:

Цитата darksmoke
if(!$row || $row['try']<7) »

$row - у вас это двухмерный массив (массив из других массивов), значит $row['try'] там нету, а есть $row[0]['try']
исправляйте ошибки.

darksmoke 05-11-2009 10:26 1262130

Цитата:

Цитата Sham
$row - у вас это двухмерный массив (массив из других массивов), значит $row['try'] там нету, а есть $row[0]['try']
исправляйте ошибки. »

Что-то не пойму. сделал echo $row['try'] выводит число которое находится в БД. А если пишу echo $row[0]['try']? то ничего не выводит.
P.S print_r($row); выводит Array ( [id] => 13 [ip] => 127.0.0.1 [try] => 2 [date] => 2009-11-05 )

Sham 05-11-2009 19:09 1262571

darksmoke, все правильно, это mysql_query двухмерный отдает, я лажанулся :tomato2: ...
но вот это
Цитата:

Цитата darksmoke
else if($row>6) »

все равно не прокатит...
Цитата:

Цитата darksmoke
AND `password`='".mysql_real_escape_string($user_password)."' L »

если пароль хранится в базе в открытом виде, то так не делается, нужно хешировать перед вставкой, еще лучше, с генерацией соли (дополнительная хеш-строка)...
Цитата:

Цитата darksmoke
echo $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']. '**' .$_SESSION['id'] = session_id(); »

эта строка вообще непонятная, скорее всего ошибка...
вообще установка сессии через AJAX весьма глючный вариант, особенно для старых браузеров, поэтому кукисы сессии лучше дополнительно ставить в JS (session_name() = session_id()), предварительно проверив установку.

darksmoke 06-11-2009 12:11 1263083

Sham,
Цитата:

Цитата Sham
поэтому кукисы сессии лучше дополнительно ставить в JS (session_name() = session_id()), предварительно проверив установку. »

А пример можно.. это надо с явоскриптом делать?

Цитата:

Цитата Sham
echo $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']. '**' .$_SESSION['id'] = session_id(); » »

Это строка возвращает результат в яваскрипт.

Sham 06-11-2009 18:42 1263348

Цитата:

Цитата darksmoke
А пример можно.. это надо с явоскриптом делать? »

в jQUERY должна быть функция установки кукисов, поищите. Вообще в вашем случае для отправки лучше юзать формат JSON (чтобы слать не строки, а массивы к примеру, и получать уже как массив)...
Цитата:

Цитата darksmoke
Это строка возвращает результат в яваскрипт. »

строка всегда будет true возвращать (результат операции присваивания)... имхо перемудрили и ошиблись, иначе объяните для понимания....

darksmoke 08-11-2009 21:14 1265095

Sham,
Ну я думал так: если тру значит что-то произошло и редиректим в админку, в админке проверяем ид сессии, ИП к примеру. Если совпадаетто пускаем, нет - авторизуемся.
А?

Sham 09-11-2009 00:01 1265228

Цитата:

Цитата darksmoke
PHP код:

if($row_auth
 { 
 
session_start(); 
 echo 
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']. '**' .$_SESSION['id'] = session_id(); 
 
mysql_query("DELETE FROM `IP_Black_List` WHERE `ip`='".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."'"); 
 } 

»

зачем echo сразу то? вам же сначала переменную надо определить...

PHP код:

$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']. '**' .session_id();
echo 
$_SESSION['ip']; 

и после нужен редирект сделать куда надо. В PHP это header('Location: ...'), а в JS это window.location = URL


Время: 11:14.

Время: 11:14.
© OSzone.net 2001-