文章详细的介绍了关于PHP中print_r、var_export、var_dump区别比较以及这几个在php不同的应用中的用法,有需要的朋友可以参考一下
可以看出print_r跟var_export都是可以作为返回值的,只需要把第二个参数设置为true即可
print_r
(PHP 4 , PHP 5)print_r – 打印关于变量的易于理解的信息。
描述
bool print_r ( mixed expression [, bool return])
注: 参数 return 是在 PHP 4.3.0 的时候加上的
print_r() 显示关于一个变量的易于理解的信息。如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。
记住,print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。
代码如下 |
复制代码 |
<pre>
<?php
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x','y','z'));
print_r ($a);
?>
</pre>
|
上边的代码将输出:
代码如下 |
复制代码 |
<pre>
Array
(
[a] => apple
[b] => banana
[c] => Array
(
[0] => x
[1] => y
[2] => z
)
)
</pre>
|
如果想捕捉 print_r() 的输出,可使用 return 参数。若此参数设为 TRUE,print_r() 将不打印结果(此为默认动作),而是返回其输出。
例子 1. return 参数示例
代码如下 |
复制代码 |
<?php
$b = array ('m' => 'monkey', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$results = print_r ($b, true); //$results 包含了 print_r 的输出结果
?>
|
注: 如果想在 PHP 4.3.0 之前的版本中捕捉 print_r() 的输出,可使用输出控制函数。
注: 在 PHP 4.0.4 之前的版本中,如果给出的 array 或 object 包含了直接或间接指向自身的引用,print_r() 将永远继续下去。print_r($GLOBALS) 就是一个例子,因为 $GLOBALS 自身即是全局变量,其包含了指向自身的引用。
var_export
(PHP 4 >= 4.2.0, PHP 5)var_export – 输出或返回一个变量的字符串表示
描述
mixed var_export ( mixed expression [, bool return])
此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。
您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
比较 var_export() 和 var_dump().
代码如下 |
复制代码 |
<pre>
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_export ($a); /* 输出:
array (
0 => 1,
1 => 2,
2 =>
array (
0 => 'a',
1 => 'b',
2 => 'c',
),
)
*/
$b = 3.1;
$v = var_export($b, TRUE);
echo $v;
/* 输出:
3.1
*/
?>
</pre>
|
var_dump
(PHP 3>= 3.0.5, PHP 4 , PHP 5)var_dump – 打印变量的相关信息
描述
void var_dump ( mixed expression [, mixed expression [, ...]])
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
提示: 为了防止程序直接将结果输出到浏览器,您可以使用输出控制函数(output-control functions)来捕获函数的输出,并把它们保存到一个 string 型的变量中。
可以比较一下 var_dump() 与 print_r()。
例子 1. var_dump() 示例
代码如下 |
复制代码 |
<pre>
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_dump ($a); /* 输出:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
}*/
$b = 3.1;
$c = TRUE;
var_dump($b,$c);
/* 输出:
float(3.1)
bool(true)*/
?>
</pre>
|
本函数的作 用判断是否为合法邮编(固定长度),方法很简单就是用正则来操作。
代码如下 |
复制代码 |
< ?php
// 函数名:CheckPost($C_post)
// 作 用:判断是否为合法邮编(固定长度)
// 参 数:$C_post(待check的邮政编码)
// 返回值:布尔值
// 备 注:无
//-----------------------------------------------------------------------------------
function CheckPost($C_post)
{
$C_post=trim($C_post);
if (strlen($C_post) == 6)
{
if(!ereg("^[+]?[_0-9]*$",$C_post))
{
return true;;
}else
{
return false;
}
}else
{
return false;;
}
}
?>
|
* 在新建对象时需要的变量:$query(从数据表中获取记录数的sql语句),$page(当前页码),$maxline(每页几行))
* 1、showpage方法:如果上面创建对象的$query正确,直接调用,即可输出分页信息
* 2、showtable方法:需要的变量:$query(从数据库读取记录的SQL语句,不要加Limit,因为在方法中已经添加)
代码如下 |
复制代码 |
<?php
/*
* 直接输出数据表和分页信息
* 在新建对象时需要的变量:$query(从数据表中获取记录数的sql语句),$page(当前页码),$maxline(每页几行))
* 1、showpage方法:如果上面创建对象的$query正确,直接调用,即可输出分页信息
* 2、showtable方法:需要的变量:$query(从数据库读取记录的SQL语句,不要加Limit,因为在方法中已经添加)
* 直接输出<tr><td></td></tr>的表格,所以只需在前后加上<table></table>就是完整的表格
* 3、showresult方法:根据提交的$query中的SQL,直接将$result资源返回,表格可以自己定义
* 示例:
//获取当前页,并定义每页最大行
$page=1;
$maxline="10";
if(!empty($_GET["page"])){
$page=$_GET["page"];
}
//定义计算表内数据总数的SQL语句,这里必须和下面的$query是同一个表和条件,创建对象,输出页码和表格
$query="select count(*) from mailbox";
$a=new PageList($query, $maxline, $page);
$a->showpage();
//这里显示列表,需要和上面的SQL语句一样的条件
$query="select username,name,quota,created,modified,active from mailbox order by created desc";
echo "<table width='800' border='0' cellspacing='0' cellpadding='0' class='pagelist'>";
$a->showtable($query);
echo "</table>";
* */
class PageList{
private $link;
private $result;
private $maxline;
private $page=1;
private $startline=0;
private $countline;
public $countpage;
private $prevpage;
private $nextpage;
//数据库联接,需要修改为您自己的地址
private $dbhost=DBHOST;
private $dbuser=DBUSER;
private $dbpasswd=DBPASSWD;
private $dbtable=DBTABLE;
/*
* 构造函数中建立数据库联接
* 1、数据库连接的4个参数设置为常量 记录在config.php页面中
* 2、连接数据库,并选择数据库
* 3、设置数据库执行的编码方式为utf8
* 4、将接收到的$maxline,$page两个变量赋值给类属性,成为该类通用属性
* (其中$query是count(*)的SQL,和下面方法中的query是不一样的)
* 5、根据新建对象时递交的$query语句,对数据库执行查询,将得到的总记录数赋值到类属性中$this->countline
* 将总记录数/每页行数,再用ceil函数高位取整,得到总页数并赋值到类属性中$this->countpage
* 6、根据递交的当前页码$page,算出前后页的数字$this->prevpage和$this->nextpage
* 还有必须算出数据库读取的起始行$this->startline
* 这里分3种情况,page<2 ,page=最后一页,page>1(这个情况可以不判断,直接用else)
* */
public function __construct($query,$maxline,$page){
@$this->link=mysql_connect($dbhost,$dbuser,$dbpasswd) or die($this->feedback='System Error ,Please contect admin');
@mysql_select_db($dbtable,$this->link) or die($this->feedback='System Error ,Please contect admin');
@mysql_query('set names utf8');
$this->maxline=$maxline;
//读取行数,并将结果返回$coutline
$this->result=mysql_query($query) or die($this->feedback='System Error ,Please contect admin');
if($count=mysql_fetch_row($this->result)){
//intval将字符串转为int,可以不转,但这样的程序更健康
$this->countline = intval($count[0]);
$this->countpage = ceil($this->countline/$maxline);
}
//判断递交的$page是否大于总页数
if($page<=$this->countpage){
$this->page=$page;
}
if($this->page<2){
$this->prevpage=0;
$this->nextpage=2;
$this->startline= 0;
}elseif($this->page==$this->countpage){
$this->prevpage=$this->page-1;
$this->nextpage=0;
$this->startline= ($this->page-1)*$this->maxline;
}else{
$this->prevpage=$this->page-1;
$this->nextpage=$this->page+1;
$this->startline= ($this->page-1)*$this->maxline;
}
}
/*
* 析构函数
* 释放资源,关闭数据库连接
* */
public function __destruct(){
mysql_free_result($this->result);
mysql_close($this->link);
exit();
}
/*
* 输出分页信息
* */
public function showpage(){
//$listnum显示上下页中间的数字位数,一定要偶数阿!否则不能被2除
$listnum=10;
echo $this->countline." Items, ".$this->countpage." Pages ";
if($this->prevpage==0){
echo "<<Prev ";
}else{
echo "<a href=?page=".$this->prevpage."><<Prev</a> ";
}
if($this->countpage<$listnum){ //判断总页数是否小于$listnum
$page_start=1;
$page_end=$this->countpage;
}elseif($this->page<$listnum/2){ //判断当前页是否小于$listnum的一半
$page_start=1;
$page_end=$listnum;
}elseif($this->page>$this->countpage-($listnum/2)){ //判断当前页是否是最后几页了
$page_start=$this->countpage-($listnum-1);
$page_end=$this->countpage;
}else{ //如果上面的条件都不符合,那当前也正在中间
$page_start=$this->page-($listnum/2-1);
$page_end=$this->page+($listnum/2);
}
for($i=$page_start;$i<=$page_end;$i++){ //根据上面判断的start和end页码,循环输出之间的页码
if($i==$this->page){
echo "<b>".$i."</b> ";
}else{
echo "<a href=?page=".$i.">".$i."</a> ";
}
}
if ($this->nextpage==0){
echo " Next>>";
}else{
echo " <a href=?page=".$this->nextpage.">Next>></a> ";
}
}
/*
* 根据sql语句读取数据库中的数据,然后列成表单输出
* 需要的变量:$field(字段),$table(表名),$startline(开始行),$maxline(每页显示行数)
* 输出从表格的tr开始,从tr结束,所以在使用这个方法前后要加table的标签
* */
public function showtable($query){
$query=$query." LIMIT ".$this->startline.",".$this->maxline;
$result = mysql_query($query) or die($this->feedback='System Error ,Please contect admin');
//行循环开始,定义一个$i变量,用来显示行号,每次执行一条while语句,指针就指向下一条数据
$i=0;
while ($fetch = mysql_fetch_assoc($result)){
$i++;
echo "<tr><td>".$i."</td>";
//列循环开始,因为通过while后,$fetch已经是个数组,所以通过foreach遍历数组即可
foreach ($fetch as $value){
echo "<td>".$value."</td>";
}
echo "</tr>";
}
}
/*
* 这个方法是将资源传出,表格在外面自定义样式
* */
public function showresult($query){
$result = mysql_query($query) or die($this->feedback='System Error ,Please contect admin');
return $result;
}
}
?>
|
PHP 中的 header() 函数,发送特定的缓存控制原始 HTTP 标头,header() 必须在任何实际输出之前调用,不论是来自普通的 HTML 标记,空行或者 PHP。在中文环境下,一个全角的空格也会导致难以查找的错误
代码如下 |
复制代码 |
<?php
//下面的语句设置此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可。
header("Expires: Mon, 26 Jul 1970 05:00:00 GMT");
//下面的语句设置此页面的最后更新日期(用格林威治时间表示)为当天,可以强迫浏览器获取最新资料
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
//告诉客户端浏览器不使用缓存,HTTP 1.1 协议
header("Cache-Control: no-cache, must-revalidate");
//告诉客户端浏览器不使用缓存,兼容HTTP 1.0 协议
header("Pragma: no-cache");
?> |
文章利用了一个简单的实例来实现php从数据库中读取数据详细讲解,有需要的朋友可以看看,这里同时还简单的讲到了安全问题。
先看段代码
代码如下 |
复制代码 |
<?php
session_start();
$con=mysql_connect('localhost','root','root') or die('链接数据库失败!');
mysql_query('set names utf8');
mysql_select_db('GuestBook');
$pagesize = 10;//每一页显示多少留言记录
if(isset($_GET['page'])&&$_GET['page']!='') $page=$_GET['page'];
else $page=0;
$sql = "SELECT a . * , b.name, b.email, b.qq, c.revert_time, c.revert
FROM post a
LEFT JOIN revert c ON ( a.id = c.post_id ) , guest b
WHERE a.guest_id = b.id
ORDER BY a.id DESC";
$numRecord = mysql_num_rows(mysql_query($sql));
$totalpage = ceil($numRecord/$pagesize);
$recordSql = $sql. " LIMIT ".$page*$pagesize.",".$pagesize;
$result = mysql_query($recordSql);
?>
|
下面来看看
第一行:我们暂时先不说,留到以后再说,暂时还用不到;
第二行——第五行:大家一定很眼熟吧,是的这里和post.php插入留言信息的时候的过程是一样的,也就不多说了。
7、8、9和19行我们暂时不说,这里是涉及到分页的,我们将会留到下一章详细的说明这个问题,因为分页的过程在web编程过程中几乎是一个必须要使用的功能。
在11-15行我们定义了一个数据库查询语句,在这条语句中我们用了left join …on..语句,关于这个语句的详细用法请参看Mysql手册联合查询部分。。
看第16行,
代码如下 |
复制代码 |
$numRecord = mysql_num_rows(mysql_query($sql));
|
这个语句中我们用mysql_query($sql)把我们定义的sql语句发给数据库来执行,这个语句执行以后会返回一个记录资源号,我们用外层的mysql_num_rows来取得有多少个匹配的记录——也就是返回的记录总数。
第17行我们用到了ceil函数,这个函数的功能是,进一法取整,也就是说两个数进行除法操作之后只要余数大于零整数部分就加一然后舍去小数部分,所以ceil(1/2)的结果是1,而不是我们通常所见到的0.5。这个对于我们来说很有用——也留到下一章分页的时候再说吧。
第19行,涉及到分页部分。但是这一行值得说的是,在PHP中字符串的相加,也就是字符串的连接。两个字符串相加的操作符是点,看例子:
代码如下 |
复制代码 |
$strFirst=”中国”;
$strTwo=”伟大的国度”;
$strSum = $strFirst.$strTwo;
echo $strSum;
|
输出的结果正如我们所料到的一样:中国伟大的国度。
第20行:我们发送一个带分页功能的sql语句到数据库执行,并把执行结果赋值给$result;
接着我们看,本页函数的第:128-154行,这个程序的片段功能是循环输出在数据库中查询到的记录。这是我们本章的重点:
看PHP的内置函数mysql_fetch_object()从结果集中取得一行作为对象,关于PHP的对象我们在高级编程栏目中将会详细的说明,我们这里只需要知道这种循环查询记录的方式,需要用 $对象->字段名 来访问就行了,执行起来的时候就是每一次指针下移一次,当遇到没有更多的记录的时候就返回一个false所以我们可以用while循环来读取$result的这个记录集。最终形成了while($rs=mysql_fetch_object($result))这个语句,循环调用mysql_fetch_object函数并且把每次返回的对象赋值给$rs变量,现在哦我们看这个循环的内部,我们可以用$rs->name来取得留言人姓名,用$rs->post_time来访问留言时间。
在显示post_time的时候我们做了一些处理,使用到了date()函数,记得我们存储留言的时候用到了time()函数,这个函数返回的是一个时间戳,就是从1970年的第一秒起到现在已经经过的秒数(格林尼治时间)。而date函数就是把这个秒数翻译为我们所需要的时间格式,返回怎样的字符串需要们在date()函数的第一个参数中制定,该函数的第二个参数如果没有给出,也就是需要翻译成时间格式的秒数没有给出的话,他就会以当前时间来翻译。
Date(“Y年m月d日 H:i:s”),输出结果就是2009年4月26日 11:16:20。
我们在index.php的132行有这样的写法:
代码如下 |
复制代码 |
<?php echo date(”Y-m-d H:i:s”,$rs->post_time+8*3600)?>
|
我们具体说说这个,我想大家一定会对8*3600这个地方感到奇怪,其实原因很简单。咱们用time()函数存储时间的时候用的是格林尼治时间,这个时间和我们的时间相差刚好八个小时,每个小时3600秒,我们处在东方比西方的时间快所以要加上的。记住我们用的是北京时间——处在东八时区哦,这个是常识!关于这一点还有一个做法,这将会在专门阐述PHP的日期函数的文章里详细说明。
144和146行都用了两个函数htmlspcialchars和nl2br,其中htmlspcialchars这个函数是为了避免用户输入的脚本代码(html和javascript)被执行而必须的,这个函数很重要。如果没有这个函数用户输入的js代码和html代码都会被作为页面程序的一部分被执行,这一点我们在《关于PHP代码安全性建议》一文中已经说过,不在赘述。
nl2br这个函数的作用是讲数据中的n换行转换成html的换行<br/>以便于页面表现。在我们输入留言信息的时候,用的<textarea></textarea>这个表单,保存信息的时候,换行使用n来表示的所以我们这里需要转换,以保留用户输入信息在显示的时候我输入时段落一致。
标签:[!--infotagslink--]