常见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 相关文章推荐
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 PHP
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
header跳转和include包含问题详解
Sep 08 PHP
php实现mysql数据库操作类分享
Feb 14 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
PHP中的表达式简述
May 29 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
PHP new static 和 new self详解
Feb 19 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
php 可变函数使用小结
Jun 12 PHP
PHP观察者模式定义与用法实例分析
Mar 22 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
基于mysql的bbs设计(五)
2006/10/09 PHP
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
js数组的操作指南
2014/12/28 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
Python实现的购物车功能示例
2018/02/11 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
资源环境与城市管理专业推荐信
2013/11/30 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
党员创先争优心得体会
2014/09/11 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS