我注意到这两种使用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"));
我认为我能够以这种方式向查询提交多个值。我怎么能这样做?
谢谢
答案 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,几何和复合类型转换等。