Php 如何用PDO替换MySQL函数?

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。这篇文章是来帮助你的

当阅读关于MySQL函数的文章时。我遇到了这个消息

警告 从PHP5.5.0开始,此扩展已被弃用,将来将被删除。相反,应该使用MySQLi或PDO_MySQL扩展。有关更多信息,请参见MySQL:选择API指南和相关常见问题解答。此功能的替代方案包括:



我读过关于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或数据源名称,主要是包含驱动程序、主机和数据库名称信息的字符串。由于PHP7.4,它还可以包括用户名和密码
  • 用户名
  • 密码
  • 选择权
  • 连接到MySQL

    让我们看看
    $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'];
    }