PHP面试(二)
1.防止表单重复提交.
1)使用JS让按钮在点击一次后禁用(disable)
优点:防止多次点击发生,实现方式较简单。
缺点:若客户端禁止JavaScript脚本,则失效。
2) 在提交成功后执行页面重定向转到提交成功信息页面。
提示:ThinkPHP中Action类的redirect方法可以实现页面的重定向功能.
特点:避免F5重复提交,消除浏览器前进和后退按导致的同样问题。
3)表单隐藏域中存放session(表单被请求时生成的标记)
原理:接收表单数据后,检查此标志值是否存在,先进行删除,然后处理数据; 若不存在,说明已提交过,忽略本次提交。/*
//服务端生成随机数存入session, 分配至表单页 $data['sess_id'] = $_SESSION['sid'] = mt_rand(1000, 9999); $this->load->view('form', $data); //表单页隐藏域存放此session值 <input type="hidden" name="sid" value="<?=$sess_id; ?>"> //处理 if($_POST['sid'] != '' && $_POST['sid'] == $_SESSION['sid']) { unset($_SESSION['sid']); echo '处理数据'; } else { echo '已提交过表单'; }
4. 数据库唯一索引约束(最有效的防止重复数据的方法.
2.数组合并
1.对于相同的字符串索引,
array_merge则会用后面的值覆盖前面出现的值;
+会用前面出现过的值覆盖后面相同的key;
array_merge_recursive则会把相同的索引放到一个数组里面,增加数组的维度;
2.对于相同的数字索引,
array_merge则会给重复的值重建索引(索引值从0开始);
+仍然是用前面出现过的值覆盖后面的值;
array_merge_recursive和array_merge的处理方法一样。
具体参考:https://www.cnblogs.com/lcss/p/7757784.html(赖床四少)。
3.PHP中插入Html的方法
php中添加HTML代码,就是php类型的文件中添加html代码~
第一种是在HTML中加PHP。
大段大段的html代码中,在各个需要执行php的地方<?php .... ?>
比如 line7-9:
1 <head> 2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 3 <meta http-equiv="Content-Language" content="zh-CN" /> 4 <title>Hello World</title> 5 </head> 6 <body> 7 <?php 8 echo "Hello world!这是正文"; 9 ?> 10 </body> 11 </html>
第二种用echo输出HTML。
因为HTML有的元素中有双引号,所以用echo输出的内容用单引号括起来,避免出错,也省了转义这一步。比如这样的代码:
1 <?php 2 if(!$_POST){ 3 echo ‘<form action="" method="post"> 4 服务器地址:<input type="text" name="host" value="localhost" /><br /> 5 数据库账号:<input type="text" name="user" value="" /><br /> 6 数据库密码:<input type="password" name="pwd" value="" /><br /> 7 指定数据库:<input type="text" name="db" value="test" /><br /> 8 <input type="submit" value="确定"/> 9 </form>‘; 10 } 11 ?>
或者这种加了转义符号的:
1 <?php 2 echo "<input type=\"submit\" value=\"确定\"/>" ; 3 ?>
第三种就是用(<<<)标记符了,这是在PHP168的模板代码中首次见到的。
1 <?php 2 print <<<EOT 3 <div class="slidecont">{$label[deepblue_mainslide]}</div> 4 <div class="newcontainter"> 5 <div class="head">{$label[deepblue_mainh1]}</div> 6 <div class="cont" id="Tab1">{$label[deepblue_maint1]}</div> 7 <div class="cont" id="Tab2">{$label[deepblue_maint2]}</div> 8 </div> 9 <a href="$rs[url]" title="$rs[descrip]" target="_blank">$rs[name]</a> 10 EOT; 11 ?>
“<<<EOT”和“EOT;”中间的文档直接输出,一个比较好理解的说法是“一个多行的echo ”。
优点是输出大段HTML方便,不需要转义,而且可以引用变量。
但是在使用(<<<EOT) 标记符还有一点需要注意:标识符结束字符串既EOT;要独占一行,前后都不许再有内容,否则这个php文件就相当于废了。
这里的EOT标记可以替换成 任意标记 比如 print <<<END