php从数据库中读取数据实现方法

 更新时间:2016年11月25日 17:10  点击:2171
文章利用了一个简单的实例来实现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来表示的所以我们这里需要转换,以保留用户输入信息在显示的时候我输入时段落一致。

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中实现分页,这个就是基于自己写的留方板程序了,有需要的朋友可以参考一下,很适合于初学者哦。

分页的关键问题其实在于Mysql的一个关键字limite这个关键字后边跟的两个数字,第一个是需要记录的开始行数,第二个数字是从这个开始行数后取得几行记录——这一点大家不要误以为是从第几行开始到第几行结束,相差很远的。

看看我们index.php的第19行:

 代码如下 复制代码

$recordSql = $sql. ” LIMIT “.$page*$pagesize.”,”.$pagesize;

其中变量$page的判断在程序的第8行和第9行得到的:

 代码如下 复制代码

if(isset($_GET['page'])&&$_GET['page']!=”) $page=$_GET['page'];
else $page=0;

当然大家也看到了$_GET['page']变量这个下文会说到。

变量$pagesize我们在第7行自己定义的,也就是每页显示多少条记录,我们定义的是10条。当变量$page=0的时候我们语句最终会是这样的:

 代码如下 复制代码
$recordSql = "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
  " LIMIT 0,10";

就是从0条记录开始取得10个记录结果——这个是包括第0条记录的;
当$page=1的时候呢?可想而知了——这个时候$page*$pagesize=10,当然是从……不说了,再说就罗嗦了。

还有需要说的是,为什么我们要在取得总行数之后才加上这个limit呢,很简单嘛,如果我们在取得结果记录数的时候就加上这个limit,我们总行数永远不会大于10,因为加上之后他最多返回的记录数就是10啊兄弟。——这个显然不符合实际情况。所以我们在执行了:

 代码如下 复制代码
mysql_num_rows(mysql_query($sql));

取得总记录数,之后才加上limit关键字的。

好了我们已经取得了总记录数,设置了每页显示的记录数10,现在我们需要的就只有总页数了,这个小学的问题我就不说了吧?当然是总记录数除以每页显示的数就是总页数了——当然也有除不尽的时候,例如总记录数11每页显示10个,我们需要分几页呢?当然是两页呢,怎么才能让11/10=2呢?——显然是错误的,但是实际生活就这样并不是完美的数学。使用ceil函数啊,这个上一章也说过了,不说了。

看看我们现在有什么了啊:

 代码如下 复制代码
总记录数,$numRecord = mysql_num_rows(mysql_query($sql));
总页数,$totalpage = ceil($numRecord/$pagesize);

我们什么都不缺了,就差如何显示“上一页下一页”了,很简单,两个判断就搞定了,看index.php的159-163行:

第160行:

 代码如下 复制代码
if($page>0) echo "<a href=index.php?page=".($page-1).">上一页|</a>" ;

如果变量$page>0的话,也就是当前的页码大于0说明有上一页,那么就显示“上一页”的链接,这个链接里面的$page需要减一,例如当前页是2,那么上一页当然是1了是不是,当我们点击上一页的时候,随着这个链接将会把page=1传递过去,这种依靠链接传递变量的方式就是get方法。 这就回到了程序8行9行进行处理了。

在161行,我们做的判断是,如果当前页数小于总记录数-1——因为我们的页码是从0开始的,所以总记录数要减一进行判断才符合实际。如果这个判断成立,说明还有下一页,下一页的时候$page当然要加一了。

好了整个分页就是这样了,只要记住,如何取得总记录数,如何为sql语句加上limit关键字,如何判断显示上下页,一切都ok了

完整的代码

 代码如下 复制代码

$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);

<table width="800" border="0" align="center" bgcolor="#fefefe">
<?php
while($rs=mysql_fetch_object($result)){
?>
  <tr>
    <td class="tdhx">留言人:<?php echo $rs->name?> |Email:<?php echo $rs->email?>|QQ:<?php echo $rs->qq?>|留言时间:<?php echo date("Y-m-d H:i:s",$rs->post_time+8*3600)?></td>
  </tr>
  <?php
  if(isset($_SESSION['login'])&&$_SESSION['login']){
  ?>
    <tr>
    <td class="tdhx"><a href="revert.php?id=<?php echo $rs->id?>">回复</a> | <a href="delete.php?id=<?php echo $rs->id?>">删除</a></td>
  </tr>
  <?php
  }
  ?>
  <tr>
    <td>留言内容:<?php echo nl2br(htmlspecialchars($rs->post))?><br/>
    <font color="Red">
    回复内容:<?php echo nl2br(htmlspecialchars($rs->revert))?>[<?php if($rs->revert_time!="") echo date("Y-m-d H:i:s",$rs->revert_time+8*3600)?> ]
    </font>
   
    </td>
  </tr>
  <tr><td height="3px"  bgcolor="##FF6600"></td></tr>
<?php
}
?>
</table>
<table width="800" border="0" align="center" bgcolor="#B1C3D9">
  <tr>
    <td >
<?php
if($page>0) echo "<a href='index.php?page=".($page-1)."'>上一页|</a>" ;
if($page<$totalpage-1) echo "<a href='index.php?page=".($page+1)."'>下一页</a>" ;
?></td>
  </tr>
</table>

本文章利用了php中的二个重要的目录操作函数,来实现遍历目录下的目录以及目录下的文件的实现方法,函数我们详细了介绍了,下面看实例
 代码如下 复制代码

<?php

function listFiles($path){
$result = array();
foreach(glob($path.'\'."*") as $item){
$result[strtolower($item)] = $item;
if(is_dir($item)){
$result += listFiles($item);
}
}
return $result;
}
$path = 'E:\web\dianle';
foreach(listFiles($path) as $item){
echo $item.'<br />';
}


function listFiles($path){
$result = array();
foreach( scandir($path) as $item ){
if($item != '.' && $item != '..' ){
$item = $path.'\'.$item;
$result[strtolower($item)] = $item;
if(is_dir($item)){
$result += listFiles($item);
}
}
}
return $result;
}
$path = 'E:\web\dianle';
foreach(listFiles($path) as $item){
echo $item.'<br />';
}
?>

 

用到的一个函数

scandir() 函数返回一个数组,其中包含指定路径中的文件和目录。

若成功,则返回一个数组,若失败,则返回 false。如果 directory 不是目录,则返回布尔值 false 并生成一条 E_WARNING 级的错误。

语法

scandir(directory,sort,context)

参数 描述
directory 必需。规定要扫描的目录。
sort 可选。规定排列顺序。默认是 0 (升序)。如果是 1,则为降序。
context 可选。规定目录句柄的环境。context 是可修改目录流的行为的一套选项

 

现在看另一个函数

glob() 函数返回匹配指定模式的文件名或目录。

该函数返回一个包含有匹配文件 / 目录的数组。如果出错返回 false。

语法

glob(pattern,flags)

参数 描述
file 必需。规定检索模式。
size

可选。规定特殊的设定。

  • GLOB_MARK - 在每个返回的项目中加一个斜线
  • GLOB_NOSORT - 按照文件在目录中出现的原始顺序返回(不排序)
  • GLOB_NOCHECK - 如果没有文件匹配则返回用于搜索的模式
  • GLOB_NOESCAPE - 反斜线不转义元字符
  • GLOB_BRACE - 扩充 {a,b,c} 来匹配 'a','b' 或 'c'
  • GLOB_ONLYDIR - 仅返回与模式匹配的目录项
  • GLOB_ERR - 停止并读取错误信息(比如说不可读的目录),默认的情况下忽略所有错误

注释:GLOB_ERR 是 PHP 5.1 添加的

文章兴实例说明$_GET,$_POST,$_REQUEST的各处优点和不足以及它们三个的用法以实例说明,有需要的朋友可以参考一下。

1. $_REQUEST

默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。

 代码如下 复制代码

<?php

$_GET['foo'] = 'a';
$_POST['bar'] = 'b';
var_dump($_GET); // Element 'foo' is string(1) "a"
var_dump($_POST); // Element 'bar' is string(1) "b"
var_dump($_REQUEST); // Does not contain elements 'foo' or 'bar'

?>

注:它的速度比其它的要慢一些

2. $_GET

$_GET 变量用于收集来自 method="get" 的表单中的值。从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送的信息量也有限制(最多 100 个字符)。

实例

 代码如下 复制代码

welcome.php?name=Peter&age=37

welcome.php" 文件现在可以通过 $_GET 变量来获取表单数据了(请注意,表单域的名称会自动成为 $_GET 数组中的 ID 键):

 代码如下 复制代码

Welcome <?php echo $_GET["name"]; ?>.<br />
You are <?php echo $_GET["age"]; ?> years old!

注:数据量不能过大最多只能100个字符或2kb

3. $_POST

$_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值。

$_POST 变量用于收集来自 method="post" 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

 代码如下 复制代码

<form action="welcome.php" method="post">
Enter your name: <input type="text" name="name" />
Enter your age: <input type="text" name="age" />
<input type="submit" />
</form>

selcome.php文件

 代码如下 复制代码

Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old!

注:比get要好很多数据处理量大同时大多用于表单。


三区别在于$_REQUEST可以获取$_GET和$_post的数据,但是效率相对于前二者是要慢些,为什么慢我想大家用脚指都能想明白的,这里就留下大家思想吧。

[!--infotagslink--]

相关文章

  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Intellij IDEA连接Navicat数据库的方法

    这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • mysqldump命令导入导出数据库方法与实例汇总

    mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
  • Mysql数据库错误代码中文详细说明

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • c# 对CSV文件操作(写入、读取、修改)

    这篇文章主要介绍了c# 如何对CSV文件操作,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下...2020-11-03
  • python读取和保存mat文件的方法

    本文主要介绍了python读取和保存mat文件的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-25