【问题标题】:Understanding how PDO / Prepared Statements work with multiple databases types了解 PDO / Prepared Statements 如何与多种数据库类型一起使用
【发布时间】:2015-03-02 17:58:41
【问题描述】:

我最近才开始使用 PDOPrepared Statements 并了解它们如何正常工作,但是我现在想要支持多个数据库并且对它们的工作方式有一些疑问。

据我了解,如果您在 PHP 中使用 PDO,那么它将支持许多不同的数据库类型。但是我想了解它是如何工作的。

例如,如果我这样做:

$data = array( 'name' => 'Cathy', 'addr' => '123 fake st', 'city' => 'fakesville' );

$sql = $db->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");
$sql->execute($data);

我知道只要它受支持,它就可以在您想要的任何数据库上运行?

如果是这样,它是如何工作的?是不是把 SQL 语句变成了每个数据库引擎本身对应的语法?

如果上述情况属实,有什么我应该注意的不受支持的吗?我想我读到你不应该使用特定于数据库的函数?

如果这是真的,如果需要,你会怎么做?您是否需要为要支持的每个数据库编写 SQL 并使用它们各自的功能?

MySQL 中常用的显然是COUNTSUM;这将是我主要编写的数据库语言。

【问题讨论】:

    标签: php mysql database pdo prepared-statement


    【解决方案1】:

    PDO 实际上只是到数据库的连接驱动程序 - 这意味着它是一个支持传递 SQL 语句、准备语句、绑定参数、返回记录集等到许多不同数据库类型的函数 - 而不是只有一个每个数据库供应商的驱动程序。

    它不会以任何方式更改您的 SQL,如果您的语句仅受单一数据库类型支持,或者您的查询中的函数受一个数据库引擎支持而不是另一个 - 查询将如果传递给错误的数据库,则会失败。

    绝大多数查询几乎适用于任何 SQL 数据库,因为该语言具有为其编写的标准,并且大多数数据库都遵循该标准 - 但是,随着您的 SQL 越来越熟悉特定的数据库引擎,您可能会发现它变得难以转移到其他引擎。

    如果您正在为特定数据库编写查询,您可以使用 db 引擎必须提供的所有技巧,但如果您希望您的代码在任何 PDO 支持的数据库上运行,您可能需要编写更多内容“普通”查询 - 即使它们稍长一些。

    编辑:确保您的代码在多个数据库上受支持的最佳方法是简单地编写“简单”或“普通”查询。当您熟悉特定数据库时,您通常会知道每个人都有哪些技巧 - 而且您知道,该特定技巧仅在该数据库中。例如,mySQL 有一个 group_concat() 函数在任何其他数据库中都不起作用,oracle 有许多函数只能在 Oracle 数据库中使用。

    但是,在大多数情况下,使用普通选择编写的查询、几乎所有聚合函数、普通(左、右、内)连接都可以在每个引擎上完美运行。您还可以使用众多网站之一(例如http://sqlfiddle.com/)来检查查询将在哪些引擎中工作或检查http://php.net/manual/en/book.pdo.php

    【讨论】:

    • 那么确保您的代码支持其他数据库而不是“希望”支持其他数据库的最佳方法是什么?你需要使用Doctrine之类的东西吗? ...真的不能只用上述方法完成吗?
    • 太棒了。感谢您的提示。我主要担心JOINSSub-SelectsGROUP BYHAVING和db函数的使用。也感谢有关 sqlfiddle 的提示。
    • 如果您担心某个特定功能 - 最简单的方法是将您要与数据库引擎一起使用的功能的名称(例如“oracle group_concat”)输入谷歌并查看什么回来了。这通常是花哨的东西不起作用 - 而所有正常运行的磨坊查询都将 100% 起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2010-11-25
    • 2013-05-05
    • 2015-09-03
    • 1970-01-01
    • 2016-09-11
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多