常见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下对字符串的递增运算代码
Aug 21 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
PHP引用的调用方法分析
Apr 25 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
Jul 28 PHP
PHP对象链式操作实现原理分析
Oct 09 PHP
jQuery+php简单实现全选删除的方法
Nov 28 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 PHP
PHP连续签到功能实现方法详解
Dec 04 PHP
微信小程序和php的登录实现
Apr 01 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
php中的时间处理
2006/10/09 PHP
wordpress之wp-settings.php
2007/08/17 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
Javascript中Eval函数的使用说明
2008/10/11 Javascript
javascript Excel操作知识点
2009/04/24 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
Python实现购物程序思路及代码
2017/07/24 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
python中元组的用法整理
2020/06/15 Python
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
暑期培训随笔感言
2014/03/10 职场文书
房屋租赁协议书范本
2014/04/10 职场文书