从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 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
利用 window_onload 实现select默认选择
Oct 09 PHP
Zend Guard一些常见问题解答
Sep 11 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
PHP写的求多项式导数的函数代码
Jul 04 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
php数组随机排序实现方法
Jun 13 PHP
Yii开启片段缓存的方法
Mar 28 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 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
模拟xcopy的函数
2006/10/09 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
js实现图片实时时钟
2020/01/15 Javascript
python正则表达式re之compile函数解析
2017/10/25 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
编写python代码实现简单抽奖器
2020/10/20 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
领导干部培训感言
2014/01/23 职场文书
安全标准化汇报材料
2014/02/03 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
优秀党支部申报材料
2014/12/24 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang