【问题标题】:PHP Fatal error: Uncaught PDOException: SQLSTATE[HY093]PHP 致命错误:未捕获的 PDOException:SQLSTATE [HY093]
【发布时间】:2022-01-10 14:56:35
【问题描述】:

我正在尝试安装一个脚本,实际上它在我填写我的信息错误时起作用,但是当我尝试使用真实信息时,它给了我这样的错误:

致命错误:未捕获的 PDOException:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与 blablabla/Session.php:129 中的标记数量不匹配

那个代码块完全是;

        /* Verify that user is in database */
        $query = "SELECT session_id FROM user_sessions WHERE session_id = '$session_id' AND userid = '$userid'";
        $stmt = $this->db->prepare($query);
        $stmt->execute(array(':userid' => $userid, ':sessionid' => $session_id));    ///LINE 129///
        $count = $stmt->rowCount();

        if (!$stmt || $count < 1) {
            return 1; // Indicates username failure  
        }

        $dbarray = $stmt->fetch();

        /* Validate that userid is correct */
        if ($session_id == $dbarray['session_id']) {
            return 0; // Success! Username and userid confirmed
        } else {
            return 2; // Indicates userid invalid
        }
    }

这里是所有 session.php 代码 (https://codeshare.io/gLbJAR/)

【问题讨论】:

  • $query 中的变量不应该是:session_id 格式,而不是$session_id 格式吗?看起来 PDO 只是不知道有任何参数,所以你提供的两个太多了。
  • 错误信息有什么不清楚的地方吗?您正在构建的查询不包含任何参数。另外,请注意,在这种情况下不应使用字符串连接,特别是如果您已经想使用准备好的语句
  • 对不起,我只是不擅长 php,但我尝试了你所说的,这也给了我同样的错误
  • 请通过编辑将所有尝试添加到您的问题中
  • 感谢您的建议。我明天会这样做,现在我在工作,很忙。

标签: php pdo fatal-error


【解决方案1】:

也许可以试试:

     $query = "SELECT session_id FROM user_sessions WHERE session_id = :session_id AND userid = :userid";
    $stmt = $this->db->prepare($query);
    $stmt->execute(array(':userid' => $userid, ':sessionid' => $session_id));

我看到的问题是您的查询不包含任何参数,但是,您将一些参数传递给了执行方法。

检查docs,尤其是:

$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); 

$sth->execute(array('calories' => $calories, 'colour' => $colour));

【讨论】:

  • 您给出的第二个选项,在没有参数数组的情况下调用 execute,将使 OP 容易受到 SQL 注入攻击。第一个选项更好
  • @CerebralFart 正确,答案已更新:]
  • 您的示例代码不起作用:|实际上我的 PHP 不太好,我检查了你发给我的网站 1.5 小时,但我找不到任何解决我问题的方法,可能只是因为我不明白:'(
  • @MotunTanhu 您是否使用了我粘贴的确切代码?基本的事情是将变量替换为参数,因此使用 :someParam 代替 $someParam。这是通知查询生成器查询将包含一些动态值的方法,您将在数组中将其传递给执行方法。当您使用我粘贴的代码时,您会得到什么样的错误?
  • 是的,我尝试过,但它给出了同样的错误。
【解决方案2】:

您使用会话 ID 验证用户存在吗?我用这样的密码验证我的

$query_a = "SELECT * FROM users WHERE username = :username";
    $query_b = $pdo->prepare($query_a);
    $query_b->bindParam(':username', $username);
    $query_b->execute();
    
    if ($query_b) {
        if ($query_b->rowCount() == 1) {
            $row = $query_b->fetch();
            $hash = $row['password'];

            if (password_verify($password, $hash)) { 
                $_SESSION['username'] = $username;
                header('location: index.php');
                die();
            } else {
                echo 'Access Denied';
                    }
                }
            }
        } 

【讨论】:

  • 实际上这个脚本不是我的,我在 php 中不是很好。我在我的代码块中没有看到像“密码”这样的值。所以我也尝试了你的代码块,但又出现了另一个错误:|我只是卡住了我不知道我能做什么:d
猜你喜欢
  • 1970-01-01
  • 2023-01-19
  • 2021-12-13
  • 2019-12-17
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多