Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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 使用会话登录系统,mysqli出错_Php_Mysqli - Fatal编程技术网

Php 使用会话登录系统,mysqli出错

Php 使用会话登录系统,mysqli出错,php,mysqli,Php,Mysqli,大家好,我正在尝试为一个学校项目创建一个简单的登录系统,当我没有实现数据库时,它就开始工作了。但是,正如您现在看到的,我尝试实现数据库,但它工作得不太好,因为我无法在echo的开始和结束处创建PHP标记,不管怎样,有人可以帮我吗? 正如我所说,当我只是写了一个随机的用户名和密码,并且没有任何数据库的东西时,它就工作了 <?php session_start(); include('../inc/dbconnection_inc.php'); $result=my

大家好,我正在尝试为一个学校项目创建一个简单的登录系统,当我没有实现数据库时,它就开始工作了。但是,正如您现在看到的,我尝试实现数据库,但它工作得不太好,因为我无法在echo的开始和结束处创建PHP标记,不管怎样,有人可以帮我吗? 正如我所说,当我只是写了一个随机的用户名和密码,并且没有任何数据库的东西时,它就工作了

  <?php
    session_start();
    include('../inc/dbconnection_inc.php');
    $result=mysqli_query($dbconnection, 'SELECT * FROM users');
    $row=mysqli_fetch_array($result);

    $p=$_POST['password'];
    $u=$_POST['username'];

    if ($u==echo $row["username"] AND $p==echo $row["password"]);
    {
        $_SESSION['username'] = echo $row["username"];
        header("Location: admin.php");
    }
    else
    {
        header("Location: ../index.php");
    }

我不确定您是否需要那里的
echo
。根据手册,echo不返回任何内容

尝试从代码中删除所有的
echo
,如

...
if ($u === $row["username"] && $p === $row["password"])
{
    $_SESSION['username'] = $row["username"];
    header("Location: admin.php");
}
(我通常使用
和&
而不是
,这也可能是原因)

此外,您的代码将只检查第一个获取的行(我想您知道吗?

  • 消除回声
  • 通过添加Where类别选择特定用户
  • 准备好你的座位

什么是
$u==echo$row[“username”]
呢?这是告诉它,如果您键入的用户名和密码在数据库中,您应该能够登录。与其调用整个表并选择它,不如用WHERE命令搜索带有用户名和密码的表。如果它返回的结果为零,那么您就知道无法对它们进行身份验证。实际上,该表只有3个内容,id、用户名和密码。我认为我的问题在于php标记或我不确定的东西……首先,不要使用
使用
&
,因为它优先于
。其次,在if($u==echo$row[“username”]和$p==echo$row[“password”])中删除分号这很可能是这里的问题。将错误报告添加到文件顶部
错误报告(E_ALL);ini设置(“显示错误”,1)它将显示任何发现的错误。另外,不要将密码存储在纯文本中,请使用更安全的方法。非常感谢你,Actine,你让我的日子过得非常愉快!:D你太棒了,也感谢其他人的帮助。当你说只检查第一行时,你到底是什么意思?如果我有更多的成员,它将无法找到他们?@magicrabit-heh,谢谢。事实上,我看到在我打字的时候,原帖的评论者给出了相同的答案,所以也给了他们一些信任<如果我没有弄错的话,code>mysqli\u fetch\u array()
只返回一行(result中的下一行)。因此,要检查所有用户,您必须使用
while($row=mysqli\u fetch\u array($result)){…}
。正如其他人所建议的那样,将查询限制为仅包含WHERE的一行也是正确的做法。问题是,如果我让多个用户说出WHERE“something”将缩小范围,我只能使用其中一行,除非我在数据库中使用文本admin给特定用户组一个冒号,然后写下其中的id admin。或者类似的东西。@magicrabit我不确定你的意思,如果你想检查表中是否存在用户,你需要添加一个WHERE。也许它现在对你有效,因为你只有一条记录。是的,我有点明白你的意思。。。我只是不知道如何真正修复它,因为我相信我必须做一个$id=$GET_uuz[“id”];或者先找个地方,对吗?还是我愚蠢D@MagicRabbit您应该能够使用
用户名
,因为这在您的应用程序中应该是唯一的table@MagicRabbit如果用户名是唯一的(否则有什么意义?它应该是一个标识符,对吗?),那么
select*from username=?
将工作的用户:它将返回1或0个结果,如果有一个结果,你只要检查一下密码。此外,如果您不在数据库中散列密码(因为这是一个实验项目,否则您绝对必须这样做),您也可以将其包含在查询中:
select*from username=?密码=?
$p=$_POST['password'];
$u=$_POST['username'];

$query = 'SELECT * FROM users WHERE username = ?';
if($result=mysqli_query($dbconnection, $query)){

    mysqli_stmt_bind_param($result, "s", $u);

    mysqli_stmt_execute($result);
    $row=mysqli_fetch_array($result);

if ($u == $row["username"] && $p == $row["password"]);
{
    $_SESSION['username'] = echo $row["username"];
    header("Location: admin.php");
}
else
{
    header("Location: ../index.php");
}
}else{
    //fail
}