常见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 相关文章推荐
使用数据库保存session的方法
Oct 09 PHP
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
php分页思路以及在ZF中的使用
May 30 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
跟我学Laravel之视图 & Response
Oct 15 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
PHP7 标准库修改
Mar 09 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
ip签名探针
2006/10/09 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
js验证上传图片的方法
2015/05/12 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
jquery选择器简述
2015/08/31 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
Python实现FTP文件传输的实例
2019/07/07 Python
Django的性能优化实现解析
2019/07/30 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
应届生人事助理求职信
2013/11/09 职场文书
数控专业大学生的自我鉴定
2013/11/13 职场文书
校友会欢迎辞
2014/01/13 职场文书
运动会表扬稿大全
2014/01/16 职场文书
实习老师离校感言
2014/02/03 职场文书
个人廉洁自律承诺书
2014/03/27 职场文书
律师授权委托书范本
2014/10/07 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
小学生交通安全寄语
2015/02/27 职场文书
小学教师节活动总结
2015/03/20 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书