Php 使用PDO连接SQLite以创建登录页面
我正在尝试使用SQlite创建登录页面。然而,由于某种原因,我一直在犯错误( 致命错误:未捕获错误:调用C:\xampp\htdocs\project\login.php中布尔值上的成员函数fetch():20堆栈跟踪:#0{main}在C:\xampp\htdocs\project\login.php的第20行抛出)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查询时出现问题,可能会返回
来自PHP文档:PDO::query()返回PDOStatement对象,失败时返回FALSE。这意味着
$dbh->query($sql)
如果执行sql查询时出现问题,可能会返回一个布尔值(false)(您应该添加代码来处理这种可能性)。您收到的错误消息强烈表明情况就是这样
那么,让我们看看,SQL失败的原因可能是什么。这些都是可能的
$password
的值包含一个字符,如'
(单引号),这将导致错误的SQL语句$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
}