0

我已经用这个扯了一段时间的头发了。

索引.php:

$(document).ready(function(){ 
    $(".index_login_subm").click(function(){
        uid = $("input:username").val();
        pwd = $("input:password").val();
        $.post("backend/login.php",{
            uid:uid,
            pwd:pwd
        },function(data){
            alert("Returned data: " + data);
         });
        return false;
    });
});

登录.php:

include("../../settings.php");
echo $uid;
echo $_POST['uid'];

没有任何回声返回任何东西。

设置.php:

foreach ($_POST as $key => $value) { 
   $$key = mysql_real_escape_string($value);
}
foreach ($_GET as $key => $value) { 
   $$key = mysql_real_escape_string($value); 
}

如果我将 settings.php-include 注释掉,则代码运行良好(当然, echo $uid 不起作用),所以它必须是 mysql_real_escape_string 所做的。有人知道我做错了什么吗?

index.php 还包括 settings.php 如果这有什么不同的话。

编辑:下面的帖子让我想澄清一下;路径都是正确的。settings.php(和其他一些脚本)都放在根文件夹之外,以使 Web 用户无法访问它们。当脚本访问它们时,它们运行良好。

4

4 回答 4

6

PHP 手册中所述,mysql_real_escape_string 需要使用 mysql_connect(在第二个参数中)建立真正的数据库连接。如果不存在,它会尝试通过简单地调用 mysql_connect() 来创建一个。如果这也不起作用,则返回 false。

因此,您必须先创建一个数据库连接。但在开始执行此操作之前:请注意,简单地获取每个 POST 和 GET 变量并将其吐入全局命名空间是一个非常糟糕的主意。

于 2010-03-09T16:23:58.130 回答
3

首先,我会避免使用可变变量,在这种情况下它们确实不是必需的,如果您不确定哪些键实际到达该脚本,它们会成为移动目标,并且由于安全问题,它们是不好的做法他们创造的。相反,我会将 settings.php 中的转义值放入一个数组中。然后你可以在包含 settings.php 之后简单地 var_dump() 数组,看看有什么可用的。

function extract_requests(){
    $res = array();
    foreach ($_REQUEST as $key => $value) { 
        if($key){
            $res[$key] = $value;
        }
    }
    return $res;
}

其次,使用正确的 url 字符串手动调用 login.php,这正是您希望 javascript 调用的内容,这样您就可以确定任何行为问题都不是来自 login.php 脚本本身。

http://localhost/somewhere/login.php?uid=50

include("../../settings.php");
$input = extract_requests();
var_dump($input);
echo $input['uid'];
echo $_POST['uid'];

最后,我会检查您在 post() 中发送的数据。我不是 javascript 专家,但是

uid:uid,
 pwd:pwd

看起来这会给我带来问题,所以最好确保您的数据以您期望的方式发送。

$(document).ready(function(){ 
    $(".index_login_subm").click(function(){
        uid = $("input:username").val();
        pwd = $("input:password").val();
        var inputData = {uid:uid, pwd:pwd};
        alert(uid+" "+pwd);
        // If you have a console.log() available, just use it on inputData here instead.
        $.post("backend/login.php",inputData
         ,function(data){
            alert("Returned data: " + data);
         });
        return false;
    });
});

编辑:基于 mysql_real_escape_string-only-when-a-connection-has-been-initiated 事情,我已经从上面的代码中删除了转义,因为真的,你最好在你把它之前转义这些东西进入sql。

此外,请记住,使用 javascript 登录回来咬你,功能与登录一样基本和必要,你不希望 javascript 错误破坏查看者登录的任何能力。在这里它将这样做。

于 2010-03-09T16:25:46.587 回答
1

是否有有效的 mysql 链接?

string mysql_real_escape_string  ( string $unescaped_string
                                [, resource $link_identifier  ] )

如果link identifier未指定,mysql_connect()则假定打开的最后一个链接。如果没有找到这样的链接,它将尝试创建一个,就好像mysql_connect()在没有参数的情况下被调用一样。如果未找到或建立连接,E_WARNING则会生成级别错误。

可能是您的错误报告设置忽略了E_WARNING级别错误。

于 2010-03-09T16:27:11.490 回答
0

index.php 显然位于网站的根目录中,但您调用的脚本位于“后端”目录中。

尝试使用include_once而不是include使用绝对路径,而不是相对路径。

例子:

<?php
    include_once($_SERVER['DOCUMENT_ROOT']."/settings.php"); //absolute path to file
    echo $uid;
    echo $_POST['uid'];
?>

如果您移动文件,使用绝对路径将使您的生活更轻松。

于 2010-03-09T16:22:03.723 回答