设为首页 收藏本站
查看: 701|回复: 0

[经验分享] 【PHPFAQ】PHP 和 HTML

[复制链接]

尚未签到

发表于 2017-3-23 08:06:14 | 显示全部楼层 |阅读模式

PHP 和 HTML



转自:http://php.net/manual/zh/faq.html.php


PHP 和 HTML 有很多相互作用:PHP 能生成 HTML,HTML 可以向 PHP 传递信息。在阅读这些常见问题之前,先学会怎样从 PHP 之外取得变量很重要。此主题的手册页也包括很多例子。还要仔细留意register_globals对你意味着什么。



  • 当我通过表单/URL 传值时需要用什么编码/解码方法?
  • 我在试用 <input type="image"> 标记,但是没有 $foo.x和 $foo.y变量,它们哪去了?
  • 怎样在 HTML 的 <form> 中建立数组?
  • 怎样从可多选的 HTML 的 select multiple 标记中得到所有结果?
  • 怎样从 Javascript 传递一个变量到 PHP?



当我通过表单/URL 传值时需要用什么编码/解码方法?

在几个环节上编码方式很重要。假定有string$data,其中包含了想通过非编码方式传递的字符串,那这是相关步骤:



  • HTML 解析。要指定一个任意的字符串,必须将其放在双引号中,并用htmlspecialchars()处理整个值。


  • URL:URL 由几部分组成。如果希望自己的数据被当作其中一项来解释,必须用urlencode()对其编码。




Example #1 隐藏的 HTML 表单单元

<?php
echo"<inputtype='hidden'value='".htmlspecialchars($data)."'/>\n";
?>





  Note:用urlencode()来处理$data是错误的,因为是浏览器的责任来urlencode()数据。所有流行的浏览器都能正确处理。注意不论何种方法(例如
GET 或 POST)都会这样。不过只会在用 GET 请求时注意到这一点,因为 POST 请求通常是隐藏的。



Example #2 等待用户编辑的数据

<?php
echo"<textareaname='mydata'>\n";

echo
htmlspecialchars($data)."\n";

echo
"</textarea>";
?>





  Note:数据会按照预期的显示在浏览器中,因为浏览器会解释 HTML 转义符号。当提交时,不论是 GET 或者 POST 方法,数据都会被浏览器进行 urlencode 来传输,并直接被 PHP urldecode。所以最终不需要自己处理任何 urlencoding/urldecoding,全都是自动处理的。



Example #3 URL 中的例子

<?php
echo"<ahref='".htmlspecialchars("/nextpage.php?stage=23&data=".
urlencode($data))."'>\n";
?>





  Note:事实上这在编造一个 HTML 的 GET 请求,因此需要手工对数据进行urlencode()。


  Note:需要对整个 URL 进行htmlspecialchars(),因为
URL 是作为 HTML 属性的一个值出现的。在本例中,浏览器会首先对值进行 un-htmlspecialchars(),然后再传递此 URL。PHP 将能正确理解
URL,因为对数据进行了urlencoded()。要注意到 URL 中的&被替换成了&amp;。如果忘了这一步,尽管大多数浏览器都能恢复,但也不总是这样。因此即使 URL 不是动态的,也需要
URL 进行htmlspecialchars()。


我在试用 <input type="image"> 标记,但是没有$foo.x和$foo.y变量,它们哪去了?

当提交表单时,可以用图片代替标准的提交按钮,用类似这样的标记:

<input type="image" src="image.gif" name="foo" />




当用户点击了图片的任何部分,该表单会被发送到服务器并加上两个额外的变量:foo.x和foo.y。因为foo.x和foo.y在 PHP 中会成为非法的变量名,它们被自动转换成了foo_x和foo_y。也就是用下划线代替了点。因此,可以按照在来自
PHP 之外的变量这一节中说明的那样访问这些变量。例如,$_GET['foo_x']。

  Note:
请求变量名中的空格被转换为下划线。


怎样在 HTML 的 <form> 中建立数组?

要使你的 <form> 结果被当成array发送到 PHP 脚本,要对 <input>,<select> 或者 <textarea> 单元这样命名:

<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />




注意变量名后的方括号,这使其成为一个数组。可以通过给不同的单元分配相同的名字来把单元分组到不同的数组里:
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyOtherArray[]" />
<input name="MyOtherArray[]" />




这将产生两个数组,MyArray 和 MyOtherArray,并发送给 PHP 脚本。还可以给数组分配指定的键名:
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />




AnotherArray 数组将包含键名 0,1,email 和 phone。

  Note:
指定数组的键名是 HTML 的可选项。如果不指定键名,则数组被按照单元在表单中出现的顺序填充。第一个例子将包含键名 0,1,2 和 3。

参见数组函数和来自
PHP 之外的变量。

怎样从可多选的 HTML 的 select multiple 标记中得到所有结果?

可多选的 select multiple 标记是 HTML 的一个构造,允许用户从一个列表中选择多个项目。这些项目接着被传递给该表单 action 中指定的处理程序。问题是它们都会被用同样的名字传递。例如:

<select name="var" multiple="yes">




每个被选项将这样被传递到表单处理程序:
var=option1 var=option2 var=option3




每个选项将覆盖前面一个$var变量的内容。解决方案是用 PHP 的“表单单元数组”特性。使用方法如下:
<select name="var[]" multiple="yes">




这将告诉 PHP 将$var当成数组对待,每个对 var[] 的赋值都会给数组增加一项。第一项将成为$var[0],下一个是$var[1],等等。可以用count()函数来测定选择了多少个项目,必要时可以用sort()函数来对选项的数组进行排序。注意如果在 JavaScript 中通过名字来引用单元,单元名字中的[]可能会造成问题。用表单单元中的数字序号来替代,或者将变量名用单引号括起来并用其作为单元数组的索引,例如:

variable = documents.forms[0].elements['var[]'];




怎样从 Javascript 传递一个变量到 PHP?

由于 Javascript (通常情况下)是客户端技术,而 PHP (通常情况下)是服务器端技术,而且 HTTP 是一种“无状态”协议,因此两种语言之间不能直接共享变量。
但是,有可能在二者之间传递变量。一种实现的方法是用 PHP 生成 Javascript 代码,并让浏览器自动刷新,将特定的变量传递回 PHP 脚本。以下例子显示了如何这样做——让 PHP 代码取得显示屏幕的高度和宽度,通常只能在客户端这么做。


<?php
if(isset($_GET['width'])ANDisset($_GET['height'])){
//outputthegeometryvariables
echo"Screenwidthis:".$_GET['width']."<br/>\n";

echo
"Screenheightis:".$_GET['height']."<br/>\n";

}else{
//passthegeometryvariables

//(preservetheoriginalquerystring

//--postvariableswillneedtohandleddifferently)

echo"<scriptlanguage='javascript'>\n";

echo
"location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
."&width=\"+screen.width+\"&height=\"+screen.height;\n";

echo
"</script>\n";

exit();

}
?>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-353786-1-1.html 上篇帖子: Eclipse开发PHP项目【转】 下篇帖子: PHP session_start()错误解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表