揭露php应用中五个常见的数据库问题& mdash& mdash包括数据库模式设计、数据库访问和使用数据库的业务逻辑代码& mdash& mdash以及他们的解决方案。
如果只有一种使用数据库的正确方法& hellip& hellip
可以用很多方法创建数据库设计、数据库访问、基于数据库的PHP业务逻辑代码,但最后通常都以出错告终。本文解释了数据库设计和访问数据库的PHP代码中的五个常见问题,以及遇到这些问题时如何修复。
问题1:直接使用mysql
一个常见的问题是,比较老的PHP代码直接使用mysql_ function访问数据库。清单1展示了如何直接访问数据库。
以下是引用的内容:
& lt?PHP
函数get _ user _ id($ name)
{
$ db = MySQL _ connect(' localhost ',' root ',' password ');
MySQL _ select _ db(' users ');
$ RES = MySQL _ query(& quot;从登录= '的用户中选择id & quot;。$name。& quot'");
while($ row = MySQL _ fetch _ array($ RES)){ $ id = $ row[0];}
返回$ id
}
var _ dump(get _ user _ id(' jack '));
?& gt
注意,mysql_connect函数用于访问数据库。另请注意查询,其中使用字符串连接将$name参数添加到查询中。
这项技术有两个很好的替代品:PEAR DB模块和PHP数据对象(PDO)类。两者都提供了特定数据库选择的抽象。因此,您的代码可以在IBM & reg中实现无需太多调整。DB2 & regMySQL、PostgreSQL或任何其他你想连接的数据库。
使用PEAR DB模块和PDO抽象层的另一个价值是,你可以在SQL语句中使用它?接线员。这样做将使SQL更容易维护,并保护您的应用程序免受SQL注入攻击。
使用PEAR DB的替代代码如下所示。
以下是引用的内容:
& lt?PHP
require _ once(& quot;DB.php & quot);
函数get _ user _ id($ name)
{
$ DSN = ' MySQL://root:password @ localhost/users ';
$ db = & amp;DB::Connect( $dsn,array());
if(PEAR::isError($ db)){ die($ d B- & gt;getMessage());}
$ RES = $ d B- & gt;查询('从登录=?'的用户中选择id ',
array($ name));
$ id = null;
while($ RES-& gt;fetchInto($ row)){ $ id = $ row[0];}
返回$ id
}
var _ dump(get _ user _ id(' jack '));
?& gt
注意,除了$dsn中的数据库连接字符串之外,所有对MySQL的直接使用都被取消了。另外,我们通过了?运算符在SQL中使用$name变量。然后,通过query()方法末尾的数组发送查询的数据。
问题2:不要使用自动递增功能。
像大多数现代数据库一样,MySQL可以为每个记录创建唯一的标识符。此外,我们仍然可以看到这样的代码,它首先运行一个SELECT语句来查找最大的id,然后将id递增1并找到一个新记录。清单3显示了一个坏模式的例子。
以下是引用的内容:
如果存在用户,则删除表;
创建表用户(
id介质,
登录文本,
密码文本
);
插入到用户值(1,'杰克','通过');
插入用户值(2,' joan ',' pass ');
插入用户值(1,' jane ',' pass ');
这里,的id字段被简单地指定为一个整数。因此,尽管它应该是惟一的,我们仍然可以添加任何值,如CREATE语句后的几个INSERT语句所示。清单4显示了将用户添加到这种模式的PHP代码。
以下是引用的内容:
& lt?PHP
require _ once(& quot;DB.php & quot);
函数add_user( $name,$ pass)
{
$ rows = array();
$ DSN = ' MySQL://root:password @ localhost/bad _ badid ';
$ db = & amp;DB::Connect( $dsn,array());
if(PEAR::isError($ db)){ die($ d B- & gt;getMessage());}
$ RES = $ d B- & gt;查询(& quot从用户中选择最大& quot);
$ id = null;
while($ RES-& gt;fetchInto($ row)){ $ id = $ row[0];}
$ id+= 1;
$ sth = $ d B- & gt;准备(& quot插入到用户值(?,?,?)& quot);
$ d B- & gt;execute( $sth,array( $id,$name,$ pass));
返回$ id
}
$id = add_user( 'jerry ',' pass ');
var _ dump($ id);
?& gt
本文链接:http://www.123down.cn/gonglue/227208.html