常见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中的array数组类型分析说明
Jul 27 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
完善CodeIgniter在IDE中代码提示功能的方法
Jul 19 PHP
PHP高级编程实例:编写守护进程
Sep 02 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
PHP微信支付实例解析
Jul 22 PHP
PHP计算近1年的所有月份
Mar 13 PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
javascript 表单验证常见正则
2009/09/28 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
深入理解python函数递归和生成器
2016/06/06 Python
python爬取网页转换为PDF文件
2018/06/07 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python怎么自定义捕获错误
2020/06/29 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
大学感恩节活动策划方案
2014/10/11 职场文书
学习保证书
2015/01/17 职场文书
李白故里导游词
2015/02/12 职场文书
迎新年主持词
2015/07/06 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书