【问题标题】:submitting arrays of values to queries using PDO使用 PDO 向查询提交值数组
【发布时间】:2013-01-05 22:40:06
【问题描述】:

我注意到这两种使用 PHP PDO 构建查询的方式都返回相同的数据。

//prepare with $dbh->prepare
$w_ft = "36"; 
$sth = $dbh->prepare("SELECT * FROM main_products_common_dimensions WHERE w_ft = :w_ft");
$sth->bindParam(':w_ft', $theId, PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetchAll(); //PHP array of data


//prepare with pg_prepare()
$result = pg_prepare($con, "my_query", 'SELECT * FROM main_products_common_dimensions WHERE w_ft = $1');
$result = pg_execute($con, "my_query", array("48")); //A query result resource on success or FALSE on failure.
while ($row = pg_fetch_assoc($result)){
    echo $row['w_ft'] . "<BR>"; 
}

我在http://php.net/manual/en/function.pg-execute.php 读到,第二种方式返回“成功时的查询结果资源或失败时的 FALSE”。所以我尝试用 pg_fetch_assoc() 遍历它。它可以工作,但是它没有与pg_sql 的其余函数一起被弃用吗?我应该在 PDO 中使用某些东西来查看查询结果吗?

出于这个原因,我倾向于在使用 PDO 时使用第一种方法。这是常态吗?

我的问题是如何向任一方法提交多个值。当我尝试将数组提交到准备好的语句时,这两种方法都不起作用

$w_ft = array("48", "36"); 


$result = pg_execute($con, "my_query", array("48", "36"));

我认为我可以通过这种方式向查询提交多个值。我该怎么做?

谢谢

【问题讨论】:

  • 通过在查询中添加两个占位符,而不是一个?
  • @YourCommonSense 您能否更具体地说明这些应该如何绑定?在执行查询之前,我是否需要知道要在查询中使用多少个值?例如,如果我想返回$w_ft = array("48", "36", "12") 的结果怎么办?谢谢

标签: php sql postgresql pdo


【解决方案1】:

看起来你正在执行数组错误。 它不为随后的执行取值,而只为一次执行取值。
因此,值的数量应该等于占位符的数量。
就这样

$sql = 'SELECT * FROM table WHERE w_ft = $1 OR w_ft = $2 OR w_ft = $3'

为您的array("48", "36", "12")

虽然我不是 PG 用户,所以我可能会混淆一些语法。

【讨论】:

  • 好的,谢谢。我是否以现代方式从第二个示例中的结果集中提取值?还是 PDO 中内置了一些东西来做到这一点?再次感谢!
  • 我相信没有“现代”的方式,它们或多或少都是平等的。但是看看fetchall 方法。
【解决方案2】:

PDO 是一个用于 PHP 的不可知数据库访问 API。这意味着,无论您的数据库是什么,您都可以使用相同的对象和方法来查询它并获取结果。 PDO 是 PHP 向数据库抽象层迈出的第一步。

pg_* API,afaik,不会被弃用,专用于 Postgres。它还包含未在 PDO 中实现的功能(例如二进制转义或事件通知功能等)。

PDO 和专用库之间的选择通常被您在控制器代码中使用的模型管理器的选择所隐藏。它可以是像 ORM(Doctrine、Propel 和许多其他)这样的抽象层上的对象关系映射器,也可以是像 Pomm 这样专用于 Postgresql 的对象模型管理器(OMM)。

在这两种方式中,您都不需要准备语句、管理列类型或结果游标(顺便说一句,使用PDO::fetch_all() 会将所有结果转储到内存中),数据库层会为您处理这些。你上面的查询会写成这样:

// Using Pomm
// SELECT * FROM main_products_common_dimensions WHERE w_ft = ?
// Returns a MainProductsCommonDimensions instance

$object = $connection
    ->getMapFor('\Database\Schema\MainProductsCommonDimensions')
    ->findWhere('w_ft = ?', array(48))
    ->current(); // fetch only the first result.

请注意,ORM 和 OMM 都提出了方便的查询构建器:

$where = \Pomm\Query\Where::createWhere('w_ft = ?', array(48))
    ->orWhere('w_ft = ?', array(12))
    ->orWhere('w_ft = ?', array(66));

// which is pretty much the same as
$where = \Pomm\Query\Where::createIn('w_ft', array(48, 12, 66));

// SELECT * FROM main_products_common_dimensions WHERE w_ft IN (?, ?, ?);
$collection = $connection
    ->getMapFor('\Database\Schema\MainProductsCommonDimensions')
    ->findWhere($where); // Return an Iterable cursor over results

// display 48, 12 and 66 fetching one result at the time in memory:
foreach($collection as $object)
{
    printf("W_FT = '%d'.\n", $object['w_ft']);
}

使用 PDO 之上的这些层提供了许多优点,主要是更多地关注您想要的而不是处理奇怪的 API(是的,PDO 与 PHP 中的几乎所有库一样奇怪)。此外,由于 PDO 只是一个访问层,它会将结果作为字符串数组(二进制或非二进制)返回。 Postgres 中的布尔值是“t”和“f”,因此需要转换为 PHP 正确的布尔(原文如此)类型才能使用。 ORMs 和 OMMs 确实提出了这样的转换机制,而且 Pomm 作为 Postgres 专用也支持 Arrays、HStore、LTree、几何和复合类型转换等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2013-10-20
    • 2013-06-03
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多