【发布时间】:2019-12-09 07:39:20
【问题描述】:
我对 PHP 和 MySQL 还很陌生,我尝试学习如何将代码从 PDO 更改为 MySQLi。它与我在网络上找到的登录系统的安全令牌和标识符有关的记住我功能。 我想了解并了解如何将代码从 PDO 更改为 MySQLi。我知道在 MySQLi 中有一条语句创建和准备,我还必须绑定参数并执行。但是在这种情况下,我不知道如何开始。
$pdo = new PDO('mysql:host=localhost;dbname=dbname', 'root', '');
if (!isset($_SESSION['id']) && isset($_COOKIE['identifier']) &&
isset($_COOKIE['securitytoken'])) {
$identifier = $_COOKIE['identifier'];
$securitytoken = $_COOKIE['securitytoken'];
$statement = $pdo->prepare("SELECT * FROM securitytokens WHERE identifier = ?");
$result = $statement->execute(array($identifier));
$securitytoken_row = $statement->fetch();
if (sha1($securitytoken) !== $securitytoken_row['securitytoken']) {
die('Maybe a stolen securitytoken.');
} else {
//Token was correct
//Set an new token
$neuer_securitytoken = random_string();
$insert = $pdo->prepare("UPDATE securitytokens SET securitytoken = :securitytoken WHERE identifier = :identifier");
$insert->execute(array('securitytoken' => sha1($neuer_securitytoken), 'identifier' => $identifier));
setcookie("identifier", $identifier, time() + (3600 * 24 * 365)); //1 Year valid
setcookie("securitytoken", $neuer_securitytoken, time() + (3600 * 24 * 365)); //1 Year valid
//Loggin the user
$_SESSION['id'] = $securitytoken_row['id'];
}
}
【问题讨论】:
-
我不明白为什么需要从 PDO 切换到 MySQLi,但这是个人喜好。无论如何,请查看prepared statements 和bind_param 的文档。 MySQLi 不使用命名参数。
-
老实说,我认为没有人愿意从 PDO 切换到 MySQLi。 PDO 更简单,功能更多。
-
是的,这个问题确实很有趣,人们通常会从 MySQLi 切换到限制较少的选项 PDO
-
是的,我知道 - 用于学习目的。感谢您的链接和提示。我想我现在已经完成了准备语句和 bind_param。但是这一行我不知道如何处理: $result = $statement->execute(array($identifier));我不能把东西放进 $statement->execute();这是如何工作的?
-
不,你必须使用 bind_param。 OOP 风格中使用的
execute不带任何参数。在程序样式中,它只需要链接php.net/manual/en/mysqli-stmt.execute.php