2014-12-10

    今天是本学期第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(/&#039;/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值中实体&quot;被自动解析为\"(依旧不知道为什么)。所以自定义了函数htmlspecialchars_decode\"替换为"

(1)htmlspecialchars

定义和用法

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号) 成为 &amp;
  • " (双引号) 成为 &quot;
  • ' (单引号) 成为 &#039;
  • < (小于) 成为 &lt;
  • > (大于) 成为 &gt;

语法

htmlspecialchars(string,quotestyle,character-set)
参数描述
string必需。规定要转换的字符串。
quotestyle

可选。规定如何编码单引号和双引号。

  • ENT_COMPAT - 默认。仅编码双引号。
  • ENT_QUOTES - 编码双引号和单引号。
  • ENT_NOQUOTES - 不编码任何引号。
character-set

可选。字符串值,规定要使用的字符集。

  • ISO-8859-1 - 默认。西欧。
  • ISO-8859-15 - 西欧(增加 Euro 符号以及法语、芬兰语字母)。
  • UTF-8 - ASCII 兼容多字节 8 比特 Unicode
  • cp866 - DOS 专用 Cyrillic 字符集
  • cp1251 - Windows 专用 Cyrillic 字符集
  • cp1252 - Windows 专用西欧字符集
  • KOI8-R - 俄语
  • GB2312 - 简体中文,国家标准字符集
  • BIG5 - 繁体中文
  • BIG5-HKSCS - Big5 香港扩展
  • Shift_JIS - 日语
  • EUC-JP - 日语

提示和注释

提示:无法被识别的字符集将被忽略,并由 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 &amp; 'Adams'<br />

John &amp; &#039;Adams&#039;<br />

John &amp; 'Adams'

</body>

</html>
(2) htmlspecialchars_decode扩展

function htmlspecialchars_decode(str)    
{    
    str = str.replace(/&amp;/g, "&");  
    str = str.replace(/&lt;/g, "<");  
    str = str.replace(/&gt;/g, ">");  
    str = str.replace(/"/g, '"');  
    str = str.replace(/&#039;/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.流程控制逻辑更清晰,代码更容易阅读。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值