PHP拾贝

目录
  1. 1. $_SERVER['DOCUMENT_ROOT']
  2. 2. define defined
  3. 3. 将变量输出到文本
  4. 4. JS实现返回上一页的按钮
  5. 5. 在HTML里怎么给普通按钮添加超链接?
  6. 6. 用php在页面之间传递数组
  7. 7. 后台T型布局
  8. 8. mysqli::query()的使用
  9. 9. 防止用户越过登陆界面,直接输入网址进入用户操作页面
  10. 10. php脚本中提示一个信息之后跳转到指定页面
  11. 11. exit; / exit(); / die(); / die;
  12. 12. PHP获取当前url路径的函数及服务器变量
  13. 13. 根据用户权限判断是否显示某一条目
  14. 14. 用户重新登录的问题
  15. 15. 隐式提交用户名
  16. 16. js验证输入的信息
  17. 17. 循环输出复选框
  18. 18. 只查看某一状态的部分代码实现
  19. 19. 查询的部分代码实现
  20. 20. 批量审核的代码实现
  21. 21. 按类别显示内容的部分代码实现
  22. 22. 在父页面中添加内容
  23. 23. 双引号内解析php变量
  24. 24. 检查一个日期是否有效
  25. 25. 为变量设定默认值
  26. 26. 验证表单输入:必填字段
  27. 27. 动态创建变量名
  28. 28. 通过名字来为函数指定参数
  29. 29. 调用可变函数
  30. 30. 数字检测is_numeric与ctype_digit的区别
  31. 31. 关于form/input 的autocomplete='off'属性

$_SERVER['DOCUMENT_ROOT']

$_SERVER['DOCUMENT_ROOT']指向了web服务器文档树的根。(E:/wamp/www/)


define defined

!defined('CURSCRIPT') && define('CURSCRIPT', '');
含义是:如果CURSCRIPT 没定义,就定义CURSCRIPT为空。


将变量输出到文本

file_put_contents("./test.log","$_POST");
file_put_contents("./test.log","$_POST",FILE_APPEND); //FILE_APPEND :如果文件 filename 已经存在,追加数据而不是覆盖。
输出数组:

1
2
3
4
5
$str='';  
foreach ($arr as $key=>$value){
$str .= $key.'='.$value."\n";
}
file_put_contents("c:/test.log","$str");

JS实现返回上一页的按钮

<input type="button" onclick="javascript:history.go(-1);" value="返回上一页"/>


在HTML里怎么给普通按钮添加超链接?

<input type="button" value="跳转按钮" onclick="javascript:window.location.href='abc.html';"/>


用php在页面之间传递数组

实现大致思路:将数组转化成字符串,可以用get方式作为一个参数来传递到另外一个页面,接受后再将字符串转成数组即可。
代码如下:

a.php

1
2
3
4
5
6
<?php  
$parm=array('0'=>111,'1'=>'test','2'=>true);
$arg=implode(":",$parm);
$link="b.php?arg=$arg";
echo "<a href='$link'>将数组以参数方式传递给b</a>";
?>

b.php

1
2
3
4
5
<?php  
$arg= $_GET['arg'];
$parm=explode(":", $arg);
print_r($parm);
?>

最终输出:Array( [0] => 111 [1] => test [2] => 1)

使用POST方式提交。应该用以下方法写表单代码(注意name是text[])。

1
2
<input name="text[]" value="1">  
<input name="text[]" value="2">

提交以后得到一个名为 text 的数组。
你可以用print_r($_POST);查看接收到的结果。


后台T型布局


mysqli::query()的使用

如果成功则返回 TRUE,失败则返回 FALSE。

mysqli_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。例:

1
2
3
4
5
6
7
8
9
$result=$this->conn->query($sql);//返回的结果是资源类型   
//将结果集转换为数组:
$array = array();
//只有一条记录的时候
$array=$result->fetch_array();//$array是一维数组
//当结果集中的记录有多条的时候
while($row=$result->fetch_array()){
$array[]= $row; //$array是二维数组
}

防止用户越过登陆界面,直接输入网址进入用户操作页面

当用户登陆时,添加代码:

1
2
3
session_start();

$_SESSION["isok"]="ok";//在登陆时把“ok”存入session

在用户操作页面的开始处加上代码:

1
2
3
session_start();

if($_SESSION["isok"]!="ok"){exit;}//如果session中没有包含“ok”则退出。

php脚本中提示一个信息之后跳转到指定页面

echo "<script>alert('一个信息');location.href='index.php';</script>";


exit; / exit(); / die(); / die;

php脚本中的exit;语句的作用是结束当前脚本,也就是说当代码执行到exit时将不再向下执行,相当于java中的break;


PHP获取当前url路径的函数及服务器变量

1.$_SERVER["QUERY_STRING"]
说明:查询(query)的字符串

2.$_SERVER["REQUEST_URI"]
说明:访问此页面所需的URI,获取当前请求的完整的(除域名的)url

3.$_SERVER["SCRIPT_NAME"]
说明:包含当前脚本的路径

4.$_SERVER["PHP_SELF"]
说明:当前正在执行脚本的文件名

实例:
1.http://www.biuuu.com/ (直接打开主页)
结果:
$_SERVER["QUERY_STRING"] = ""
$_SERVER["REQUEST_URI"] = "/"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"] = "/index.php"

2.http://www.biuuu.com/?p=222 (附带查询)
结果:
$_SERVER["QUERY_STRING"] = "p=222"
$_SERVER["REQUEST_URI"] = "/?p=222"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"] = "/index.php"

3.http://www.biuuu.com/index.php?p=222&q=biuuu
结果:
$_SERVER["QUERY_STRING"] = "p=222&q=biuuu"
$_SERVER["REQUEST_URI"] = "/index.php?p=222&q=biuuu"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"] = "/index.php"

$_SERVER["QUERY_STRING"] 获取查询语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"] 获取http://www.biuuu.com 后面的值,包括/
$_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名

当前url:"http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']


根据用户权限判断是否显示某一条目

1
2
3
4
5
6
7
<?php  
if($_SESSION["rights"]==1){//用户权限为1时,用户界面显示【管理员管理】
?>
<li><a href="admin.php" target="main">管理员管理</a></li>
<?php
}
?>

用户重新登录的问题

当修改密码后要求用户重新登录,如果session中的数据仍然存在的话,那么浏览器就会跳过登录页面直接进入用户页面

1
2
3
session_destroy();//销毁已存储的session 数据

echo "<script>alert('密码修改成功,请重新登录');top.location.href='login.php';</script>";

隐式提交用户名

1
2
3
<input name="username" type="hidden" id="username" size="30"  value="<?php echo $_SESSION["username"];?>"/>

<?php echo $_SESSION["username"];?>


js验证输入的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>  
function test(){
if(document.admin.username.value==''){
alert('请输入管理员账号');
return false;
}
if(document.admin.password.value==''){
alert('请输入管理员密码');
return false;
}
return true;
}
</script>
<form name="admin" id="admin" method="POST" action="admin_addSava.php" onsubmit="return test();">

循环输出复选框

aaa.php文件:

1
2
3
4
5
6
7
8
9
10
<form action="idd.php" method="post">  
<?php
for($i=1;$i<5;$i++){
?>
<input name="id[]" type="checkbox" value="<?php echo $i;?>" />复选框<?php echo $i;?><br/>
<?php
}
?>
<input type="submit" name="button" id="button" value="确定" />
</form>

bbb.php文件:

1
2
3
4
5
6
7
8
<?php  
$value=$_POST['id'];//$value是一个数组
//echo($value);
var_dump($value);
foreach($value as $v){
echo "<br/>$v";
}
?>

输出:

1
2
3
array(2) { [0]=> string(1) "2" [1]=> string(1) "3" } 
2
3


只查看某一状态的部分代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php  
require_once '../plus/DbMysql.php';
$db= new DbMysql();
$sql="select * from user"; //基本语法
$parm=" where 1 "; //条件

//条件增加
$zt=@$_GET["zt"];
if($zt!=""){
$parm.=" and zt='$zt'";
}
$sql.=$parm;
$db->sql($sql);
$infocount=$db->affected(); //信息总数量
$pagesize=5; //每页显示数量
$page = new page($infocount, $pagesize);

$sql.=$page->limit();
$result=$db->select($sql);
?>

……

查看:<a href='user.php'>全部</a> <a href="?zt=1">待审核</a> <a href="?zt=3">锁定</a> <a href="?zt=2">正常</a></div>


查询的部分代码实现

user.php文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php  
  ......
  if($key!=""){
   $parm.= " and ".$stype." like '%$key%' ";
  }
  $sql.=$parm;
  ......
?>

<form action="user.php" method="get" name="userso" onsubmit="return test();">//test()判断是否输入内容
用户名:
<select name="stype" id="stype">
<option value="username">用户名</option>
<option value="email">邮箱</option>
<option value="xingming">真实姓名</option>
</select>
<input name="key" type="text" id="key" />
<input name="" type="submit" value="搜索" />
</form>


批量审核的代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>  
function plzt(n){
document.userinfo.zt.value=n;
document.userinfo.action="user_ztshenhe.php";
document.userinfo.submit();//js中提交表单
}
</script>
.....
<form action="user_alldel.php" method="post" name="userinfo">
......
<input type="submit" value="批量删除" />
<input type="button" name="button" id="button" value="批量审核" onclick="plzt(2)" />
<input type="button" name="button2" id="button2" value="批量待审核" onclick="plzt(1)" />
<input type="button" name="button3" id="button3" value="批量锁定" onclick="plzt(3)" />
<input type="hidden" name="zt" id="zt" />

点击“批量审核”按钮后:user_ztshenhe.php文件中会通过post方式获取提交的id(数组)和zt,然后更改数据库的相应字段。


按类别显示内容的部分代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
<select name="select" id="select" onchange="javascript:location.href=this.options[selectedIndex].value">  
<option value="feedback.php">查看全部</option>
   <?php
$typeInfo = $db->select("select id,typename from feedbackType where typezt=1 order by typeorder ");
foreach($typeInfo as $row){
if($typeid==$row["id"]){//为了实现:选择某一类别后,该类别名称默认显示在红圈处
echo "<option value='?typeid=".$row["id"]."' selected>".$row["typename"]."</option>";
}else{
echo "<option value='?typeid=".$row["id"]."'>".$row["typename"]."</option>";
}
}
   ?>
</select>

在父页面中添加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
parent.php文件:  
  <form action="aaa.php" method="POST" name="admin" id="admin" onsubmit="return test();">
  ......
  <tr id="logotr">
<td>图片地址:</td>
<td> </td>
<td><input name="picurl" type="text" id="picurl" size="30" /></td>
<td>
<iframe src="son.php" frameborder="0" width="350" height="30"></iframe>
</td>
</tr>
   ......
  </form>
son.php文件:
  echo "<script>parent.document.admin.picurl.value='要在图片地址栏目的文本框中添加的内容';</script>";

双引号内解析php变量

1
2
3
4
<?php  
$a = 123;
echo "dsfsdf $a fsfds";
?>

正常来说,双引号内的变量会自动解析,输出:dsfsdf 123 fsfds
可是类似于这样的变量$_SESSION['pid'],插入到字符串中回报语法错误,此时可以在变量外包裹{}解决:
echo "dsfsdf {$_SESSION['pid']} fsfds";


检查一个日期是否有效

你想要检查一个日期是否有效。例如,你想要确保用户不会提交一个类似“1962年2月30日”这样的生日。
解决方案:使用checkdate()函数
$valid = checkdate($month,$day,$year);


为变量设定默认值

$a = isset($_REQUEST['a']) ? $_REQUEST['a'] : $default;
在为变量指定默认值时,使用isset()是必须的。如果不使用这个函数,那么变量的非默认值就不能是0或者其他能转换成false的值。比如:
$a = $_REQUEST['a'] ? $_REQUEST['a'] : $default;
如果$_REQUEST['a']为0,那么$a会被直接指定为$default。

在检测数组是否经过设置时,需要使用另外一个函数array_key_exists():
$a = array_key_exists('a',$_REQUEST) ? $_REQUEST['a'] : $default;
isset()和array_key_exists()之间的一个区别是,当数组中存在一个键但对应的值为null时,array_key_exists()返回true,isset()则返回false。


验证表单输入:必填字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php  
//在检查长度之前,先检查$_POST['flavor']是否存在
if(!(isset($_POST['flavor']) && strlen($_POST['flavor']))){
echo 'flavor栏目不能为空'
}

//$_POST['flavor']是可选的,但如果没有留空,就必须大于5个字符
if(isset($_POST['flavor']) && (strlen($_POST['flavor'])<=5)){
echo 'flavor必须大于5个字符';
}

//确保$_POST['flavor']存在,并且是一个数组
if(!(isset($_POST['flavor']) && is_array($_POST['flavor']))){
echo 'flavor没有选择任何选项';
}
?>

动态创建变量名

如果在一个变量名称前面放两个“$”符号,php就会废弃右面的变量,而取其值,然后,将该值作为“真正”的变量名称。

1
2
3
$annimal = 'turtles';  
$turtles = 103;
print $$animal; //103

这段代码会输出103。因为$annimal = 'turtles',那么$$animal就是$turtles。
如果使用花括号,还能构造出用于表示变量名的更复杂的表达式:
${'stooge_'.strtolower($s)};


通过名字来为函数指定参数

当向函数中传递参数时,必须注意参数的顺序,而且当多次调用同一个函数时,有可能每次需要传递到该函数中的参数不一样(有时需要传的是$a、$b,有时需要传的是$b、$c),这个时候使用function f($a,$b,$c){}这样的传参方式则显得不够灵活。
解决方案:让函数只接受一个参数,此参数的类型是一个关联数组。

1
2
3
4
5
6
function image($img){  
$src = $img['src'];
$alt = $img['alt'];
return "<img src=$src alt=$alt />";
}
$image = image(array('src'=>'cow.jpg','alt'=>'is cow'));

扩展阅读:php的func_get_args()函数使用(http://php.net/manual/zh/book.funchand.php


调用可变函数

问题:你想要依据变量的值来调用不同的函数。
方案:
使用call_user_func()

1
2
3
4
5
6
7
function get_file($filename){  
return $filename;
}
$funtion = 'get_file';
$filename = 'a.jpg';
//调用get_file('a.jpg')
call_user_func($function,$filename);

如果要求函数能够接受不同个数的参数,可以用call_user_func_array()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function get_file($filename){  
return 'get_'.$filename;
}
function put_file($filename1,$filename2){
return 'put_'.$filename1.'_'.$filename2;
}
if($action=='get'){
$function = 'get_file';
$args = array('a.jpg');
}elseif($action=='put'){
$function = 'put_file';
$args = array('a.jpg','b.jpg');
}
call_user_func_array($function,$args);

数字检测is_numeric与ctype_digit的区别

is_numeric:检测是否为数字字符串,可为负数和小数
ctype_digit:检测字符串中的字符是否都是数字,负数和小数会检测不通过
注意,参数一定要是字符串,如果不是字符串,则会返回0/FASLE


关于form/input 的autocomplete='off'属性

input 的属性autocomplete默认为on,其含义代表是否让浏览器自动记录之前输入的值。
很多时候,需要对客户的资料进行保密,防止浏览器软件或者恶意插件获取到,可以在input中加入autocomplete="off"来关闭记录。
另外,如果整个表单都不想让浏览器自动记录之前输入的值,我们可以给from表单加上,这样整个表单都不会记录用户输入的值。