我正在使用 Netbeans 在 PHP 中整理一个注册/登录表单。 为了实现这一点,我将登录、注册和数据库连接功能放在一个脚本.php文件中,该文件通过 include 调用加载。
好吧,我的登录功能使用它
$username = mysql_real_escape_string($_POST['username']);
$password = sha1(mysql_real_escape_string($_POST['password']));
$query = sprintf("SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password);
$link = connectDB();
$results = mysqli_query($link, $query);
以连接到数据库并获取结果。 验证将在稍后进行。
对于我的注册逻辑,我使用几乎相同的东西:
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
//check if user name and password match conditions
$link = connectDB();
$query = "SELECT * FROM users WHERE username = '" . $username . "'";
$results = mysqli_query($link, $query);
注册页面加载正常,但登录页面有一个错误文本打印输出,指出登录函数中有一个未定义的索引"用户名"。 这在页面加载时发生,并且未调用任何函数。
但是,在注册功能中几乎相同的布局下,我没有收到错误。
为什么会这样?
编辑
我发现了问题。
我使用 mysqli_connect
打开数据库连接,但使用 mysql-real_escape_string
函数。 两者是不相容的,加上i
就不一样了。
几点,可能与您的问题有关,也可能无关,但我根本无法忽视:
- SQL 转义字符串始终是最后发生的事情。不要对字符串进行 SQL 转义,然后
sha1
它。阅读《大逃避主义》,了解逃脱的全部内容。 - 使用
mysql_real_escape_string
时,您需要在调用此函数之前先连接到数据库,因为它需要建立数据库连接才能完成其工作。 - 您正在混合使用mysql和mysqli扩展。使用其中一个,而不是两者的功能。
- 如果您使用的是 mysqli(您应该!),请使用预准备语句,而不是手动对字符串进行 SQL 转义并
sprintf
。
换句话说,目前你完全错了。首先解决这些问题,您的问题可能会随之消失。