常见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 相关文章推荐
优化使用mysql存储session的php代码
Jan 10 PHP
PHP下打开URL地址的几种方法小结
May 16 PHP
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
php堆排序(heapsort)练习
Nov 13 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
php自动载入类用法实例分析
Jun 24 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
php爬取天猫和淘宝商品数据
Feb 23 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 session有效期问题
2009/04/26 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
改变隐藏的input中value的值代码
2013/12/30 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
angular第三方包开发整理(小结)
2018/04/19 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python中字典dict常用操作方法实例总结
2015/04/04 Python
Python smallseg分词用法实例分析
2015/05/28 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
如何使用python传入不确定个数参数
2020/02/18 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
全球在线商店:BerryLook
2019/04/14 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
热爱祖国的演讲稿
2014/05/04 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
新郎答谢词
2015/01/04 职场文书
社区低保工作总结2015
2015/07/23 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP