- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 friend 系统,当用户访问另一个用户的个人资料时,他们会看到一个添加 friend 选项,当他们访问自己的个人资料时,他们可以看到其他东西而不是添加 friend 选项,如 TOTAL FRIENDS(或类似选项),当 guest 访问(未登录)时,他们也会看到不同的页面。总而言之,我需要在一个页面上显示三个 View :
user != user_id
user == user_id
就我现在而言,我设置脚本的方式出了点问题。 session 似乎无法在适当的实例下工作。
header.php:
<?php
include ( "./inc/connect.inc.php" );
session_start();
if (isset($_SESSION['user_login'])) {
$user = $_SESSION['user_login'];
}
else {
$user = "";
}
?>
配置文件.php:
<?php include ( "./inc/header.inc.php" );
if (isset($_GET['u'])) {
$username = mysql_real_escape_string($_GET['u']);
if (ctype_alnum($username)) {
//check user exists
$check = mysql_query("SELECT username, first_name FROM users WHERE username='$username'");
if (mysql_num_rows($check)===1) {
$get = mysql_fetch_assoc($check);
$username = $get['username'];
$firstname = $get['first_name'];
}
else {
echo "<meta http-equiv=\"refresh\" content=\"0; url=http://localhost/tutorials/index.php\">";
exit();
}
}
}
$optionbox = "";
if (isset($_SESSION['user_login']) != $user){
$optionbox = '<div style="border:#CCC 1px solid; padding:5px; background-color:#E4E4E4; color:#999; font-size:11px;">
<a href="#">Add friend</a>
</div>';
}
else if (isset($_SESSION['user_login']) == $user){
$optionbox = '<div style="border:#CCC 1px solid; padding:5px; background-color:#E4E4E4; color:#999; font-size:11px;">
<a href="#">friend list</a>
</div>';
}
else {
$optionbox = '<div style="border:#CCC 1px solid; padding:5px; background-color:#E4E4E4; color:#999; font-size:11px;">
</div';
}
?>
还尝试使用 ['u']
而不是 user_login
,前两种情况都在选项框中显示添加好友或好友列表。
最佳答案
有几件事可以帮助您。为了清楚起见,我做了注释:
<?php
// Add connection here...(should be a PDO or mysqli_)
session_start();
// Add a simple true/false function to test for logged in
// Would be better included on this page rather than written (like connection)
function is_loggedin()
{
return (!empty($_SESSION['user_login']));
}
// Make a function to test if the logged-in user is currently viewing own profile
// Would be better included on this page rather than written (like connection)
function is_profile($user = false)
{
if(!$user)
return false;
return (is_loggedin() && ($_SESSION['user_login'] == $user));
}
// Presumably you would have profile.php?u=23432 or similar
// If no user requested just assign false
$user = (!empty($_GET['u']) && ctype_alnum($_GET['u']))? $_GET['u'] : false;
// If the user is valid (not empty)
// Would be better included on this page if condition is met otherwise
// It just kind of loads extra lines for nothing
if($user != false) {
// You should not be using mysql_ anymore, PDO or mysqli_ with prepared/bound statements
$username = mysql_real_escape_string($user);
//check user exists
$check = mysql_query("SELECT username, first_name FROM users WHERE username='$username'");
if (mysql_num_rows($check) === 1) {
$get = mysql_fetch_assoc($check);
$username = $get['username'];
$firstname = $get['first_name'];
}
else {
echo "<meta http-equiv=\"refresh\" content=\"0; url=http://localhost/tutorials/index.php\">";
exit;
}
}
// Just do one wrapper
$optionbox[] = '<div style="border:#CCC 1px solid; padding:5px; background-color:#E4E4E4; color:#999; font-size:11px;">';
// Check if a user is logged in
if(is_loggedin())
// If the logged in user matches the $_GET user
$optionbox[] = (!is_profile($user))? '<a href="#">Add friend</a>' : '<a href="#">friend list</a>';
// If user is not logged in
else
$optionbox[] = '<h3>You must be logged in to view stuff and things</h3>';
// Finish wrapper
$optionbox[] = '</div>';
// Write to page
echo implode(PHP_EOL,$optionbox);
?>
编辑:
自从最初发布这个答案以来,我有几个赞成票,我不想引用诸如在此处添加连接...(应该是 PDO 或 mysqli_)之类的东西 没有实际显示,所以这里用适当的连接等进行了一些重写。 function.PDOConnect.php
是填充数据库凭证的地方:
/classes/class.DBDriver.php
<?php
// Have a general driver interface incase you need different database
// connection interfaces (MSSQL, etc)
interface DBDriver
{
public static function connect($user,$pass,$host,$dbname);
}
/classes/class.Database.php
<?php
// Create MySQL PDO Connection based on the DBDriver preferences
class Database implements DBDriver
{
// This will store our connection for reuse
private static $singleton;
// This will store the connection options
protected static $dbOpts;
// This is the actual connecting to database
public static function connect($user,$pass,$host,$dbname)
{
if(isset(self::$singleton))
return self::$singleton;
if(!isset(self::$dbOpts))
self::SetDatabaseAttr();
try {
self::$singleton = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass, self::$dbOpts);
self::$singleton->exec('SET NAMES "utf8"');
}
catch(PDOException $e){
echo "unable to connect to server";
exit;
}
return self::$singleton;
}
// This sets the options for your database.
public static function SetDatabaseAttr($value = false,$refresh = false)
{
if(!is_array($value) || empty($value)) {
self::$dbOpts[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
self::$dbOpts[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_ASSOC;
self::$dbOpts[PDO::ATTR_EMULATE_PREPARES] = false;
}
else {
if(empty(self::$dbOpts) || $refresh)
self::$dbOpts = array();
foreach($value as $DBKey => $DBValue)
self::$dbOpts[$DBKey] = $DBValue;
}
return self::$dbOpts;
}
}
/classes/class.QueryEngine.php
<?php
// This class can be expanded out to do a lot more than just fetch from the database
class QueryEngine
{
protected $query;
private static $singleton;
// Create and Return instance of itself
public function __construct()
{
if(!empty(self::$singleton))
self::$singleton = $this;
return self::$singleton;
}
// Basic query method
public function query($sql = false, $bind = false)
{
AutoloadFunction("PDOConnect");
$con = PDOConnect();
$this->query = $con->prepare($sql);
if(!empty($bind)) {
foreach($bind as $key => $val) {
$bindVals[":{$key}"] = $val;
}
$this->query->execute($bindVals);
}
else
$this->query->execute();
return $this;
}
// This function is what returns the array in conjunction with
// the query method
public function Fetch()
{
if($this->query) {
while($row = $this->query->fetch(PDO::FETCH_ASSOC)) {
$result[] = $row;
}
}
return (!empty($result))? $result : 0;
}
}
/functions/function.AutoLoadClasses.php
<?php
// This function is what is used to autoload classes on the fly
// There is no need to include class files, so long as they are in the
// /classes/ folder
function AutoLoadClasses($className) {
if(class_exists($className)) {
return;
}
if(is_file(CLASSES_DIR."/class.".$className.'.php')) {
include_once(CLASSES_DIR."/class.".$className.'.php');
}
}
/functions/function.AutoloadFunction.php
<?php
// This will attempt to load the required file to run a specified function
// Similar to the autoloader for the classes, only this is required to be
// manually called like: AutoloadFunction("myfunction"); before function use
function AutoloadFunction($function = false,$loaddir = false)
{
if($function == false)
return false;
if(strpos($function,","))
$functions = explode(",",$function);
$function_dir = ($loaddir != false && !is_array($loaddir))? $loaddir.'/function.': FUNCTIONS_DIR.'/function.';
if(!isset($functions)) {
$functions[] = $function;
}
for($i = 0; $i < count($functions); $i++) {
// Function name
$addfunction = $functions[$i];
// See if function exists
if(!function_exists($addfunction)) {
$dir = $function_dir.$addfunction.'.php';
if(is_file($dir)) {
include_once($dir);
}
}
}
}
/functions/function.PDOConnect.php
<?php
// Just make a quick PDO function to return your PDO Connection
// populate the arguements with your database credentials
function PDOConnect($user = "username",$pass = "password",$host = "hostname",$data = "databasename")
{
return Database::connect($user,$pass,$host,$data);
}
/functions/function.query_fetch.php
<?php
// Here is a quick array fetching function using the query engine class
function query_fetch($sql = false,$bind = false)
{
$qEngine = new QueryEngine();
return $qEngine ->query($sql,$bind)
->Fetch();
}
/functions/function.is_loggedin.php
<?php
// Add a simple true/false function to test for logged in
function is_loggedin()
{
return (!empty($_SESSION['username']));
}
/functions/function.is_profile.php
<?php
// Make a function to test if the logged-in user is currently viewing own profile
function is_profile($user = false)
{
if(!$user)
return false;
AutoloadFunction("is_loggedin");
return (is_loggedin() && ($_SESSION['username'] == $user));
}
/functions/function.get_profile.php
<?php
// This will fetch the user based on a get variable
function get_profile($username = false)
{
// Presumably you would have profile.php?u=23432 or similar
// If no user requested just assign false
$user = (!empty($_GET['u']) && ctype_alnum($_GET['u']))? $_GET['u'] : false;
$array['username'] = false;
$array['first_name'] = false;
// If the user is valid (not empty)
// Would be better included on this page if condition is met otherwise
// It just kind of loads extra lines for nothing
if($user != false) {
AutoloadFunction("query_fetch");
//check user exists
$get = query_fetch("SELECT `username`, `first_name`,`ID` FROM `users` WHERE `username` = :0",array($user));
if ($get != 0) {
$array['username'] = $get[0]['username'];
$array['ID'] = $get[0]['ID'];
$array['first_name'] = $get[0]['first_name'];
return ($username)? $array['username'] : $array;
}
else {
header("location: http://localhost/tutorials/index.php");
exit;
}
}
return $array;
}
config.php
<?php
// Define some basic locational constants
define("ROOT_DIR",__DIR__);
define("CLASSES_DIR",ROOT_DIR."/classes");
define("FUNCTIONS_DIR",ROOT_DIR."/functions");
// Load up the functions autoloader
include_once(FUNCTIONS_DIR."/function.AutoloadFunction.php");
// Load up the function for class autoloading
AutoloadFunction("AutoLoadClasses");
// Apply the autoloader for classes
spl_autoload_register('AutoLoadClasses');
profile.php
<?php
session_start();
// Load all the settings to make things work.
include(__DIR__."/config.php");
?>
<div style="border:#CCC 1px solid; padding:5px; background-color:#E4E4E4; color:#999; font-size:11px;">
<?php
// Using the "AutoloadFunction" should save execution time because
// it will only load functions it needs instead of loading all the functions
// it could "potentially" need.
AutoloadFunction("is_loggedin");
// Check if a user is logged in
if(is_loggedin()) {
AutoloadFunction("get_profile,is_profile");
// Fetch the profile of current user query
$user = get_profile();
// If the logged in user matches the $_GET user
echo (!is_profile($user['username']))? '<a href="?action=add&u='.$user['ID'].'">Add '.ucwords($user['first_name']).'</a>' : '<a href="#">friend list</a>';
}
// If user is not logged in
else {
?>
<h3>You must be logged in to view stuff and things</h3>
<?php }
?>
</div>
关于php - 如何在配置文件页面上显示不同的 session 状态(访客 View 与用户配置文件 View ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32450076/
是否为每个 Shiny session 分配了 session ID/ session key (如果部署在 Shiny 服务器上)?如果是,我如何访问该信息?我已阅读文档here然而上网查了一下,并
我正在使用 this koajs session 模块。 我检查了源代码,但我真的无法理解。 我想知道它保存 session 数据的位置,因为我没有看到创建的文件,并且当服务器重新启动时, sessi
实现高可扩展性的一种方法是使用网络负载平衡在多个服务器之间分配处理负载。 这种方法提出的一个挑战是服务器是否具有状态意识 - 将用户状态存储在“ session ”中。 此问题的一个解决方案是“粘性
在负载平衡服务器的上下文中, session 亲和性和粘性 session 之间有什么区别? 最佳答案 我见过这些术语可以互换使用,但有不同的实现方式: 在第一个响应中发送 cookie,然后在后续响
我希望其他人向我解释哪种方法更好:使用 session 或设计无 session 。我们正在开始开发一个新的 Web 应用程序,但尚未决定要遵循什么路径。 无 session 设计在我看来更可取: 优
现在用户在他的权限中有很多角色,我将允许他点击 href 并在新窗口中扮演另一个角色。每个角色都有自己的 session 。 既然浏览器打开窗口不能用新 session 打开,我必须在服务器端想办法。
我正在尝试为express.js Node 应用程序实现 session 存储我的问题是: 如何删除具有浏览器 session 生命周期的 cookie(根据连接文档标记有 expires = fal
在开始在 golang 中使用 session 之前,我需要回答一些问题 session 示例 import "github.com/gorilla/sessions" var store = ses
我读过 Namespaced Attributes . 我尝试使用此功能: #src/Controller/CartController.php public function addProduct(
我正在努力完成以下工作: 根据用户的类型更改用户的 session cookie 到期日期。 我有一个 CakePHP Web 应用程序,其中我使用 CakePHP session 创建了我的身份验证
这是我在这里的第一个问题,我希望我做对了。 我需要处理一个 Java EE 项目,所以在开始之前,我会尝试做一些简单的事情,看看我是否能做到。 我坚持使用有状态 session Bean。 这是问题:
ColdFusion session 与 J2EE session 相比有什么优势吗? ColdFusion session documentation提到了 J2EE session 的优点,但没有
在执行任何任务之前,我需要准确地在创建 session 时创建一个 session 范围变量(因为我的所有任务都需要一个初始 session 范围变量才能运行)。因为,创建 session 时,gra
我们当前的应用使用 HTTP session ,我们希望将其替换为 JWT。 该设置仅允许每个用户进行一次 session 。这意味着: 用户在设备 1 上登录 用户已在设备 1 上登录(已创建新 s
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
假设我在两个或更多设备上打开了两个或更多用户 session (同一用户没有管理员权限)。 在当前 session 中,如果我注销,是否意味着所有其他 session 也会关闭?如果没有,有没有办法通
我正在评估在 tomcat 中使用带有 session 复制的粘性 session 的情况。根据我的初步评估,我认为如果我们启用 session 复制,那么在一个 tomcat 节点中启动的 sess
我开始使用 golang 和 Angular2 构建一个常规的网络应用程序,最重要的是我试图在 auth0.com 的帮助下保护我的登录.我从 here 下载快速入门代码并尝试运行代码,它运行了一段时
我在 Spring Controller 中有一个方法,它接受两个相同类型的参数其中一个来自 session ,另一个来自表单提交(UI)。 问题是在 Controller 方法中我的非 sessio
在我登录之前,我可以点击我的安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。如您所料。 登录后,我可以继续我的业务,并访问我的安全约束内外的资源。
我是一名优秀的程序员,十分优秀!