PDO绑定/执行问题

时间:2017-03-16 02:03:48

标签: php pdo

嗨,这是我的代码,我正确地创建了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>'

1 个答案:

答案 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()

参考文献&amp; Readingmaterial