【问题标题】:What is causing one PHP function to print out error text blurb, but not another?是什么导致一个 PHP 函数打印出错误文本简介,而不是另一个?
【发布时间】:2012-05-31 14:34:33
【问题描述】:

我正在使用 Netbeans 在 PHP 中编写一个注册/登录表单。为了实现这一点,我在 scripts.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 就完全不同了。

【问题讨论】:

  • 这意味着$_POST 没有带有;username' 键的元素...
  • 您需要先检查isset($_POST['username']),因为该表格尚未发布。这个问题经常被问到,答案几乎总是一样的。 stackoverflow.com/search?q=%5Bphp%5D+undefined+index
  • 听起来您正在检查 $_POST['username'] 是否已发布表单。未发布时,username 是 $_POST 数组中的未定义索引。
  • 那么为什么一个函数没有抛出这个错误,而另一个是?
  • @Jason:因为在一种情况下您会发送一个名为username 的 POST 变量,而在另一种情况下则不会。

标签: php undefined-index


【解决方案1】:

有几点,可能与您的问题相关,也可能不相关,但我不能忽视:

  1. SQL 转义字符串始终是最后发生的事情。不要对字符串进行 SQL 转义,然后 sha1 它。请参阅 The Great Escapism 了解转义的全部内容。
  2. 使用mysql_real_escape_string时,调用此函数之前需要先连接到数据库,因为它需要建立数据库连接才能完成工作。
  3. 您正在混合使用 mysql 和 mysqli 扩展。使用其中一个,而不是两者的功能。
  4. 如果您正在使用 mysqli(并且应该!),请使用 prepared statements 而不是手动 SQL 转义字符串和 sprintf

换句话说,目前你做的完全错误。先解决这些问题,您的问题可能就会消失。

【讨论】:

  • 检查我的编辑,#3 是正确的。我错过了将 i 附加到 mysql_real_escape_string。你的其他观点是有效的,我会记住的。
  • 不要只记住它们,停止使用 sprintf*_real_escape_string 并改用参数化/准备好的语句。
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2018-12-27
相关资源
最近更新 更多