2009-12-10 95 views
0

我正在开发一个内容管理系统,到目前为止这么好。如果不遵循正确的程序?

我试图让系统与维护模式系统一起工作。 这是在脚本中的代码,以显示维护东西:

if ($maintenance['value'] == "1") {?> 
    <div id="content"> 
    <div id="errmsg"> 
     <?php echo $maintenance['notes']; ?> 
    </div> 
    </div> 
<? } else {?> 

    <h1><?php echo $title; ?></h1> 
    <hr /><br /> 
    <div id="content"> 
    <?php echo $contents; 
    if (!$content) { 
     include ('includes/error/404.php');}?> 
    </div>    
<? } ?> 

我可以验证$维护[“值”]变量工作,因为它应该,但该部O的脚本不能正常工作正如它应该。该值目前设置为1,但它仍然在else中显示这些内容。

任何想法?

+1

为什么两个'}'关闭你的'else'语句时? – Sampson 2009-12-10 21:59:06

+0

复制时一定是一个神器,我看不到另一个右括号 – bear 2009-12-10 22:59:46

+2

另外,我建议不要使用短php标记。使用完整的。 – 2009-12-10 23:02:31

回答

1

我第二个Cassy的建议表示法。我的发言:

我真的不知道如何PHP确实处理的数据类型,但我只是检查this site,并根据这一点,你的表情应该评估为真,即使$maintenance['value']持有整数1(你是它比较字符串"1")。

什么是其他值,$maintenance['value']可以容纳? “0”?如果是这样,为什么不把TRUEFALSE分配给变量,以保存?无论如何,也许你可以尝试只写你的表情是这样的:

<?php if ($maintenance['value']) : ?> 

这个计算结果为TRUE如果$maintenance['value']持有任何这些值:

  • 真正
  • 任意整数! = 0
  • “1”
  • 任意字符串!=“0”
1

看起来你有一个额外的}跟在你的else声明。

3

您可以尝试使用不同的语法。不用打开大括号,你可以使用

<?php if ($maintenance['value'] == "1") : ?> 

    <!-- HTML STUFF HERE --> 

<?php ELSE: ?> 

    <!-- more html stuff here --> 

<?php ENDIF; ?> 

根据我的经验,PHP解析器可以更好地解析它。

又见the PHP manual for the alternative syntax

+0

有趣的是,这并没有做任何事情:■ – bear 2009-12-10 23:04:27

+0

但它是更容易阅读这种方式;) – 2009-12-10 23:50:10

1

如何扭转的办法?

if (!isset($maintenance['value'])) { ?> 

// echo normal non-maintenance stuff 

<?php } else { ?> 

// display maintenance stuff 

<?php 

} 

这样你就知道是否设置了maintenance变量。并希望,也许与echo "<pre>" . print_r(get_defined_vars(),true) . "</pre>";明白为什么。

而且,只是因为我通常在首次运行残暴和失忆通过if/else语句,你确定你是在现场的代码中使用的比较,而不是分配,运营商?

邮政响应编辑以如下评论从OP:

,可能无法正常工作,在数据库中的值是1或0。我应该在OP作出更清楚。

如果您知道$维护[“值”]为布尔值,1或0,那么为什么不利用这些知识,使:

if ($maintenance['value'] == "0") { ?> 

// echo normal non-maintenance stuff 

<?php } elseif ($maintenance['value'] == "1") { 

// display maintenance stuff 

<?php } else { 

echo "<pre>" . print_r(get_defined_vars(),true) . "</pre>"; 

} 

然后你就知道到底发生了什么。虽然没有,当然,为什么。这可能是你的问题的重点。

+0

可能无法正常工作,在价值数据库是1或者0。我应该在OP中做得更清楚。 – bear 2009-12-10 23:16:06

1

正如其他人所说,你试图比较一个int和一个字符串。您可以使用“1”或1,或“0”或0来更改所有内容。另一种更好的方法是使用类型特定的比较运算符(如===!==)来匹配值和类型;并使用布尔术语true和false来让你和解释者对你想要做的事情感到痛苦。

您也可以尝试使用define("MAINTENANCE", true);例如,以确保该值不通过脚本中途改变。尽管如此,除非您为文件写入新值,否则这可能会使更改服务器端设置变得更加困难。尽管随后有可能是你写在服务器尝试读取另一个客户端的文件的问题...