从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初学者头疼十四条问题大总结
Nov 12 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
php+ajax实现的点击浏览量加1
Apr 16 PHP
php fread读取文件注意事项
Sep 24 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
php pdo连接数据库操作示例
Nov 18 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 文章采集正则代码
2009/12/28 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
2014/06/23 PHP
php分页函数完整实例代码
2014/09/22 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
用python制作游戏外挂
2018/01/04 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
python3中rank函数的用法
2019/11/27 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
Tensorflow累加的实现案例
2020/02/05 Python
浅谈python 类方法/静态方法
2020/09/18 Python
python线程优先级队列知识点总结
2021/02/28 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
会计实习生工作总结的自我评价
2013/10/07 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
详解Python魔法方法之描述符类
2021/05/26 Python