今天是本学期第15周的周三,天气多云,依旧是干冷。心情小雨转晴。
早上10点钟才起床,略有负罪感。之后整个白天都在调试网站,终于功夫不负有心人,困扰我多日的两个问题终于解决了。问题如下:
1、由于传输到页面的数据含有html标签,经常会导致页面解析出错。
先由bp-default/index.php或single.php文件中的表单向snap/snapProject.php传值
<form action="/snap/snapProject.php" method="post" name="projectform" >
<input type="hidden" name="projectdata" value="<?php echo htmlspecialchars(get_the_projectdata()); ?>" />
<input type="submit" name="submit" value="" title="click to see the project" style="width:480px;height:360px;font-size:20px; background-image:url(<?php the_picdata();?>);" />
</form>
在snapProject.php中
<?php
$pdata = $_POST['projectdata'];
?>
<script>
function htmlspecialchars_decode(str)
{
str = str.replace(/\\"/g, '"'); \为转义字符,所以\\表示\
str = str.replace(/'/g, "'");
return str;
}
</script>
<div id="dom-target" style="display: none;">
<?php
echo htmlspecialchars($pdata);
?>
</div>
<script>
var div = document.getElementById("dom-target");
t= htmlspecialchars_decode(div.textContent);
</script>
最终要实现php变量$data的值传递给javascript变量t。由于表单中 value="<?php echo htmlspecialchars(get_the_projectdata()); ?>" 获取的值含有html标签会导致解析错误,所以使用函数htmlspecialchars将一些预定义的字符转化为实体。为了能在当前网页将$pdata的值赋给t,采用将$pdata的值输出到div中,但是$data获取的值中实体已被自动替换为对应的字符(不清楚为什么),所以再次使用htmlspecialchars函数。在调试过程中发现div.textContent值中实体"被自动解析为\"(依旧不知道为什么)。所以自定义了函数htmlspecialchars_decode将\"替换为"。
(1)htmlspecialchars
定义和用法
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号) 成为 &
- " (双引号) 成为 "
- ' (单引号) 成为 '
- < (小于) 成为 <
- > (大于) 成为 >
语法
htmlspecialchars(string,quotestyle,character-set)
参数 | 描述 |
---|---|
string | 必需。规定要转换的字符串。 |
quotestyle | 可选。规定如何编码单引号和双引号。
|
character-set | 可选。字符串值,规定要使用的字符集。
|
提示和注释
提示:无法被识别的字符集将被忽略,并由 ISO-8859-1 代替。
例子
<html> <body> <?php $str = "John & 'Adams'"; echo htmlspecialchars($str, ENT_COMPAT); echo "<br />"; echo htmlspecialchars($str, ENT_QUOTES); echo "<br />"; echo htmlspecialchars($str, ENT_NOQUOTES); ?> </body> </html>
浏览器输出:
John & 'Adams' John & 'Adams' John & 'Adams'
如果在浏览器中查看源代码,会看到这些 HTML:
<html> <body> John & 'Adams'<br /> John & 'Adams'<br /> John & 'Adams' </body> </html>
function htmlspecialchars_decode(str)
{
str = str.replace(/&/g, "&");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
str = str.replace(/"/g, '"');
str = str.replace(/'/g, "'");
return str;
}
2、由于普通文章没有post_picdata项,所以再wp_posts表中添加post_flag来区分
(1)在wp-includes/post-template.php中添加如下代码
/*The post_flag of post is used to judge whether it is a project*/
function the_flag()
{
echo get_the_flag();
}
function get_the_flag() {
$post = get_post();
return ! empty ( $post ) ? $post->post_flag : false;
}
注意:
the_flag()和get_the_flag()是有区别的,在the_flag()中值是echo输出的,没有返回值,不能给变量赋值;而get_the_flag()是有返回值的。前几天由于没有注意到这个问题浪费了许多时间。
(2)在bp-default/index.php和single.php文件中添加如下代码
<?php if(get_the_flag()==1):?>
<form action="/snap/snapProject.php" method="post" name="projectform" >
<input type="hidden" name="projectdata" value="<?php echo htmlspecialchars(get_the_projectdata()); ?>" />
<input type="submit" name="submit" value="" title="click to see the project" style="width:480px;height:360px;font-size:20px; background-image:url(<?php the_picdata();?>);" />
</form>
<?php endif?>
知识点:
PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成endif;,endwhile;,endfor;,endforeach; , endswitch;
这些语法能发挥的地方是在PHP和HTML混合页面的代码里面。好处如下:
a.使HTML和PHP混合页面代码更加干净整齐。
b.流程控制逻辑更清晰,代码更容易阅读。