0

我注意到这两种使用 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"));

我认为我能够以这种方式向查询提交多个值。我怎样才能做到这一点?

谢谢

4

2 回答 2

1

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

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

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

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

于 2013-01-22T16:24:50.653 回答
0

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、几何和复合类型转换等等。

于 2013-01-24T09:55:30.620 回答