嗨,这是我的代码,我正确地创建了2个sqlite表示例和login_info,但这个错误仍然会弹出
致命错误:未捕获PDOException:SQLSTATE [HY000]:常规错误:25个绑定或列索引超出C:\ xampp \ htdocs \ display.php中的范围:22
<?php
session_start();
$user = $_POST['username'] ?? '';
$pword = $_POST['password'] ?? '';
$_SESSION['details'] = [
'user' => $user,
'pword'=> $pword
];
$pdo = new PDO('sqlite:'.__DIR__.'/users.db');
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
if (!isset($_SESSION['sample'])){
$statement = $pdo->prepare("INSERT INTO sample(timecreated) VALUES (?)");
$statement->execute([time()]);
$_SESSION['sample'] = $pdo->lastInsertId();
}
$deleteStatement = $pdo->prepare("DELETE FROM login_info WHERE employee_id=?");
$deleteStatement->execute([$_SESSION['sample']]);
这是我的错误开始的地方
$insertStatement = $pdo->prepare("INSERT INTO login_info (username,password) VALUES (?,?)");
$insertStatement->execute([$_SESSION['sample'],'username', $user]);
$insertStatement->execute([$_SESSION['sample'],'password', $pword]);
?>
<!DOCTYPE html>
<html>
<head>
<title>Display</title>
</head>
<body>
<p>
Your username is <?php echo $user ?> and your password <?php echo $pword ?>.
</p>
<a href="login.php">Go Back</a>
</body>
</html>'
答案 0 :(得分:1)
您的问题是您没有绑定这两个值,您尝试单独执行它们。首先绑定它们,然后执行,或同时执行它们。您还提供3个参数,而不是两个。我无法看到$_SESSION['sample']
(上一个查询中的ID)是如何适应的,所以只需删除它。
这是一个如何执行它的示例。请注意,execute()
中作为参数提供的数组与占位符一样多,并且它们以正确的顺序显示。
$insertStatement = $pdo->prepare("INSERT INTO login_info (username, password) VALUES (?, ?)");
$insertStatement->execute([$user, $pword]);
您的问题是您尝试多次执行。您似乎对PDOStatement::bindParam
的语法混淆了,这将是
$insertStatement = $pdo->prepare("INSERT INTO login_info (username, password) VALUES (?, ?)");
$insertStatement->bindParam(1, $user);
$insertStatement->bindParam(2, $pword);
$insertStatement->execute();
通过在同一语句上多次调用execute()
,您尝试多次执行它 - 如果您想插入相同类型的数据但具有不同的值,这很有用 - 这与什么无关你在这里做。
您目前在会话中存储密码并直接将其显示给用户 - 强烈建议您这样做。它看起来像你在纯文本中存储psaswords,这是一个大禁忌!使用适当的散列方法,例如password_hash()
和password_verify()
。