我的代码在使用时中断 - 不期待 T_ELSE,期待 T_FUNCTION
Posted
技术标签:
【中文标题】我的代码在使用时中断 - 不期待 T_ELSE,期待 T_FUNCTION【英文标题】:My Code breaks when taken - not expecting T_ELSE, expecting T_FUNCTION 【发布时间】:2011-05-15 22:21:29 【问题描述】:我已经在 lamp、wamp 和 xampp 上尝试过我的代码——它只在 lamp 上工作。但是,如果我将 php.ini 文件从 lamp 换成 xampp,它就可以工作 - 因此,我推测我在 LAMP 上以一种草率的方式进行编码,而我的 php.ini 令人恼火地允许这样做。
目前,我的 LAMP php.ini 破坏了我的 xampp mysqli,在我看来,我的灯代码无论如何都必须是脏的,所以我想知道你们是否可以看到这里需要清理什么?
class datamanagement
protected $mysql_host = "localhost";
protected $mysql_username = "root";
protected $mysql_password = "";
protected $mysql_database = "data";
protected $security_table = "users";
function __construct($security_level = 0)
$this->security($security_level);
protected function mysql_connect_func()
// ...standard mysql connect stuff
protected function security($security_level)
session_start();
if(isset($_GET['logout']))
session_unset();
if($security_level > 0)
if(!isset($_SESSION['initiated']))
if(!isset($_POST['username']) || empty($_POST['username']) || empty($_POST['password']))
if(isset($_GET['logout']))
$string = rtrim($_SERVER['PHP_SELF'], '?logout');
?>
<div class="main_container">
<div class="form_container">
<?php
if(isset($_GET['logout']))
echo "<p>successfully logged out</p>";
else
echo "<p>Access to this section require logging in</p>";
?>
<form method="post" action="<?php echo $string ?>"><input
type="hidden" name="login" value="true"></input>
<div><label for="title">Username:</label> <input name="username"
type="text" value="<?php echo $_POST['username']; ?>"></input><?php if(isset($_POST['username']) && $_POST['username'] == '')echo "username required";?><br>
</div>
<div><label for="post">Password:</label> <input name="password"
type="password"></input><?php if(isset($_POST['username']) && $_POST['password'] == '')echo "password required";?><br>
</div>
<input type="submit" value="Sign in" name="submit"></input></form>
</div>
</div>
<?
exit();
// end if - no username or password were posted
else
$this->mysql_connect_func();
$sql = "SELECT * FROM " . $this->security_table . " WHERE username='" . $_POST['username'] . "'";
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_assoc($result);
if(mysql_num_rows($result) != 0)
if(sha1($_POST['password']) == $row['password'])
session_regenerate_id();
$_SESSION['initiated'] = "true";
$_SESSION['username'] = $row['username'];
$_SESSION['authority'] = $row['authority'];
// end if sha1 of $_POST password == $row password
else
?>
<div class="main_container">
<div class="form_container">
<?php
echo 'Incorrect password<br><a href="' . $_SERVER['PHP_SELF'] . '">Please try again</a>';
?>
</div>
</div>
<?php
exit();
// if password is wrong
// end if no rows with username returned
else
?>
<div class="main_container">
<div class="form_container">
<?php
echo 'Incorrect username <br><a href="' . $_SERVER['PHP_SELF'] . '">Please try again</a>';
?>
</div>
</div>
<?php
exit();
// if username not found
// end else - no username or password were posted
// end if - check the session !initiated
else //*THIS IS THE LINE THAT THROWS THE ERROR IN XAMPP AND WAMP*
if($_SESSION['authority'] < $security_level)
die("security clearance insufficient");
// end else - check the session !initiated
// end if $security_level <= 0
// end of function security()
很抱歉,这是一段如此庞大的代码,我想不出一种合乎逻辑的方法来分解它而不损害某人帮助我找到错误的能力。如果你们对将野兽的大小降低到更易读的数量有任何建议,请说!
【问题讨论】:
无论如何,你一定要重构你的代码!这种深度嵌套的if-else
结构很难维护。尝试更多地分离 html 和 PHP 并考虑使用alternative syntax for control structures
Felix - 兴致勃勃地阅读。我开始认为我已经达到了像这样筑巢的能力的尽头。
微笑着,恐怕你是在一个新手面前。我会用谷歌搜索为什么会这样,非常感谢您提供的提示!
我建议你在适用的情况下养成逃避的习惯(XSS 现在是一个真正的问题!)。出于这个原因,即使您的 SQL 查询也处于危险的边缘 - 尽管转义只是那里的第二选择,但准备/执行是第一选择。您可能已经找到了一些解释 $_SERVER['PHP_SELF'] 和 XSS 的网站——请考虑使用 $_SERVER['SCRIPT_NAME']。
我听从了你的建议,换成了 htmlentities($_SERVER['SCRIPT_NAME']),面带微笑。非常感激你的帮助。 :)
【参考方案1】:
我不确定这是否会对您有所帮助 - 但是在 第 67 行中,您在 $string
变量之后缺少一个终端 ;
。
更轻松一点 - </input>
标签不是 HTML 严格标记的一部分...
改用<input type="submit" value="Sign in" name="submit" />
【讨论】:
以上是关于我的代码在使用时中断 - 不期待 T_ELSE,期待 T_FUNCTION的主要内容,如果未能解决你的问题,请参考以下文章