常见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类
Nov 25 PHP
PHP读取xml方法介绍
Jan 12 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
关于PHPDocument 代码注释规范的总结
Jun 25 PHP
php实现监听事件
Nov 06 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
Mar 17 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP使用in_array函数检查数组中是否存在某个值
Mar 25 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 PHP
laravel 获取当前url的别名方法
Oct 11 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中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
python 数据加密代码
2008/12/24 Python
Python中的类学习笔记
2014/09/23 Python
Python版微信红包分配算法
2015/05/04 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python3字符串学习教程
2015/08/20 Python
Python时间获取及转换知识汇总
2017/01/11 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
中国梦的演讲稿
2014/01/08 职场文书
金融专业大学生自我评价
2014/01/09 职场文书
博士论文答辩开场白
2015/06/01 职场文书
导游词之湖北武当山
2019/09/23 职场文书