我的 mysqli 语句没有存储任何数据
My mysqli statement is not storing any data
作为我培训的一部分,我的团队领导要求我在 PHP 中进行简单的登录,我创建了一个从 JavaScript 文件接收用户名和密码的控制器,然后使用参数触发 SQL 查询,这就是我的第一个问题开始的地方。我执行了该语句,但后来无法将查询数据集存储在我的 $stored
变量中。我正在使用 store_result()
,但都没有返回任何行($queryRows 变量)。
我做错了什么?
<?php
include('database.php');
session_start();
//Fetch the user data
$user = $_POST['user'];
$password = $_POST['pass'];
$_SESSION['user'] = $user;
//Checks for empty values
if(empty($user)||empty($password)){
header("Location: ../views/login.php?error=emptyfields");
exit();
}
//DB query to validate the user/password combination
$validationQuery = "SELECT userName, password FROM users WHERE userName =? AND password =?";
//Prevents SQLInjection by using parameters
$statement = $connection->prepare($validationQuery);
$statement->bind_param("ss",$user,$password);
$executed = $statement->execute();
$stored = $statement->store_result($statement);
$queryRows = $statement->num_rows($statement);
if ($stored) {
header("Location: ../views/home.php");
exit();
} else {
header("Location: ../views/login.php?error=userError");
exit();
}
mysqli_stmt_close($statement);
mysqli_close($connection);
您使用准备好的语句做得很好。然而,mysqli 是一个非常复杂的扩展。我强烈建议在使用前仔细查看文档中的每个函数。
在你的例子中,你的代码看起来很有道理,但当你仔细观察时,它纯粹是胡说八道。
前 3 行工作正常。它在 MySQL 服务器上准备并执行一条语句。
$statement = $connection->prepare($validationQuery);
$statement->bind_param("ss",$user,$password);
$executed = $statement->execute();
mysqli_stmt::store_result()
用于存放内部缓冲区中的数据。它 returns true
当数据被正确缓冲时。 它不需要任何参数!
$stored = $statement->store_result($statement);
mysqli_stmt::num_rows()
returns 缓冲的行数 。 它不需要任何参数!
$queryRows = $statement->num_rows($statement);
执行此代码后,$stored
将始终为真。即使结果集有 0 行。这意味着将执行下一条语句。
if ($stored) {
header("Location: ../views/home.php");
exit();
}
到此,您的脚本结束。您重定向到另一个页面并退出当前页面。清除内部缓冲区,清理语句,关闭连接。
下面两行是空操作代码:
mysqli_stmt_close($statement);
mysqli_close($connection);
我不确定您的意图到底是什么,但考虑到这是一个登录脚本,我会说您想从语句中检索数据,而不是行数。我会删除 store_result()
并改用 get_result()
。
$statement = $connection->prepare($validationQuery);
$statement->bind_param("ss",$user,$password);
$executed = $statement->execute();
$result = $statement->get_result();
$userRecord = $result->fetch_assoc();
if($userRecord && password_verify($password, $userRecord['hash']) {
$_SESSION['userId'] = $userRecord['id'];
header("Location: ../views/home.php");
exit();
} else {
header("Location: ../views/login.php?error=userError");
exit();
}
// NO MORE CODE SHOULD GO HERE. NO PHP, no HTML, nothing. This is the end of the script!
我的示例当然像每个登录脚本一样使用密码散列。您需要调整您的 SQL 声明以说明这一点。
作为我培训的一部分,我的团队领导要求我在 PHP 中进行简单的登录,我创建了一个从 JavaScript 文件接收用户名和密码的控制器,然后使用参数触发 SQL 查询,这就是我的第一个问题开始的地方。我执行了该语句,但后来无法将查询数据集存储在我的 $stored
变量中。我正在使用 store_result()
,但都没有返回任何行($queryRows 变量)。
我做错了什么?
<?php
include('database.php');
session_start();
//Fetch the user data
$user = $_POST['user'];
$password = $_POST['pass'];
$_SESSION['user'] = $user;
//Checks for empty values
if(empty($user)||empty($password)){
header("Location: ../views/login.php?error=emptyfields");
exit();
}
//DB query to validate the user/password combination
$validationQuery = "SELECT userName, password FROM users WHERE userName =? AND password =?";
//Prevents SQLInjection by using parameters
$statement = $connection->prepare($validationQuery);
$statement->bind_param("ss",$user,$password);
$executed = $statement->execute();
$stored = $statement->store_result($statement);
$queryRows = $statement->num_rows($statement);
if ($stored) {
header("Location: ../views/home.php");
exit();
} else {
header("Location: ../views/login.php?error=userError");
exit();
}
mysqli_stmt_close($statement);
mysqli_close($connection);
您使用准备好的语句做得很好。然而,mysqli 是一个非常复杂的扩展。我强烈建议在使用前仔细查看文档中的每个函数。
在你的例子中,你的代码看起来很有道理,但当你仔细观察时,它纯粹是胡说八道。
前 3 行工作正常。它在 MySQL 服务器上准备并执行一条语句。
$statement = $connection->prepare($validationQuery);
$statement->bind_param("ss",$user,$password);
$executed = $statement->execute();
mysqli_stmt::store_result()
用于存放内部缓冲区中的数据。它 returns true
当数据被正确缓冲时。 它不需要任何参数!
$stored = $statement->store_result($statement);
mysqli_stmt::num_rows()
returns 缓冲的行数 。 它不需要任何参数!
$queryRows = $statement->num_rows($statement);
执行此代码后,$stored
将始终为真。即使结果集有 0 行。这意味着将执行下一条语句。
if ($stored) {
header("Location: ../views/home.php");
exit();
}
到此,您的脚本结束。您重定向到另一个页面并退出当前页面。清除内部缓冲区,清理语句,关闭连接。
下面两行是空操作代码:
mysqli_stmt_close($statement);
mysqli_close($connection);
我不确定您的意图到底是什么,但考虑到这是一个登录脚本,我会说您想从语句中检索数据,而不是行数。我会删除 store_result()
并改用 get_result()
。
$statement = $connection->prepare($validationQuery);
$statement->bind_param("ss",$user,$password);
$executed = $statement->execute();
$result = $statement->get_result();
$userRecord = $result->fetch_assoc();
if($userRecord && password_verify($password, $userRecord['hash']) {
$_SESSION['userId'] = $userRecord['id'];
header("Location: ../views/home.php");
exit();
} else {
header("Location: ../views/login.php?error=userError");
exit();
}
// NO MORE CODE SHOULD GO HERE. NO PHP, no HTML, nothing. This is the end of the script!
我的示例当然像每个登录脚本一样使用密码散列。您需要调整您的 SQL 声明以说明这一点。