我正在编写一个登录/注册页面。我想使用 mysqli_real_escape_string()
保护表单免受 sql 注入的影响。如果我使用它,该函数将返回NULL
.
我不知道为什么...我搜索了一下,发现也许我没有连接到数据库,但是我可以查询它。
这是我用来连接到数据库(db.php)的代码:
<?php
$con = mysqli_connect("localhost","user","pass","database");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
?>
返回 NULL 的代码:
include("includes/db.php");
function escapeInput($data) {
$data = trim($data);
$data = htmlspecialchars($data);
$data = stripslashes($data);
$data = mysqli_real_escape_string($con, $data);
return $data;
}
if (isset($_SESSION['username'])){
header("Location: home.php");
}
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if($_POST['action'] == 'login')
{
$username = escapeInput($_POST['username']);
$password = escapeInput($_POST['password']);
var_dump($username);
$password = sha1($password, true);
$login = "SELECT COUNT(*) FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($con,$login);
$user = mysqli_fetch_array($result, MYSQLI_NUM);
if($user[0]) {
echo '<div class="alert alert-success" role="alert">Successfuly logged in.</div>';
// Store Session Data
$_SESSION['username'] = $username; // Initializing Session with value of PHP Variable
header("Location: home.php");
die();
}
else echo '<div class="alert alert-danger" role="alert">Incorrect username and/or password.</div>';
}
}
mysqli_real_escape_string()
需要两个参数:
- 连接资源(通过调用
mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
创建) - 一个字符串。
z mysqli_real_escape_string()
总是在第一个参数null
时返回 null
。因此,请确保您已创建连接对象,并且尚未使用 mysqli_close()
将其关闭。
现实情况是,如果你现在想编写一个登录页面,你不应该使用不推荐使用的代码。您应该查看PDO。我跳了起来,起初听起来很可怕,但这是我做过的最好的事情之一。就这么简单。
$Qry = $db->prepare("SELECT COUNT(username) FROM users WHERE username = :User AND password = Pass");
$Qry->execute(array(':User'=>$username, ':Pass'=>$password));
然后你可以使用
$Qry->rowCount();
您必须更改连接字符串,但它更安全且对未来友好
准备好的声明
试试这个:
$data = mysqli_escape_string($con, $data);
您需要将连接对象作为第一个参数传递。