PHP,jQuery和.post():mysql_real_escape_string搞砸了

时间:2010-03-09 16:15:19

标签: php jquery ajax mysql-real-escape-string

我一直在用这个烫发我的头发。

的index.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;
    });
});

的login.php:

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

没有任何回声会返回任何内容。

的settings.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 out(当然echo $ uid不起作用),代码也能正常工作,所以它必须是mysql_real_escape_string所做的事情。任何人都知道我做错了什么?

index.php还包括settings.php,如果这有任何区别。

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

4 个答案:

答案 0 :(得分:6)

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

因此,您必须首先创建数据库连接。但是在你开始这样做之前:注意只需要接受每个POST和GET变量并将其吐入全局命名空间,这是非常糟糕的主意

答案 1 :(得分: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脚本本身。 / p>

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-a-connection-has-been-initiated的事情,我已经从上面的代码中删除了逃脱,因为真的,你最好先逃避这些东西你把它放入sql。

此外,请记住,使用javascript登录 WILL 回来咬你,功能基本和必要的登录,你不希望javascript错误打破任何能力让观众登录。这里会这样做。

答案 2 :(得分:1)

是否有有效的mysql链接?

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

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

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

答案 3 :(得分:0)

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

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

示例:

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

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