Php 使用PDO连接SQLite以创建登录页面

Php 使用PDO连接SQLite以创建登录页面,php,sqlite,pdo,Php,Sqlite,Pdo,我正在尝试使用SQlite创建登录页面。然而,由于某种原因,我一直在犯错误( 致命错误:未捕获错误:调用C:\xampp\htdocs\project\login.php中布尔值上的成员函数fetch():20堆栈跟踪:#0{main}在C:\xampp\htdocs\project\login.php的第20行抛出) 来自PHP文档:PDO::query()返回PDOStatement对象,失败时返回FALSE。这意味着$dbh->query($sql)如果执行sql查询时出现问题,可能会返回

我正在尝试使用SQlite创建登录页面。然而,由于某种原因,我一直在犯错误( 致命错误:未捕获错误:调用C:\xampp\htdocs\project\login.php中布尔值上的成员函数fetch():20堆栈跟踪:#0{main}在C:\xampp\htdocs\project\login.php的第20行抛出)


来自PHP文档:PDO::query()返回PDOStatement对象,失败时返回FALSE。这意味着
$dbh->query($sql)
如果执行sql查询时出现问题,可能会返回一个布尔值(false)(您应该添加代码来处理这种可能性)。您收到的错误消息强烈表明情况就是这样

那么,让我们看看,SQL失败的原因可能是什么。这些都是可能的

  • 您的表名真的是“users”(注意后面的下划线)还是应该是“users”
  • 可能
    $password
    的值包含一个字符,如
    '
    (单引号),这将导致错误的SQL语句
  • 更新(回答下面的评论):在PDO看到整个SQL语句之前,您正在构建整个SQL语句,包括PHP中的所有数据值。因此PDO只能看到字符串,因此它无法知道或处理应该转义的特殊字符。PDO必须非常聪明,无法知道哪些字符可以,哪些字符不可以(特别是如果数据是SQL注入;如果PDO解析数据以寻找要转义的字符,则看起来很好)

    实际上,您的代码暴露于SQL注入。你要么1)转义数据

    $sql = "SELECT username, password FROM users_ WHERE "
        . "username = '" . $dbh->quote($myusername) . "' "
        . "and password = '" . $dbh->quote($mypassword) . "'";
    
    或者(更好!)2)使用准备好的语句(PDO将执行任何必要的转义,因为它用数据值替换SQL语句中的


    FROM users_uu可能应该是FROM users当查询失败时返回false,这就是为什么如果不检查执行是否正常,就可以得到布尔消息。应该使用准备好的语句来避免SQL注入攻击。错误的真正原因是存在“in$password”值。不要对SQL注入本身进行PDO排序,因为不需要MySQL的mysqli_real_escape_string之类的替代方法。使用prepare()能解决这个问题吗?@Skla777,我用你问题的答案更新了上面的答案。
    $sql = "SELECT username, password FROM users_ WHERE "
        . "username = '" . $dbh->quote($myusername) . "' "
        . "and password = '" . $dbh->quote($mypassword) . "'";
    
    $sql = "SELECT username, password FROM users_ WHERE "
        . "username = ? AND password = ?";   // note the "?" placeholders
    $stmt = $dbh->prepare($sql);
    $stmt->execute([$myusername, $mypassword]);  // here, PDO will escape characters
    while ($row = $stmt->fetch()) {
        // process a $row
    }