当前位置: 首页 > 知识库问答 >
问题:

如何用PDO替换MySQL函数?

叶光华
2023-03-14
    null

我读过PDO的书。如何使用MySQL或MSSQL将代码更新为PDO?

共有1个答案

燕雨石
2023-03-14

我看到了很多关于SO实现my_sql函数的代码。以及来自其他人(包括我自己)的评论,迫使提问者放弃MySQL函数,开始使用PDO或MySQLI。这个帖子是来帮忙的。您可以参考它,因为它提供了为什么不推荐它们和什么是PDO的解释,以及实现PDO的最小代码示例。

首先:

从mysql函数到PDO的转换不是简单的搜索和替换。PDO是PHP语言的面向对象编程。这意味着编写代码的另一种方法,就像使用mysql函数一样。首先,为什么要皈依?

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

这相当简单,不需要预先设置PHP。现代PHP安装是标准的,附带了一个允许PDO连接到MySQL服务器的模块。

该模块是php_pdo_mysql.dll

$connection = new PDO(arguments);

PDO构造函数接受1个必需参数和3个可选参数。

  1. DSN或数据源名称,这主要是一个字符串,包含有关驱动程序、主机和数据库名称的信息。从PHP 7.4开始,它还可以包括用户名和密码。
  2. 用户名
  3. 密码
  4. 选项

连接到MySQL

$dsn = 'mysql:dbname=databasename;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);
$dsn = 'sqlsrv:Server=127.0.0.1;Database=databasename';
$user = 'dbuser';
$password = 'dbpass';

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

您需要将PDO实例创建封装在try-catch子句中。如果创建失败,将显示一个返回跟踪,显示有关应用程序的关键信息,如用户名和密码。为了避免这种情况,请捕捉错误。

try 
{
    $connection = new PDO($dsn, $user, $password);
}
catch( PDOException $Exception ) 
{   
     echo "Unable to connect to database.";
     exit;
}

若要抛出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 = '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);
$connection->prepare($SQL, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$queryArguments = array(':username' => $username);

对于索引变量():

$queryArguments = array($username);

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

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

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

$connection->bindValue(':username', $username);
$connection->bindValue(1, $username);
$result = $connection->execute();

注意:您只能使用一个命名变量一次!两次使用它们将导致执行查询失败。根据您的设置,这将引发或不引发错误。

同样,我将只讨论从返回的集合中获取结果的基础知识。PDO是一个相当高级的附加组件。

使用fetchfetchall

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'];
}

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

FetchAll
获取单个数组中的所有行。使用与fetch相同的默认选项。

$rows = $result->fetchAll();

如果使用的查询不返回结果,如插入或更新查询,则可以使用rowcount方法检索受影响的行数。

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'];
}   
 类似资料:
  • 问题内容: 在php.net上阅读有关 MySQL函数的信息时 。我遇到了这个消息 警告此扩展自PHP5.5.0起不推荐使用,以后将被删除。相反,应使用MySQLi或PDO_MySQL扩展。另请参见MySQL:选择API指南和相关的FAQ,以获取更多信息。此功能的替代方法包括: mysqli_connect() PDO :: __ construct() 我已经了解了PDO。如何使用MySQL或M

  • 问题内容: 我一直在做的简单连接,: 虽然使用这个我一直使用的简单的方法,使查询之前逃脱的任何数据,不管是,,或者通过使用 现在我知道这在一定程度上是安全的! 它逃脱了危险人物;但是,它仍然容易受到其他攻击的攻击,这些攻击可能包含安全字符,但可能有害于显示数据或在某些情况下恶意修改或删除数据。 因此,我进行了一些搜索,以了解有关PDO,MySQLi和准备好的语句的信息。是的,我可能迟到了游戏,但是

  • 我用Mockito写UT,我想替换我的mock函数(哪个DB选择操作) 使用我在测试类中编写的新函数(使用map模拟数据库选择); 我想用正确的键输入返回正确的值 我试图这样做使用ArgumentCaptor如下,但它没有工作,因为我想 我想当调用dataBaseSelect.selectDataFromDB时,它将被模拟,然后从MapSelect.selectDataFromMap返回结果,参数

  • 本文向大家介绍如何在MySQL中用SPACE替换“ +”(加号)?,包括了如何在MySQL中用SPACE替换“ +”(加号)?的使用技巧和注意事项,需要的朋友参考一下 要替换,请使用MySQL中的函数。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是用空格替换“ +”(加号)的查询- 让我们再次检查表记录- 这将产生以下

  • 问题内容: 在这个查询中 我正在尝试将变量与PDO 绑定。不确定最后如何处理。 可不可能是 绑定到哪里 还是会 绑定到哪里 还是会完全不同? 问题答案: 您还可以说: 在MySQL末尾进行字符串连接,并不是在这种情况下有任何特殊原因。 如果要查找的部分本身可以包含百分比或下划线字符(因为这些字符对LIKE运算符具有特殊含义)或反斜杠(MySQL用作LIKE运算符的另一种转义层),则事情会变得更加棘

  • 本文向大家介绍MySQL REPLACE()函数如何替换多个记录中的字符串?,包括了MySQL REPLACE()函数如何替换多个记录中的字符串?的使用技巧和注意事项,需要的朋友参考一下 如果要替换多个记录中的字符串,则函数必须将列名称作为第一个参数,即在字符串的位置。这意味着它将用该特定列中的另一个子字符串替换所有子字符串。我们还可以将WHERE子句与UPDATE语句一起使用,以应用条件。通过以