【问题标题】:MYSQLI to PDO guidance [duplicate]MYSQLI 到 PDO 指导 [重复]
【发布时间】:2019-10-09 09:11:06
【问题描述】:

我正在慢慢地将有 MSQLI 的网站页面转换为 PDO。但是我有一个登录脚本的这一部分,我不确定它是否可以在 PDO 中完成,如果它不能,任何人都对如何使其安全有任何建议。 它与下面的代码部分有关,它是一个与 $pass_fail 变量相关的多查询,然后是一个我可能可以解决的单个选择查询 $pass_fail_query 变量。但它是我在使用 PDO 时遇到的多重查询,我该如何执行它?

$pass_fail = "
  DELETE FROM `login_fail`
  WHERE
    `last_fail_login` < DATE_SUB(NOW(), INTERVAL 5 MINUTE);
";

$pass_fail .= "
  INSERT INTO login_fail (
    user_id,
    email,
    last_fail_login,
    fail_login_ip
  ) VALUES (
    '$user_id',
    '$email',
    '$last_login_date',
    '$ip'
  );
";

$pass_fail .= "
  UPDATE members SET
    `last_fail_login` = '$last_login',
    `fail_login_ip`= '$ip'
  WHERE
    email = '$email'
";

$pass_fail_query = "
  SELECT
    *
  FROM `login_fail`
  WHERE
    `email` = '$email'
    AND `last_fail_login` > date_sub(now(), interval 5 minute)
";

【问题讨论】:

  • PDO 支持在 1 个调用中运行多个查询。但是,我建议您查看Prepared Statements 以防止 SQL 注入。绝大多数情况下,在 SQL 字符串中使用 PHP 变量是一个大错误
  • AFAIK 绝对不需要使用多查询。您可以通过单独调用执行每个查询来做同样的事情,这就是您在 PDO 中的做法。

标签: php mysqli pdo


【解决方案1】:

只需将它们创建为单独的查询。

$pass_fail_delete = $pdo->prepare("
  DELETE FROM `login_fail`
  WHERE
    `last_fail_login` < DATE_SUB(NOW(), INTERVAL 5 MINUTE);
");
$pass_fail_insert = $pdo->prepare("
  INSERT INTO login_fail (
    user_id,
    email,
    last_fail_login,
    fail_login_ip
  ) VALUES (
    :user_id,
    :email,
    :last_login_date,
    :ip
  );
");
$pass_fail_update = $pdo->prepare("
  UPDATE members SET
    `last_fail_login` = :last_login,
    `fail_login_ip`= :ip
  WHERE
    email = :email
");
$pass_fail_query = $pdo->prepare("
  SELECT
    *
  FROM `login_fail`
  WHERE
    `email` = :email
    AND `last_fail_login` > date_sub(now(), interval 5 minute)
");

然后不是使用mysqli_multi_query()在一次调用中执行$pass_fail,而是执行3个查询:

$pass_fail_delete->execute();
$pass_fail_insert->execute([':user_id' => $user_id, ':email' => $email, ':last_login_date' => $last_login_date, ':ip' => $ip]);
$pass_fail_update->execute([':last_login' => $last_login, ':ip' => $ip, ':email' => $email]);
$pass_fail_query->execute([':email' => $email]);

【讨论】:

  • 非常感谢Barmar,我想我现在终于明白如何使用pdo了
猜你喜欢
  • 1970-01-01
  • 2015-06-17
  • 2020-02-19
  • 2020-01-29
  • 1970-01-01
  • 2012-08-04
  • 2016-05-23
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多