Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅允许已确认的用户登录不工作_Php - Fatal编程技术网

Php 仅允许已确认的用户登录不工作

Php 仅允许已确认的用户登录不工作,php,Php,我使用下面的代码来确保只有已确认的用户(已确认为1,否则为0)才能登录,但无论发生什么情况,此代码都会显示道歉消息。我怎样才能解决这个问题?谢谢 // make sure the user is confirmed $confirmstatus = query("SELECT * FROM users WHERE username = ?", $_POST["username"]); if ($confirmstatus["confirmed"] == 0) {

我使用下面的代码来确保只有已确认的用户(已确认为1,否则为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中找到所述字段。别忘了用绿色勾选标记为答案:)欢迎使用堆栈溢出,请使用。