Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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_Html - Fatal编程技术网

Php 仅在登录时显示内容

Php 仅在登录时显示内容,php,html,Php,Html,你好,我有个问题。我已经用cookies设置了我的登录系统,它可以正常工作。但我想知道有没有一个更干净的版本可以做到这一点 <? include('../config/db_config.php'); $username = $_COOKIE['user']; $password = $_COOKIE['pass']; $result = mysql_query("SELECT * FROM users WHERE isadmin = 1"); while($row = mysql_

你好,我有个问题。我已经用cookies设置了我的登录系统,它可以正常工作。但我想知道有没有一个更干净的版本可以做到这一点

<?
include('../config/db_config.php');

$username = $_COOKIE['user'];
$password = $_COOKIE['pass'];

$result = mysql_query("SELECT * FROM users WHERE isadmin = 1");

while($row = mysql_fetch_array($result))
{
    if($username == $row['username'] && $password == $row['password'])
    {
        //User entered correct username and password
        echo("ALLOW");
    }
    else
    {
        //User entered incorrect username and password
        echo("DENY");
    }
}
?>


你看,我想所有我的内容显示,只有当我作为管理员登录。那么,现在唯一的方法是回显我的HTML/PHP/Javascript,而不是回显ALLOW,因为如果我只在其中包含(“somepage.PHP”),该页面仍然可以在不登录的情况下使用,即使我在那里做同样的检查,我仍然会呼出所有信息。

我建议你只做一次这样的操作,当用户第一次访问页面时,然后在其余时间设置$u会话['is_admin']或其他什么,这样,您就不必在每个页面上进行额外的db调用。

您可以在登录页面(或检查登录的任何页面)上设置一个会话变量,该变量存储用户是否登录,并在页面间保持不变。然后,您可以简单地将管理员html包装在if语句中,如下所示:

<?php
if ($_SESSION['isAdmin'] == true) {
?>
<p>My admin html</p>
<?php
} else {
?>
<p>My non-admin html</p>
<?php
}
?>

我的管理员html

我的非管理员html

要在会话中保存信息,只需将其添加到您有
echo(“允许”)的部分即可
$\u会话['isAdmin']=true

您还需要添加
session_start()到脚本顶部。

  • 为什么要加载每个用户,然后比较用户名和密码?加载与用户名和密码匹配的单个用户不是更容易吗

  • 加载单个用户将允许删除
    while()

  • 在PHP中,不要使用
    mysql\u查询
    do使用PDO(如果需要,通过谷歌了解为什么更好)

  • 检查您的输入(我同意,这里是完全可选的)

  • 切勿以纯文本格式存储密码

您可能可以这样做(我已经多年没有使用PHP/PDO了,所以代码可能不精确):

您可以始终将“somepage.php”放在文档根上。这是防止直接执行的常见方法

例如,如果您的Web服务器看起来像'project/public_html/index.php',请将您的管理员仅包含在'project/somepage.php'中,然后使用类似include(../somepage.php)的内容引用它


显然,这需要根据您使用的实际路径进行调整。

如果权限发生更改,我假设有一个登录过程,然后可以设置会话变量。我认为这可能是完成OP的最简单方法。我不是一个PHP的人,但如果这是像ASP,那么它将只在满足条件时呈现html,这只会向管理员显示内容。好的,谢谢你,我不知道这一点,现在我明白了。不客气。您可以通过将访问变量保存为int来扩展它,使其具有多个访问级别或任何您喜欢的级别。此外,您可能希望只查询用户名/密码,而不是获取所有用户。其他人在下面提到了这一点,永远不要忘记SQL注入。我认为如果存在(…
部分,
中可能缺少一个括号。另外,根据,
sha1($password);
将是一个40个字符的字符串,而不是20个字符。为了安全起见,请阅读@MainMa的帖子!
if (strlen($username)> 128)
{
    // Something wrong. The username is too long.
}

$hash = sha1($password);
$sth = $dbh->prepare('if exists(select * from users where isadmin = 1 and username = :username and password = :password) select 1 else select 0');
$sth->bindParam(':username', $username, PDO::PARAM_STR, 128);
$sth->bindParam(':password', $hash, PDO::PARAM_STR, 40);
$sth->execute();
$isFound = $sth->fetchAll();
if ($isFound)
{
    // User entered correct username and password.
    echo 'ALLOW';
}