PHP数据库常出现哪些问题?(2)_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

PHP数据库常出现哪些问题?(2)

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:问题哪些出现数据库
黑客防线网安网讯:  注意使用了mysql_connect函数来访问数据库。还要注意查询,其中使用字符串连接来向查询添加$name参数。    该技术有两个很好的替代方案:PEARDB模块和PHPDataObjects(PDO)类。两者都...
  注意使用了mysql_connect函数来访问数据库还要注意查询其中使用字符串连接来向查询添加$name参数
  
  该技术有两个很好的替代方案:PEARDB模块和PHPDataObjects(PDO)类。两者都从特定数据库选择提供抽象。因此您的代码无需太多调整就可以在IBM®DB2®、MySQL、PostgreSQL或者您想要连接到的任何其他数据库上运行。
  
  使用PEARDB模块和PDO抽象层的另一个价值在于您可以在SQL语句中使用?操作符。这样做可使SQL更加易于维护,且可使您的应用程序免受SQL注入攻击。
  
  使用PEARDB的替代代码如下所示。
  
  以下为引用的内容:
  
  <?php
  
  require_once("DB.php");
  
  functionget_user_id($name)
  
  {
  
  $dsn='mysql://root:password@localhost/users';
  
  $db=&DB::Connect($dsn,array());
  
  if(PEAR::isError($db)){die($db->getMessage());}
  
  $res=$db->query('SELECTidFROMusersWHERElogin=?',
  
  array($name));
  
  $id=null;
  
  while($res->fetchInto($row)){$id=$row[0];}
  
  return$id;
  
  }
  
  var_dump(get_user_id('jack'));
  
  ?>
  
  清单2.Access/get_good.php
  
  注意,所有直接用到MySQL的地方都消除了,只有$dsn中的数据库连接字符串除外。此外,我们通过?操作符在SQL中使用$name变量。然后,查询的数据通过query()方法末尾的array被发送进来。
  
  问题2:不使用自动增量功能
  
  与大多数现代数据库一样,MySQL能够在每记录的基础上创建自动增量惟一标识符。除此之外,我们仍然会看到这样的代码,即首先运行一个SELECT语句来找到最大的id,然后将该id增1,并找到一个新记录。清单3展示了一个示例坏模式。
  
  以下为引用的内容:
  
  DROPTABLEIFEXISTSusers;
  
  CREATETABLEusers(
  
  idMEDIUMINT,
  
  loginTEXT,
  
  passwordTEXT
  
  );
  
  INSERTINTOusersVALUES(1,'jack','pass');
  
  INSERTINTOusersVALUES(2,'joan','pass');
  
  INSERTINTOusersVALUES(1,'jane','pass');
  
  清单3.Badid.sql
  
  这里的id字段被简单地指定为整数。所以,尽管它应该是惟一的,我们还是可以添加任何值,如CREATE语句后面的几个INSERT语句中所示。清单4展示了将用户添加到这种类型的模式的PHP代码。
  
  以下为引用的内容:
  
  <?php
  
  require_once("DB.php");
  
  functionadd_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("SELECTmax(id)FROMusers");
  
  $id=null;
  
  while($res->fetchInto($row)){$id=$row[0];}
  
  $id+=1;
  
  $sth=$db->prepare("INSERTINTOusersVALUES(?,?,?)");
  
  $db->execute($sth,array($id,$name,$pass));
  
  return$id;
  
  }
  
  $id=add_user('jerry','pass');
  
  var_dump($id);
  
  ?>
  
  清单4.Add_user.php
  
  add_user.php中的代码首先执行一个查询以找到id的最大值。然后文件以id值加1运行一个INSERT语句。该代码在负载很重的服务器上会在竞态条件中失败。另外,它也效率低下。
  
  那么替代方案是什么呢?使用MySQL中的自动增量特性来自动地为每个插入创建惟一的ID。更新后的模式如下所示。
  
  以下为引用的内容:
  
  DROPTABLEIFEXISTSusers;
  
  CREATETABLEusers(
  
  idMEDIUMINTNOTNULLAUTO_INCREMENT,
  
  loginTEXTNOTNULL,
  
  passwordTEXTNOTNULL,
  
  PRIMARYKEY(id)
  
  );
  
  INSERTINTOusersVALUES(null,'jack','pass');
  
  INSERTINTOusersVALUES(null,'joan','pass');
  
  INSERTINTOusersVALUES(null,'jane','pass');
  
  清单5.Goodid.php
  
  我们添加了NOTNULL标志来指示字段必须不能为空。我们还添加了AUTO_INCREMENT标志来指示字段是自动增量的,添加PRIMARYKEY标志来指示那个字段是一个id。这些更改加快了速度。清单6展示了更新后的PHP代码,即将用户插入表中。
  
  以下为引用的内容:
  
  <?php
  
  require_once("DB.php");
  
  functionadd_user($name,$pass)
  
  {
  
  $dsn='mysql://root:password@localhost/good_genid';
  
  $db=&DB::Connect($dsn,array());
  
  if(PEAR::isError($db)){die($db->getMessage());}
  
  $sth=$db->prepare("INSERTINTOusersVALUES(null,?,?)");
  
  $db->execute($sth,array($name,$pass));
  
  $res=$db->query("SELECTlast_insert_id()");
  
  $id=null;
  
  while($res->fetchInto($row)){$id=$row[0];}
  
  return$id;
  
  }
  
  $id=add_user('jerry','pass');
  
  var_dump($id);
  
  ?>
  
  清单6.Add_user_good.php
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17559-1.html
网站维护教程更新时间:2012-09-21 05:21:12  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer