使用PDO向查询提交值数组

时间:2013-01-22 16:12:09

标签: php sql postgresql pdo

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

看起来你的执行数组错了。 它不是为后续执行而是为了一次执行而使用的值 因此,值的数量应该等于占位符的数量 所以它就是

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

代表array("48", "36", "12")

我不是PG用户,因此,我可能会混淆一些语法。

答案 1 :(得分:0)

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

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

选择您在控制器代码中使用的Model Manager时,通常会隐藏PDO和专用库之间的选择。它可以是像ORMs(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中的任何lib一样奇怪)。此外,由于PDO只是一个访问层,它将结果作为字符串数组(二进制或非二进制)返回。 Postgres中的布尔值为't'和'f',因此需要转换为PHP正确的布尔(sic)类型才能使用。 ORM和OMM确实提出了这样的翻译机制,Pomm专门用于Postgres也支持Arrays,HStore,LTree,几何和复合类型转换等。