从Web查询数据库之PHP与MySQL篇


Posted in PHP onSeptember 25, 2009

从Web查询数据库:Web数据库架构的工作原理
一个用户的浏览器发出一个HTTP请求,请求特定的Web页面,在该页面中出发form表单提交到php脚本文件(如:results.php)中处理
Web服务器接收到对results.php页面的请求后,检索文件,并将其传递给PHP引擎处理
PHP引擎开始解析脚本。脚本主要包括了连接数据库和执行查询的命令。PHP启动了对MySQL服务器的连接并向该服务器发送适当的查询。
MySQL服务器接收到数据库查询的请求,开始处理这个查询,并将查询结果返回给PHP引擎。
PHP引擎完成了脚本的运行后,将该HTML返回Web服务器。
Web服务器再将HTML返回给客户端浏览器,用户就可以看到响应后的结果页面。
从Web查询数据库的基本步骤
检查并过滤来自用户的数据 首先,我们将过滤用户可能在其搜索条件的起始或结束位置不小心输入的空白字符,这是用函数trim()来实现。 我们这么麻烦的检查用户输入数据的原因是防止多个接口连接数据库,因为用户从不同的界面进入,这样可能导致安全问题。
然后,当准备使用用户输入的任何数据时,也要适当的过滤一些控制字符,当用户输入数据到数据库时必须转义数据,,此时 使用盗的函数有addslashes()函数、stripslashes()函数和get_magic_qutoes_gpc()函数。addslashes()函数为了数据 库查询语句等的需要在某些字符前加上了反斜线;stripslashes()函数去掉字符串中的反斜线字符;get_magic_qutoes_gpc()函数 魔术添加转义字符 “\”,获取当前活动配置magic_quotes_runtime设置,如果运行时关闭魔术引号,返回0,否则返回1。我们也可以使用 htmispecialchars()对HTML中的特殊意义字符警醒编码,htmispecialchars()函数把一些预定义的字符转换为 HTML 实体 【预定义的字符是:& (和号) 成为 & " (双引号) 成为 " ' (单引号) 成为 ' < (小于) 成为 < > (大于) 成为 >】
建立一个到适当数据库的连接 PHP为连接MySQL提供了函数库mysqli(i表示改进)。
当在PHP中使用mysqli函数库是可以使用面向对象或面向过程的语法:
1、面向对象, @ $db = new mysqli('hostname','username','password','dbname');返回一个对象
2、面向过程: @ $db = mysqli_connect('hostname','username','password','dbname');返回一个资源,这个资源表示数据库的连接,而且 如果使用过程方法,必须将这个资源传递到mysqli的所有其它函数。这与处理函数非常类似
mysqli的大多数函数都有面向对象接口和过程接口,二者的差异则在于过程版本的函数名称以mysqli_开头,同时要求传入mysqli_connect()函数获得的资源句柄。 对于这个规则来说,数据可连接是一个异常,因为它是由mysqli对象的构造函数来创建的。因此尝试连接时需要进行检查,mysqli_connect_errno()函数将在出现连接 错误时返回一个错误号,如果成功,则返回0.

请注意:
当连接到数据库是,通常会议错误抑制符@作为第一含代码。这样可以巧妙的处理任何错误,也可以通过异常来处理。另外,MySQK对同时连接 数据库的连接数量有一定的限制。MySQLi参数max_connections决定了同时连接的个数,该参数和相关的Apache参数MaxClients的作用是告诉服务器拒绝新的连接请求, 从而保证系统资源不会再系统忙碌时或系统瘫痪时被请求或使用。要设置Apache中的MaxClients参数可以编辑系统中的httpd.conf文件。要为MySQLi设置max_connections参数 可以编辑文件my.conf。
选择使用的数据库: 在MySQL命令行使用 use dbname;命令;在php中可以用$db->select_db(dbname);或mysqli_select_db(db_resource,dbname)。
查询数据库 要执行数据库查询,首先应构造查询语句:$query = "select * from user";然后运行 $result = $db->query($query);或者$result = mysqli_query($db,$query); 面向对象版本将返回一个结果对象;过程版本将返回一个结果资源。无论何种方法都将结果保存在$result变量中工以后使用。如果函数运行失败将返回false。
获取查询结果 使用不同的函数以不同的方式将查询结果从结果对象或标识符中取出来,结果对象或标识符是访问查询返回行的关键。
通常我们要得到结果集中记录行的行数,并且使用mysqli_fetch_assoc()函数。
返回行数:$num_results = $result->num_rows;(行数保存在对象的num_rows成员变量中)或$num_results = mysqli_num_rows($result);
然后使用循环遍历每一行,在循环中调用 $row = $result->fectch_assoc();或者 $row = mysqli_fetch_assoc($result);返回该行的信息。 如果是对象返回行则每个关键词为一个属性名,每个值为属性中的相应的值;如果以资源返回则返回数组。
还有其他从结果标识符中获取结果的方法,例如:使用$row = $result->fecth_row($result);或者$row = mysqli_fetch_row($result);将结果取回 到一个列举数组中;也可以使用$row = $result->fecth_object();或者 $row = mysqli_fecth_object($result);江一行去回到一个对象中。
从数据库断开 先释放结果集:$result->free();或 mysqli_free_result($result);然后关闭数据库连接:$db->close()或者 mysqli_close($db); 严格的说,这并不必须,因为脚本执行完毕的时候他们将被自动关闭。

从Web查询数据库:使用Prepared语句

mysqli函数库支持prepared语句的使用。它们对于在执行大量具有不同数据的相同查询时,可以提高速度,也可以免受SQL注射风格(injection-stytle——的攻击。
prepared语句的基本思想是可以向MySQL发送一个需要执行的查询模板,然后在单独发送数据。我们可以向相同的prepared语句发送大量的相同的数据;这个特性对批量处理的插入操作来说是非常有用的。

我们一般使用一下几个步骤:
1、构造模板。已插入为例: $query = "insert into user values(?,?,?,?)";

2、使用prepared语句,构建一个语句对象或需要用来完成实际处理的资源。 $stmt = $db->prepare($query);或者mysqli_stmt_prepare($query);

3、调用$stmt->bind_param("sssd",$str1,$str3,$str3,$int4)或者mysqli_stmt_bind_param("sssd",$str1,$str3,$str3,$int4) 告诉php那些变量应该被问号所替换。第一个参数是一个格式化字符串,后面是将要被替换的变量。

3、调用$stmt->execute()或者mysqli_stmt_execute()函数,将真正运行这个query语句
对于select类型查询,可以使用$stmt->bind_result()或mysqli_stmt_bind_result()函数提供希望填充结果列的变量列表,然后每次调用 $stmt->fetch()或者mysqli_stmt_fetch()函数时,结果集下一行的值将被填充到这些绑定变量中。

使用PHP与数据库交互的其他接口
PHP支持连接到许多不同数据库的函数,包括Oracle、Microsoft SQL Server和PostgreSQL。通常,连接和查询这些火速据库的基本原理是相同的,个别 函数名称可能不同。如果希望使用PHP还没有提供支持的特殊数据库,可以使用常规的ODBC函数。
ODBC表示开放的数据库连接,他是连接数据库的标准。ODBC只具有任何函数集的优先功能,如果要求必须兼容所有的数据库,就不能使用任何数据库的特殊功能。
除了PHP附带的函数库以外,一些可供使用的数据库抽象类如MDB2允许为不同的数据库类型使用相同的函数名。但是要提前安装抽象层,例如安装PEAR MDB2抽象层。

PHP 相关文章推荐
色色整理的PHP面试题集锦
Mar 08 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
设置php页面编码的两种方法示例介绍
Mar 03 PHP
PHP中is_dir()函数使用指南
May 08 PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 PHP
yii插入数据库防并发的简单代码
May 27 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
php如何计算两坐标点之间的距离
Dec 29 PHP
PHP实现的策略模式示例
Mar 20 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
PHP中多字节字符串操作实例详解
Aug 23 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 #PHP
php 代码优化的42条建议 推荐
Sep 25 #PHP
PHP下通过系统信号量加锁方式获取递增序列ID
Sep 25 #PHP
PHP 日常开发小技巧
Sep 23 #PHP
php程序之die调试法 快速解决错误
Sep 17 #PHP
火车采集器 免费版使出收费版本功能实现原理
Sep 17 #PHP
使用php来实现网络服务
Sep 15 #PHP
You might like
php代码优化及php相关问题总结
2006/10/09 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
JS模拟多线程
2007/02/07 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
Fanatics法国官网:美国体育电商
2019/08/27 全球购物
PHP面试题集
2016/12/18 面试题
幼儿园秋游感想
2014/03/12 职场文书
会计岗位说明书
2014/07/29 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书