php pdo模仿mysql函数_php – 如何用PDO替换MySQL函数?

我看到很多代码发布在SO上实现my_sql函数.其他人(包括我自己)的评论迫使提问者放弃MysqL功能并开始使用PDO或MysqLI.这篇文章是为了帮助.您可以参考它,因为它提供了对它们被弃用的原因和PDO的解释,以及实现PDO的最小代码示例.

首先:

从MysqL函数到PDO的转换不是搜索和替换的简单情况. PDO是一种面向对象的编程,用于PHP语言.

这意味着使用MysqL函数编写代码的另一种方法.首先为什么转换?

为什么不推荐使用MysqL函数?

MysqL扩展是古老的,自15年前发布的PHP 2.0以来一直存在(!!);这是一个与现代PHP完全不同的野兽,试图摆脱过去的不良做法. MysqL扩展是一个非常原始的,低级别的MysqL连接器,缺少许多便利功能,因此很难以安全的方式正确应用;这对新手来说很糟糕.许多开发人员不理解sql注入,并且MysqL API非常脆弱,即使您已经意识到它也很难阻止它.它充满了全局状态(例如,隐式连接传递),这使得编写难以维护的代码变得容易.由于它已经陈旧,因此在PHP核心级别维护可能是不合理的.

MysqLi扩展更新,并修复了上述所有问题. PDO也很新,并且修复了所有这些问题,还有更多.

由于这些原因*将来某个时候将删除MysqL扩展.

如何实施PDO

PDO提供了一种连接多个数据库的解决方案.这个答案仅涵盖MysqL和MSsql服务器.

连接到MysqL数据库,先决条件

这非常简单,不需要任何预先设置的PHP.现代PHP安装是标准附带的模块,允许PDO连接到MysqL服务器.

The module is PHP_pdo_MysqL.dll

连接到MSsql数据库的先决条件

这是一个更高级的设置.你需要PHP_pdo_sqlsrv _ ## _ ts.dll或PHP_pdo_sqlsrv _ ## _ nts.dll驱动程序.它们是版本特定的##.在撰写本文时,微软已经发布了

PHP 5.5.x的官方驱动程序. 5.6驱动程序尚未由Microsoft正式发布,但在others之前可作为非官方版本提供.

The module is PHP_pdo_sqlsrv_##_ts.dll for the thread safe variant

The module is PHP_pdo_sqlsrv_##_nts.dll for the non-thread safe variant

使用PDO连接到数据库

要连接到数据库,您需要从PDO构造中创建新的PDO实例.

$connection = new PDO(arguments);

PDO构造函数需要3个必需参数和1个可选参数.

> DSN或数据源名称,主要是包含有关驱动程序,主机和数据库名称的信息的字符串.

>用户名

>密码

>选项

$dsn = 'MysqL:dbname=databasename;host=127.0.0.1';

$user = 'dbuser';

$password = 'dbpass';

$dbh = new PDO($dsn,$user,$password);

我们来看看$dsn:首先它定义了驱动程序(MysqL).然后是数据库名称,最后是主机.

连接到MSsql

$dsn = 'sqlsrv:Server=127.0.0.1;Database=databasename';

$user = 'dbuser';

$password = 'dbpass';

$dbh = new PDO($dsn,$password);

让我们来看看$dsn:首先它定义了驱动程序(sqlsrv).然后是主机,最后是数据库名称.

创建实例时,将建立与数据库的连接.您只需在执行PHP脚本期间执行一次此操作.

You need to wrap the PDO instance creation in a try-catch clause. If the creation fails a back trace is shown revealing critical information about your application,like username and password. To avoid this catch the errors.

try

{

$connection = new PDO($dsn,$password);

}

catch( PDOException $Exception )

{

echo "Unable to connect to database.";

exit;

}

To throw errors returned by your sql server add this options to your PDO instance using setAttribute: $connection->setAttribute( PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION );

执行查询

PDO使用预准备语句.这是PDO方法和MysqL函数之间的真正区别.后者非常容易受到sql-INJECTION的影响.一个人会构建一个这样的查询:

$sql = 'SELECT ID FROM users WHERE user = '.$username ;

当恶意网站或个人发布用户名注入器时; DROP TABLE用户.结果将是毁灭性的.您需要通过使用引号转义和封装字符串和变量来证明您的代码.必须这样做

对于每个查询.在较大的网站或维护不良的代码上,拥有允许sql注入的表单的风险可能会变得非常高.准备好的语句消除了第一层sql注入的可能性,如上例所示.

PDO驱动程序充当PHP服务器和数据库服务器之间的中间人,称为数据访问抽象层.它不会重写您的SQL查询,但确实提供了连接到多种数据库类型的通用方法

并为您处理将变量插入查询的过程. MysqL函数构造了执行PHP代码的查询.使用PDO,查询实际上是在数据库服务器上构建的.

一个准备好的sql示例:

$sql = 'SELECT ID,EMAIL FROM users WHERE user = :username';

注意区别;我们在字符串中使用:引入变量,而不是在字符串外使用$的PHP变量.另一种方式是:

$sql = 'SELECT ID,EMAIL FROM users WHERE user = ?';

如何执行实际查询

您的PDO实例提供了两种执行查询的方法.如果没有变量,可以使用query(),变量使用prepare(). query()在调用时立即执行.请注意面向对象的通话方式( – >).

$result = $connection->query($sql);

准备方法

prepare方法有两个参数.第一个是sql字符串,第二个是Array形式的选项.一个基本的例子

$connection->prepare($sql,array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

在我们的sql字符串示例中,我们使用了一个名为:username的命名变量.我们仍然需要将PHP变量,整数或字符串绑定到它.我们可以通过两种方式做到这一点.构建包含命名变量的数组作为键或使用方法bindParam或bindValue.

为简单起见,我将解释数组变量和方法bindValue.

排列

您可以对命名变量执行类似的操作,您可以将变量作为数组键提供:

$queryArguments = Array(':username' => $username);

这对于索引变量(?):

$queryArguments = Array($username);

添加完所需的所有变量后,可以调用execute()方法来执行查询.从而将数组作为参数传递给函数execute.

$result = $connection->execute($queryArguments);

bindValue

bindValue方法允许您将值绑定到PDO实例.该方法需要两个必需参数和一个可选参数.可选参数设置值的数据类型.

对于命名变量:

$connection->bindValue(':username',$username);

对于索引变量:

$connection->bindValue(1,$username);

将值绑定到实例后,可以在不传递任何参数的情况下调用execute.

$result = $connection->execute();

NOTE: You can only use a named variable once! Using them twice will result in a failure to execute the query. Depending on your settings this will or will not throw an error.

获取结果

同样,我将仅介绍从返回的集合中获取结果的基础知识. PDO是一个相当先进的补充.

使用fetch和fetchAll

如果您执行了select查询或执行了返回结果集的存储过程:

fetch是一种最多可能需要三个可选参数的方法.它从结果集中获取单行.默认情况下,它返回一个包含列名作为键和索引结果的Array.

我们的示例查询可以返回类似的内容

ID EMAIL

1 someone@example.com

fetch会将其返回为:

Array

(

[ID] => 1

[0] => 1

[EMAIL] => someone@example.com

[1] => someone@example.com

)

要回显结果集的所有输出:

while($row = $result->fetch())

{

echo $row['ID'];

echo $row['EMAIL'];

}

您可以在这里找到其他选项:fetch_style;

使用fetchall

获取一个Array对象中的所有行.使用与fetch相同的默认选项.

$rows = $result->fetchAll();

如果您使用的查询未返回结果(如插入或更新查询),则可以使用方法rowCount来检索受影响的行数.

一个简单的课程:

class pdoConnection

{

public $isConnected;

protected $connection;

public function __construct($dsn,$username,$password,$host,$dbname,$options=array())

{

$this->isConnected = true;

try {

$this->connection = new PDO($dsn,$options);

$this->connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); //sets the default to return 'named' properties in array.

}

catch(PDOException $e) {

$this->isConnected = false;

throw new Exception($e->getMessage());

}

}

public function Disconnect(){

$this->connection = null;

$this->isConnected = false;

}

public function query($sql)

{

try

{

$result = $this->connection->query($sql);

return $result;

}

catch(PDOException $e)

{

throw new Exception($e->getMessage());

}

}

public function prepare($sql,$params=array())

{

try

{

$result = $this->connection->prepare($sql);

$result->execute($params);

return $result;

}

catch(PDOException $e)

{

throw new Exception($e->getMessage());

}

}

}

如何使用:

$dsn = 'MysqL:dbname=databasename;host=127.0.0.1';

$user = 'dbuser';

$password = 'dbpass';

$db = new pdoConnection($dsn,$password);

$sql = 'SELECT ID,EMAIL FROM users WHERE user = :username';

$result = $db->prepare($sql,array(":username" => 'someone'));

while($row = $result->fetch())

{

echo $row['ID'];

echo $row['EMAIL'];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值