php – 如何用PDO替换MySQL函数?
在
php.net上阅读有关MySQL功能的内容.我遇到了这条消息
我读过关于PDO的文章.如何使用MySQL或MSSQL将代码更新为PDO?
我看到很多代码发布在SO上实现my_sql函数.其他人(包括我自己)的评论迫使提问者放弃MySQL功能并开始使用PDO或MySQLI.这篇文章是为了帮助.您可以参考它,因为它提供了对它们被弃用的原因和PDO的解释,以及实现PDO的最小代码示例.
首先: 从mysql函数到PDO的转换不是搜索和替换的简单情况. PDO是一种面向对象的编程,用于PHP语言. 为什么不推荐使用mysql函数? mysql扩展是古老的,自15年前发布的PHP 2.0以来一直存在(!!);这是一个与现代PHP完全不同的野兽,试图摆脱过去的不良做法. mysql扩展是一个非常原始的,低级别的MySQL连接器,缺少许多便利功能,因此很难以安全的方式正确应用;这对新手来说很糟糕.许多开发人员不理解SQL注入,并且mysql API非常脆弱,即使您已经意识到它也很难阻止它.它充满了全局状态(例如,隐式连接传递),这使得编写难以维护的代码变得容易.由于它已经陈旧,因此在PHP核心级别维护可能是不合理的. mysqli扩展更新,并修复了上述所有问题. PDO也很新,并且修复了所有这些问题,还有更多. 由于这些原因*将来某个时候将删除mysql扩展. 来源Deceze 如何实施PDO PDO提供了一种连接多个数据库的解决方案.这个答案仅涵盖MySQL和MSSQL服务器. 连接到MySQL数据库,先决条件 这非常简单,不需要任何预先设置的PHP.现代PHP安装是标准附带的模块,允许PDO连接到MySQL服务器.
连接到MSSQL数据库的先决条件 这是一个更高级的设置.你需要php_pdo_sqlsrv _ ## _ ts.dll或php_pdo_sqlsrv _ ## _ nts.dll驱动程序.它们是版本特定的##.在撰写本文时,微软已经发布了
使用PDO连接到数据库 $connection = new PDO(arguments); PDO构造函数需要3个必需参数和1个可选参数. > DSN或数据源名称,主要是包含有关驱动程序,主机和数据库名称的信息的字符串. 连接到MySQL $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脚本期间执行一次此操作.
try { $connection = new PDO($dsn,$password); } catch( PDOException $Exception ) { echo "Unable to connect to database."; exit; }
执行查询 PDO使用预准备语句.这是PDO方法和mysql函数之间的真正区别.后者非常容易受到SQL-INJECTION的影响.一个人会构建一个这样的查询: $SQL = 'SELECT ID FROM users WHERE user = '.$username ; 当恶意网站或个人发布用户名注入器时; DROP TABLE用户.结果将是毁灭性的.您需要通过使用引号转义和封装字符串和变量来证明您的代码.必须这样做 PDO驱动程序充当PHP服务器和数据库服务器之间的中间人,称为数据访问抽象层.它不会重写您的SQL查询,但确实提供了连接到多种数据库类型的通用方法 一个准备好的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. 排列 $queryArguments = Array(':username' => $username); 这对于索引变量(?): $queryArguments = Array($username); 添加完所需的所有变量后,可以调用execute()方法来执行查询.从而将数组作为参数传递给函数execute. $result = $connection->execute($queryArguments); bindValue 对于命名变量: $connection->bindValue(':username',$username); 对于索引变量: $connection->bindValue(1,$username); 将值绑定到实例后,可以在不传递任何参数的情况下调用execute. $result = $connection->execute();
获取结果 同样,我将仅介绍从返回的集合中获取结果的基础知识. PDO是一个相当先进的补充. 使用fetch和fetchAll 如果您执行了select查询或执行了返回结果集的存储过程: 取 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 $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']; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |