带有mysqli_real_escape_string的PHP无法按预期工作

时间:2013-02-01 03:59:53

标签: php

我正在尝试创建一个登录页面但是我遇到了一个没有发送数据的问题。任何人都可以帮助我。

  $myusername = stripslashes($username);
    $mypassword = stripslashes($password);
    $myusername = mysqli_real_escape_string($myusername);
    $mypassword = mysqli_real_escape_string($mypassword);

    $sql="SELECT * FROM login_admin WHERE user_name='$myusername' and user_pass=SHA1('$mypassword')";
    $result=mysql_query($dbC, $sql);
    // Mysql_num_row is counting table row
    $count=mysql_num_rows($result);
    // If result matched $myusername and $mypassword, table row must be 1 row
    if($count==1){
        // Register $myusername, $mypassword and redirect to file "admin.php"
        session_register("admin");
        session_register("password");
        $_SESSION['name']= $myusername;
        header("location:admin.php");
    }
    else {

        $msg = "$username $password $myusername $mypassword $sql $result Wrong Username or Password. Please retry";
        header("location:login.php?msg=$msg");
    }

我得到的输出是: test test123 SELECT * FROM login_admin WHERE user_name = \'\'和user_pass = SHA1(\'\')错误的用户名或密码。请重试

2 个答案:

答案 0 :(得分:0)

您必须提供$ link标识符作为mysqli_real_escape_string中的第一个参数,以便这些行看起来更像

$myusername = mysqli_real_escape_string($dbconn,$myusername);
$mypassword = mysqli_real_escape_string($dbconn,$mypassword);

其中$ dbconn是您从mysqli_connect返回的链接。如果您要切换到mysqli_ *函数集,那么当你应该使用mysqli_等效时,你也使用了mysql_query和mysql_num_rows。

我强烈建议使用(现在的遗留)mysql函数切换到mysqli(或PDO)。 PHP.net提供information了解原因。

答案 1 :(得分:0)

考虑使用我们喜欢称之为prepared queries的(精彩)事物 这些非常棒,因为它们将数据视为数据,而不是作为要执行的语句。这意味着不需要转义,因为您的输入不会被误解。

在你的情况下实现这个:

$sql = "SELECT user_name FROM login_admin WHERE user_name = ? AND user_pass = SHA1(?)";
if ($query = $db->prepare($sql)) { //returns false if incorrect syntax, error, etc.
    $query->bind_param("ss", $user, $pass);
    // ss = string, string
    // mixed bind_param($params, **args);
    $query->execute();
    $query->bind_result($u);
    $query->fetch();
    $query->close();
} else {
    /* error handling */
}
if ($u) {
    /* session setting */
    header("Location: admin.php");
} else {
    header("Location: login.php?e=1");
}

我还有一个工作admin control panel我写道,我复制粘贴到了几乎可以为登录系统实现的东西(参见private.php

另外,要回答你的真实问题,没有数据库连接就没有办法在mysqli中进行转义。将数据库添加到函数的开头:

mysqli_real_escape_string($db, $string);