[英]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.