【问题标题】:Issue with PDO binding/executingPDO 绑定/执行问题
【发布时间】:2017-08-07 00:50:02
【问题描述】:

您好,这是我的代码,我正确创建了 2 个 sqlite 表示例和 login_info,但仍然会弹出此错误

致命错误:未捕获的 PDOException:SQLSTATE[HY000]:一般错误:C:\xampp\htdocs\display.php:22 中的 25 绑定或列索引超出范围

<?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>'

【问题讨论】:

  • $user$pword 是否带有值?

标签: php pdo


【解决方案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(),您会尝试多次执行它 - 如果您想插入相同类型的数据但具有不同的值,这很有用 - 这与您的身份无关在这里做。


其他注意事项...

您当前将密码存储在会话中并直接向用户显示 - 强烈建议不要这样做。您也可以将密码存储在纯文本中,这是一个大禁忌!使用正确的散列方法,例如password_hash()password_verify()

参考资料和阅读材料

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2021-04-28
    相关资源
    最近更新 更多