2

我是新手,这是我的第一篇文章。我希望有一天我能够帮助像我这样的新手。同时,我提前感谢您的回复。

下面的脚本是检查 MySQL 数据库中用户名和密码是否匹配的最快和最有效的方法吗?

如果它实际上是最有效的,那么它的等价物是什么:

1 - 使用 MySQLi using (Procedural Style)。

2 - 使用 MySQLi 使用(面向对象的样式)。

3 – 将 MySQLi 与准备好的语句一起使用 - 面向对象的风格。

4 – 将 PDO 与准备好的语句一起使用 - 面向对象的风格。

$connection = mysql_connect('localhost','root','pass') or die(mysql_error());
$database = mysql_select_db("database_name",$connection);

$sql = "SELECT count(*) FROM members WHERE username = '$username' AND 
password ='$password' LIMIT 1";

$result = mysql_query($sql) or die(mysql_error());

if (mysql_result($result, 0) > 0){

    echo 'found User <br />';
}

if (mysql_result($result, 0) < 1){

    echo 'username or password does not exist';
}
4

2 回答 2

2

此请求非常弱,可能会受到 SQL 注入。这里如何将变量传递给您的查询:

$query = sprintf("SELECT COUNT(*) FROM members 
    WHERE username='%s' AND password='%s'",
    mysql_real_escape_string($username),
    mysql_real_escape_string($password));

$result = mysql_query($sql) or die(mysql_error());

否则这个查询似乎没问题。

在 PDO 中,它会是这样的:

$pdo = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
$query = $pdo->query('YOUR QUERY HERE');

if(is_object($query)) {
  while($result = $query->fetch()) {

    // Do your things here...
  }
}
于 2013-06-01T00:57:41.850 回答
1

      我不会使用 `mysql_` 方法,它们已被弃用。建议使用 PDO 或 mysqli。另外我会小心你的 '$sql' 变量,它很容易被注入,想象一下如果有人进入这个:密码字段中的“ ' or 1 = '1 ”(不带双引号)。

      您可以查看这篇文章以了解 SQL 注入预防:如何防止 PHP 中的 SQL 注入?. 您可以查看其他帖子以了解不推荐使用 mysql_* 方法的原因:为什么我不应该在 PHP 中使用 mysql_* 函数?


您可能还想查看 PDO 和 mysqli 的手册:


      我个人更喜欢 PDO,我认为它有更好的社区支持

于 2013-06-01T00:59:24.373 回答