繁体   English   中英

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

[英]PHP with mysqli_real_escape_string does not work as expected

我正在尝试创建一个登录页面,但是有一个问题,其中数据没有被发送。 谁能帮我吗。

  $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(\\'\\')错误的用户名或密码。 请重试

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

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

其中$ dbconn是您从mysqli_connect返回的链接。 如果要切换到mysqli_ *功能集,则还应使用mysql_query和mysql_num_rows,它们应该使用它们的mysqli_等效项。

我强烈建议您使用(现在是旧的)mysql函数切换到mysqli(或PDO)。 PHP.net提供有关原因的信息

考虑使用我们喜欢调用的(很棒的) 预备查询
这些很棒,因为它们将数据视为数据,而不是要执行的语句 这意味着不需要转义,因为您的输入不会被误解。

要在您的情况下实现此目的:

$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");
}

我还写了一个工作的管理员控制面板 ,我将其复制粘贴到可以为登录系统实现几乎所有功能的东西中(请参阅private.php

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

mysqli_real_escape_string($db, $string);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM