常见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实现与ASP Banner组件相似的类
Oct 09 PHP
php 魔术函数使用说明
Feb 21 PHP
ajax+php打造进度条代码[readyState各状态说明]
Apr 12 PHP
PHP 全角转半角实现代码
May 16 PHP
php 购物车完整实现代码
Jun 05 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 PHP
windows下apache搭建php开发环境
Aug 27 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
Apr 01 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
PHP的中使用非缓冲模式查询数据库的方法
Feb 05 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 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/03/15 PHP
一个图形显示IP的PHP程序代码
2007/10/19 PHP
如何用PHP实现插入排序?
2013/04/10 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
理解javascript闭包
2015/12/15 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
原生js二级联动效果
2017/06/20 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python win32 简单操作方法
2017/05/25 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
django框架两个使用模板实例
2019/12/11 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
python 实现两个线程交替执行
2020/05/02 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
兰兰过桥教学反思
2014/02/08 职场文书
环保建议书400字
2014/05/14 职场文书
Nginx配置根据url参数重定向
2022/04/11 Servers