常见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 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
php常用Output和ptions/Info函数集介绍
Jun 19 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
PHP中的多种加密技术及代码示例解析
Oct 20 PHP
PHP实现的曲线统计图表示例
Nov 10 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
Yii2框架数据验证操作实例详解
May 02 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
如何使用php生成zip压缩包
Apr 21 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
我的论坛源代码(二)
2006/10/09 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
php定时执行任务设置详解
2015/02/06 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
浅谈javascript 函数内部属性
2015/01/21 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
vue中使用input[type="file"]实现文件上传功能
2018/09/10 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
Python 多维List创建的问题小结
2019/01/18 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
物业管理大学生个人的自我评价
2013/10/10 职场文书
大学生个人推荐信范文
2013/11/25 职场文书
合同专员岗位职责
2013/12/18 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
暂住证证明
2015/06/19 职场文书
初中团支书竞选稿
2015/11/21 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技