常见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实现与ASP Banner组件相似的类
Oct 09 PHP
PHP生成静态页
Nov 25 PHP
php防注
Jan 15 PHP
说明的比较细的php 正则学习实例
Jul 30 PHP
php调用mysql数据 dbclass类
May 07 PHP
php中转义mysql语句的实现代码
Jun 24 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
PHP实现链式操作的原理详解
Sep 16 PHP
php版微信公众平台入门教程之开发者认证的方法
Sep 26 PHP
PHP 中常量的知识整理
Apr 14 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
php遍历数组的方法分享
2012/03/22 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
Python最长公共子串算法实例
2015/03/07 Python
简介Django中内置的一些中间件
2015/07/24 Python
回调函数的意义以及python实现实例
2017/06/20 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
Python extract及contains方法代码实例
2020/09/11 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
事务机电主管工作职责
2014/02/25 职场文书
规划编制实施方案
2014/03/15 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技