Php 如何用PDO替换MySQL函数?
当阅读关于MySQL函数的文章时。我遇到了这个消息 警告 从PHP5.5.0开始,此扩展已被弃用,将来将被删除。相反,应该使用MySQLi或PDO_MySQL扩展。有关更多信息,请参见MySQL:选择API指南和相关常见问题解答。此功能的替代方案包括:Php 如何用PDO替换MySQL函数?,php,sql,pdo,Php,Sql,Pdo,当阅读关于MySQL函数的文章时。我遇到了这个消息 警告 从PHP5.5.0开始,此扩展已被弃用,将来将被删除。相反,应该使用MySQLi或PDO_MySQL扩展。有关更多信息,请参见MySQL:选择API指南和相关常见问题解答。此功能的替代方案包括: 我读过关于PDO的书。如何使用MySQL或MSSQL将我的代码更新为PDO?我在上面看到了很多代码,因此实现了我的sql函数。以及其他人(包括我自己)的评论,敦促提问者放弃MySQL函数,开始使用PDO或MySQLI。这篇文章是来帮助你的
我读过关于PDO的书。如何使用MySQL或MSSQL将我的代码更新为PDO?我在上面看到了很多代码,因此实现了我的sql函数。以及其他人(包括我自己)的评论,敦促提问者放弃MySQL函数,开始使用PDO或MySQLI。这篇文章是来帮助你的。您可以参考它,因为它解释了为什么不推荐使用它们以及什么是PDO,并提供了实现PDO的最小代码示例 首先: 从mysql函数到PDO的转换不是简单的搜索和替换。PDO是PHP语言的面向对象编程插件。 这意味着编写代码的另一种方法与mysql函数相同。首先,为什么要皈依 为什么不推荐使用mysql函数? mysql扩展非常古老,从15年前发布的PHP2.0开始就存在了(!!);这与现代PHP截然不同,后者试图摆脱过去的坏习惯。mysql扩展是mysql的一个非常原始的低级连接器,它缺少许多方便的特性,因此很难以安全的方式正确应用;因此,这对noobs是不好的。许多开发人员不了解SQL注入,mysql API非常脆弱,即使您知道,也很难阻止它。它充满了全局状态(例如隐式连接传递),这使得编写难以维护的代码变得容易。因为它很旧,所以在PHP核心级别维护它可能会非常困难 mysqli扩展更新了很多,修复了上述所有问题。PDO也是相当新的,它也解决了所有这些问题,还有更多的问题 由于这些原因,mysql扩展将在将来某个时候被删除 来源 如何实现PDO PDO为连接多个数据库提供了一种解决方案。这个答案只涉及MySQL和MSSQL服务器 连接到MySQL数据库,先决条件 这相当简单,不需要任何预先设置的PHP。现代PHP安装标准附带了一个模块,该模块允许PDO连接到MySQL服务器 模块是
php\u pdo\u mysql.dll
连接到MSSQL数据库,先决条件
这是一种更先进的设置。您需要php_pdo_sqlsrv_35;#_ts.dll
或php_pdo_35;u sqlsrv_35;nts.dll驱动程序
。它们是特定于版本的,因此使用。
。在撰写本文之际,微软发布了
PHP5.5.x的官方驱动程序。5.6驱动程序尚未由微软正式发布,但可作为非官方版本提供
对于线程安全变量,模块是php_pdo_sqlsrv_35;##ts.dll
对于非线程安全变量,模块是php_pdo_sqlsrv_35;##nts.dll
使用PDO连接到数据库
要连接到数据库,需要从PDO构造创建一个新的PDO实例
PDO构造函数接受1个必需参数和3个可选参数
$dsn
:首先它定义了驱动程序(mysql
)。然后是数据库名,最后是主机名
连接到MSSQL
让我们看一下$dsn
:首先它定义了驱动程序(sqlsrv
)。然后是主机,最后是数据库名
创建实例时,会与数据库建立连接。在执行PHP脚本期间,只需执行一次
您需要将PDO实例创建包装在try-catch子句中。如果创建失败,将显示一个回溯跟踪,显示有关应用程序的关键信息,如用户名和密码。为了避免这种情况,请捕获错误
要抛出SQL server返回的错误,请使用setAttribute
:$connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)将此选项添加到PDO实例中代码>
执行查询
PDO使用准备好的语句。这是PDO方法和mysql函数之间的真正区别。后者非常容易受到SQL注入的影响。可以构建如下查询:
$SQL = 'SELECT ID FROM users WHERE user = '.$username ;
当恶意网站或个人发布用户名时;删除表格用户
。结果将是毁灭性的。您需要通过使用引号转义和封装字符串和变量来验证代码。必须这样做
对于每个查询。在较大的网站或维护较差的代码上,拥有允许SQL注入的表单的风险可能会非常高。预先准备好的语句消除了像上面示例那样的第一层SQL注入的机会
PDO驱动程序充当PHP服务器和数据库服务器之间的中间人,称为数据访问抽象层。它不会重写SQL查询,但提供了一种连接到多种数据库类型的通用方法
并为您处理向查询中插入变量的操作。Mysql函数在PHP代码执行时构造查询。使用PDO,查询实际上是在数据库服务器上生成的
准备好的SQL示例:
$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
注意区别;我们在字符串中引入了一个使用:
的变量,而不是在字符串外部使用$
的PHP变量
$dsn = 'sqlsrv:Server=127.0.0.1;Database=databasename';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
try
{
$connection = new PDO($dsn, $user, $password);
}
catch( PDOException $Exception )
{
echo "Unable to connect to database.";
exit;
}
$SQL = 'SELECT ID FROM users WHERE user = '.$username ;
$SQL = 'SELECT ID, EMAIL FROM users WHERE user = :username';
$SQL = 'SELECT ID, EMAIL FROM users WHERE user = ?';
$result = $connection->query($SQL);
$connection->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$queryArguments = array(':username' => $username);
$queryArguments = array($username);
$result = $connection->execute($queryArguments);
$connection->bindValue(':username', $username);
$connection->bindValue(1, $username);
$result = $connection->execute();
ID EMAIL
1 someone@example.com
Array
(
[ID] => 1
[0] => 1
[EMAIL] => someone@example.com
[1] => someone@example.com
)
while($row = $result->fetch())
{
echo $row['ID'];
echo $row['EMAIL'];
}
$rows = $result->fetchAll();
class pdoConnection {
public $isConnected;
protected $connection;
public function __construct($dsn, $username, $password, $options = array()) {
$this->isConnected = true;
try {
$this->connection = new PDO($dsn, $username, $password, $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 PDOException($e->getMessage());
}
}
public function prepare($SQL, $params = array()) {
try {
$result = $this->connection->prepare($SQL);
$result->execute($params);
return $result;
} catch (PDOException $e) {
throw new PDOException($e->getMessage());
}
}
}
$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$db = new pdoConnection($dsn, $user, $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'];
}