从索引文件直接调用PHP条件语句(与HTML标记混合)是不好的做法?

时间:2010-07-05 01:00:16

标签: php html conditional

有些人告诉我,以下代码对HTML验证不利:

的index.php:

第1~5行(这个是好的。仅供参考):

<?php include_once 'localization.php'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>

第15行(如果选择中文加载那些CSS文件):

<?php if($lang_file=='lang.zh-tw.php' || $lang_file=='lang.zh-cn.php') 
{echo '<link rel="stylesheet" type="text/css" href="styles/chinese.css" />';} ?>

第21行(如果英语是当前语言的变化,则为其分配类:当前):

<li <?php if($lang_file=='lang.en.php') {echo 'class="current"';} ?>>
<a href="index.php?lang=en">ENGLISH</a></li>

第168~171行(这是我发现在jquery验证插件中添加不同语言的唯一方法):

<?php if($lang_file=='lang.en.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-en.js"></script>';} ?>
<?php if($lang_file=='lang.es.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-es.js"></script>';} ?>
<?php if($lang_file=='lang.zh-tw.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-zh-tw.js"></script>';} ?>
<?php if($lang_file=='lang.zh-cn.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-zh-cn.js"></script>';} ?>

lozalization.php(仅供参考):

<?php
session_start();
header('Cache-control: private'); // IE 6 FIX

if(isSet($_GET['lang'])) {
    $lang = $_GET['lang'];

    // register the session and set the cookie
    $_SESSION['lang'] = $lang;
    setcookie("lang", $lang, time() + (3600 * 24 * 30));
}
else if(isSet($_SESSION['lang'])) {
    $lang = $_SESSION['lang'];
}
else if(isSet($_COOKIE['lang'])) {
    $lang = $_COOKIE['lang'];
}
else {
    $lang = 'en';
}

// use appropiate lang.xx.php file according to the value of the $lang
$languages = array('en', 'es', 'zh-tw', 'zh-cn');
if (in_array($_SESSION['lang'], $languages)) {
    $lang_file = 'lang.'.$_SESSION['lang'].'.php';
} else {
    $lang_file = 'lang.en.php';
}

//localization helper function
function l($localization) {
    global $lang;
    return $lang[$localization];
}
    include_once 'languages/'.$lang_file;
?>

我陷入了不良做法或验证问题?代码有效,但有没有办法以更清洁,更好的方式完成上述事情?

2 个答案:

答案 0 :(得分:1)

假设它们生成有效的HTML,

索引文件中的PHP语句不适合HTML验证。如果您在Web浏览器中检查页面的来源,您将看到所有PHP标记都已消失,并替换为它们生成的任何内容。这是经过验证的。

关于使事情更清洁,您可以尝试更换

<?php if($lang_file=='lang.en.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-en.js"></script>';} ?>
<?php if($lang_file=='lang.es.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-es.js"></script>';} ?>
<?php if($lang_file=='lang.zh-tw.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-zh-tw.js"></script>';} ?>
<?php if($lang_file=='lang.zh-cn.php') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-zh-cn.js"></script>';} ?>

类似

<?php
$lang = explode('.',$lang_file);
echo '<script type="text/javascript" src="scripts/jquery-validate/val-'.$lang[1].'.js"></script>' ?>

这样,假设$lang_file和验证脚本之间的变量转换总是沿着lang行。 en .php到val- en 。 js,这将支持您关注的任何语言,而不需要每行代码。显然,如果用户可以操纵$ lang_file,你需要确保它包含你期望它包含的内容。

答案 1 :(得分:0)

我不能专门针对不良做法,但在加载正确的jquery脚本方面,只需对$ lang_file的内容进行子串匹配,然后将其连接到包含所有脚本的目录的末尾。这样,您可以添加/删除区域设置,而无需更改脚本。