Php 仅允许已确认的用户登录不工作
我使用下面的代码来确保只有已确认的用户(已确认为1,否则为0)才能登录,但无论发生什么情况,此代码都会显示道歉消息。我怎样才能解决这个问题?谢谢Php 仅允许已确认的用户登录不工作,php,Php,我使用下面的代码来确保只有已确认的用户(已确认为1,否则为0)才能登录,但无论发生什么情况,此代码都会显示道歉消息。我怎样才能解决这个问题?谢谢 // make sure the user is confirmed $confirmstatus = query("SELECT * FROM users WHERE username = ?", $_POST["username"]); if ($confirmstatus["confirmed"] == 0) {
// make sure the user is confirmed
$confirmstatus = query("SELECT * FROM users WHERE username = ?", $_POST["username"]);
if ($confirmstatus["confirmed"] == 0)
{
apologize("Please first confirm your account.");
}
这是查询函数
/**
* Executes SQL statement, possibly with parameters, returning
* an array of all rows in result set or false on (non-fatal) error.
*/
function query(/* $sql [, ... ] */)
{
// SQL statement
$sql = func_get_arg(0);
// parameters, if any
$parameters = array_slice(func_get_args(), 1);
// try to connect to database
static $handle;
if (!isset($handle))
{
try
{
// connect to database
$handle = new PDO("mysql:dbname=" . DATABASE . ";host=" . SERVER, USERNAME, PASSWORD);
// ensure that PDO::prepare returns false when passed invalid SQL
$handle->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch (Exception $e)
{
// trigger (big, orange) error
trigger_error($e->getMessage(), E_USER_ERROR);
exit;
}
}
// prepare SQL statement
$statement = $handle->prepare($sql);
if ($statement === false)
{
// trigger (big, orange) error
trigger_error($handle->errorInfo()[2], E_USER_ERROR);
exit;
}
// execute SQL statement
$results = $statement->execute($parameters);
// return result set's rows, if any
if ($results !== false)
{
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
else
{
return false;
}
}
这就是道歉功能
/**
* Apologizes to user with message.
*/
function apologize($message)
{
render("apology.php", ["message" => $message]);
exit;
}
和渲染函数
/**
* Renders template, passing in values.
*/
function render($template, $values = [])
{
// if template exists, render it
if (file_exists("../templates/$template"))
{
// extract variables into local scope
extract($values);
// render header
require("../templates/header.php");
// render template
require("../templates/$template");
// render footer
require("../templates/footer.php");
}
// else err
else
{
trigger_error("Invalid template: $template", E_USER_ERROR);
}
}
尝试运行:
$confirmstatus = query("SELECT * FROM users WHERE username = ?", $_POST["username"]);
print_r($confirmstatus);
再次检查函数是否实际返回数组
也可以尝试将此作为您的查询:
$Checkusername = $_POST['username'];
$confirmstatus = query("SELECT * FROM users WHERE username = '$Checkusername'");
还有。你的
function query(/* $sql [, ... ] */)
{ }
传递给函数的变量已注释掉。如果这与您的代码完全相同。。然后,我建议对以下内容进行修订:
function query ($sql)
{ .... }
编辑
if ($confirmstatus["0"]['confirmed'] == 0)
{
apologize("Please first confirm your account.");
}
我忽略了一些事情。看起来您得到的是一个多维数组
您需要查看第一个数组(在本例中为0),然后查找所需字段。请改用此字段:
$confirmstatus返回一个包含其余部分的数组
$confirmstatus=query(“从username=?”的用户中选择*,$\u POST[“username”]);
如果($confirmstatus[0][“confirm”]==0)
{
道歉(“请先确认您的账户。”);
}请将您的功能代码贴在第一块代码旁边。你确定你的“query();”是以正确的方式运行的吗?这是查询函数。你已经给出了查询函数,但另一个因素是你的“道歉”函数刚刚尝试打印,我得到了这个:数组([0]=>Array([id]=>20[confirm]=>1[username]=>test[hash]=>1$l4VE9aAZ$updmv68k9y255hr/FbJJ.[firstname]=>[lastname]=>))您的查询正在正确运行,请尝试将您的检查代码更改为我将要更新的新编辑。这应该行得通。当你尝试的时候,报告你的发现。好的,这是前一个。完全好。很抱歉,开头有点混乱。我忘了拿东西了;从PDO库返回一个多维数组,编码器必须在数组1中查找该多维数组,然后在数组1中找到所述字段。别忘了用绿色勾选标记为答案:)欢迎使用堆栈溢出,请使用。