- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
嗨我在使用 PHP 页面时遇到一些问题:我正在使用 this 编写一些 CMS教程。我设法编写了一个用于与菜单交互的类,并且一切正常:我可以在一个页面中插入、删除和获取菜单的所有项目,我可以在其中重新排序它们。当我开始为用户编写相同的页面时,我遇到了一个问题:我正在使用哨兵类来验证每个页面中的用户:
require_once('../includes/Sentry.php');
$theSentry = new Sentry();
if (!$theSentry->checkLogin(1) ){ header("Location: index.php"); die(); }
现在:如果我单独使用这个验证,页面运行良好,但我需要查询数据库并提取 user_admin.php 页面中的所有用户:
require_once('../includes/DbUser.php');
$user_connector = new DbUser();
$all_users = array();
$all_users = $user_connector->getUserArray();
foreach($all_users as $id => $user){ echo " ... " };
如果我评论两个部分之一,一切正常,但如果我让这段代码一起运行,页面会正确创建,但下次我使用 Sentry 类运行页面时,我将被重定向到登录有错误的页面。 Sentry 类使用 Validator 类来检查凭据,并且此类中的一个方法正在报告数组输入而不是单个值输入。
我的问题是:从两个不同类创建的两个不同对象怎么可能交互产生这样的问题?我想你需要这两种方法的代码:
class Sentry {
...
function checkLogin($group=9,$user='',$pass='',$goodRedirect='',$badRedirect='') {
// Include database and validation classes, and create objects
require_once('DbConnector.php');
require_once('Validator.php');
$validate = new Validator();
$loginConnector = new DbConnector();
// If user is already logged in then check credentials
if ($_SESSION['user'] && $_SESSION['pass']){
// Validate session data
if (!$validate->validateTextOnly($_SESSION['user'])){return false;}
if (!$validate->validateTextOnly($_SESSION['pass'])){return false;}
if ($_SESSION['gruppo'] <= $group){
// Existing user ok, continue
if ($goodRedirect != '') {
header("Location: ".$goodRedirect) ;
}
return true;
}else{
// Existing user not ok, logout
//$this->logout();
header("Location: low_perm.php");
die;
//return false;
}
// User isn't logged in, check credentials
}else{
// Validate input
if (!$validate->validateTextOnly($user)){return false;}
if (!$validate->validateTextOnly($pass)){return false;}
// Look up user in DB
$getUser = $loginConnector->query("SELECT * FROM `utenti` WHERE `usr` = '".$user."' AND `psw` = PASSWORD('".$pass."') AND `gruppo` <= ".$group." AND `attivo` = 1");
$this->userdata = $loginConnector->fetchArray($getUser);
if ($loginConnector->getNumRows($getUser) > 0){
// Login OK, store session details
// Log in
$_SESSION["user"] = $user;
$_SESSION["pass"] = $this->userdata['pass'];
$_SESSION["gruppo"] = $this->userdata['gruppo'];
if ($goodRedirect) {
header("Location: ".$goodRedirect);
}
return true;
}else{
// Login BAD
unset($this->userdata);
if ($badRedirect) {
header("Location: ".$badRedirect) ;
}
return false;
}
}
}
}
这是获取用户的函数:
class DbUser extends DbConnector{
...
function getUserArray() {
while ($row = mysql_fetch_object($this->user_result)) {
$this->users[$row->id] = $row;
}
return $this->users;
}
}
我知道这是一个难以解释的问题,所以如果我需要指定其他内容,请告诉我...谢谢
编辑:错误出现在 Validator 类和此函数中(带有 preg_match() 的行):
function validateTextOnly($theinput,$description = ''){
$result = preg_match ("/^[A-Za-z0-9\ ]+$/", $theinput );
if ($result AND $theinput!=''){
return true;
}else{
$this->errors[] = $description;
return false;
}
}
好消息:我找到了错误所在,但我无法理解为什么这段代码不起作用:
$user_connector = new DbUser();
$all_users = array();
$all_users = $user_connector->getUsers();
foreach($all_users as $id => $user){ ... }
foreach 语句是重点:当我使用 $all_user
作为 $id=>$user
时,它实际上覆盖了 $_SESSION['user '] 与循环中使用的最后一个对象(“用户”对象)。任何人都可以向我解释局部变量如何覆盖 session 变量?我想说清楚:我解决了问题(将 $id => $user
更改为 $id => $userObj
),但我正在寻找一个解释。谢谢!
最佳答案
我遇到了和你完全一样的问题,在我的例子中,这是因为 PHP 的全局寄存器被打开了。
Register globals 是一个 php 配置设置,它为 $_SESSION 中设置的每个变量创建一个局部变量。这意味着当你设置 $_SESSION['user'] 时,也会为你创建一个局部变量 $user。如果您在代码中覆盖此变量,正如您报告的那样,新值也将设置在 $_SESSION 中。有关注册全局变量的更多信息,请查看 here .
要关闭此设置,您必须编辑为您正在使用的网络服务器加载的 php.ini 文件,并将 register_globals 设置设置为关闭,然后重新启动您的网络服务器。请记住,如果您计划在任何其他网络服务器上运行此代码,则还必须关闭此设置以使您的代码正常运行。
关于php - 局部变量覆盖 PHP 中的 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5934595/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!