常见PHP数据库解决方案分析介绍


Posted in PHP onSeptember 24, 2015

我们在使用PHP连接数据库的时候会遇到很多问题,文章这里揭露PHP应用程序中出现的常见数据库问题 —— 包括数据库模式设计、数据库访问和使用数据库的业务逻辑代码 —— 以及它们的解决方案。如果只有一种方式使用数据库是正确的。

常见PHP数据库解决方案分析介绍 

PHP数据库问题:直接使用MySQL

一个常见问题是较老的 PHP 代码直接使用 mysql_ 函数来访问数据库。清单 1 展示了如何直接访问数据库。

清单 1. Access/get.php

<?php  
function get_user_id( $name )  
{  
$db = mysql_connect( 'localhost', 'root', 'password' );  
mysql_select_db( 'users' );  
$res = mysql_query( "SELECT id FROM users WHERE login='".$name."'" );  
while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }  
return $id;  
}  
var_dump( get_user_id( 'jack' ) );  
?>

注意使用了 mysql_connect 函数来访问数据库。还要注意查询,其中使用字符串连接来向查询添加 $name 参数。该技术有两个很好的替代方案:PEAR DB 模块和 PHP Data Objects (PDO) 类。两者都从特定数据库选择提供抽象。因此,您的代码无需太多调整就可以在 IBM? DB2?、MySQL、PostgreSQL 或者您想要连接到的任何其他数据库上运行。使用 PEAR DB 模块和 PDO 抽象层的另一个价值在于您可以在 SQL 语句中使用 ? 操作符。这样做可使 SQL 更加易于维护,且可使您的应用程序免受SQL 注入攻击。

清单 2. Access/get_good.php

<?php  
require_once("DB.php");  
function get_user_id( $name )  
{  
$dsn = 'mysql://root:password@localhost/users';  
$db =& DB::Connect( $dsn, array() );  
if (PEAR::isError($db)) { die($db->getMessage()); }  
$res = $db->query( 'SELECT id FROM users WHERE login=?',array( $name ) );  
$id = null;  
while( $res->fetchInto( $row ) ) { $id = $row[0]; }  
return $id;  
}  
var_dump( get_user_id( 'jack' ) );  
?>

注意,所有直接用到 MySQL 的地方都消除了,只有 $dsn 中的数据库连接字符串除外。此外,我们通过 ? 操作符在 SQL 中使用 $name 变量。然后,查询的数据通过 query() 方法末尾的 array 被发送进来。

PHP数据库问题 :不使用自动增量功能

与大多数现代数据库一样,MySQL 能够在每记录的基础上创建自动增量惟一标识符。除此之外,我们仍然会看到这样的代码,即首先运行一个 SELECT 语句来找到最大的 id,然后将该 id 增 1,并找到一个新记录。清单 3 展示了一个示例坏模式。

清单 3. Badid.sql

DROP TABLE IF EXISTS users;  
CREATE TABLE users (  
id MEDIUMINT,  
login TEXT,  
password TEXT  
);  
INSERT INTO users VALUES ( 1, 'jack', 'pass' );  
INSERT INTO users VALUES ( 2, 'joan', 'pass' );  
INSERT INTO users VALUES ( 1, 'jane', 'pass' );

这里的 id 字段被简单地指定为整数。所以,尽管它应该是惟一的,我们还是可以添加任何值,如 CREATE 语句后面的几个 INSERT 语句中所示。清单 4 展示了将用户添加到这种类型的模式的 PHP 代码。

清单 4. Add_user.php

add_user.php 中的代码首先执行一个查询以找到 id 的最大值。然后文件以 id 值加 1 运行一个 INSERT 语句。该代码在负载很重的服务器上会在竞态条件中失败。另外,它也效率低下。那么替代方案是什么呢?使用 MySQL 中的自动增量特性来自动地为每个插入创建惟一的 ID。

<?php  
require_once("DB.php");  
function add_user( $name, $pass )  
{  
$rows = array();  
$dsn = 'mysql://root:password@localhost/bad_badid';  
$db =& DB::Connect( $dsn, array() );  
if (PEAR::isError($db)) { die($db->getMessage()); }  
$res = $db->query( "SELECT max(id) FROM users" );  
$id = null;  
while( $res->fetchInto( $row ) ) { $id = $row[0]; }  
$id += 1;  
$sth = $db->prepare( "INSERT INTO users VALUES(?,?,?)" );  
$db->execute( $sth, array( $id, $name, $pass ) );  
return $id;  
}  
$id = add_user( 'jerry', 'pass' );  
var_dump( $id );  
?>

希望通过本文的介绍,能够让你对PHP数据库解决方案,更加了解。

PHP 相关文章推荐
聊天室php&mysql(五)
Oct 09 PHP
用PHP读取和编写XML DOM的实现代码
Feb 03 PHP
PHP开发中常用的字符串操作函数
Feb 08 PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
Zend Framework分发器用法示例
Dec 11 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 PHP
又十个超级有用的PHP代码片段
Sep 24 #PHP
PHP易混淆知识整理笔记
Sep 24 #PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 #PHP
PHP生成条形码大揭秘
Sep 24 #PHP
php商品对比功能代码分享
Sep 24 #PHP
php实现简易聊天室应用代码
Sep 23 #PHP
利用PHP如何实现Socket服务器
Sep 23 #PHP
You might like
php代码把全角数字转为半角数字
2007/12/10 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
javascript常用方法汇总
2014/12/02 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
js密码强度实时检测代码
2016/03/02 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
美国汽车交易网站:Edmunds
2016/08/17 全球购物
悬挂训练绳:TRX
2017/12/14 全球购物
教师学习群众路线心得体会
2014/11/04 职场文书
高三英语复习计划
2015/01/19 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
放假通知
2015/04/14 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android
Vue router配置与使用分析讲解
2022/12/24 Vue.js