2013-01-22 17 views
0

我注意到,這兩種方法構造使用PHP PDO的查詢,兩者都返回相同的數據。將值數組提交給使用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")); 

我認爲我能夠多值提交查詢這樣的方法都沒有工作。我怎樣才能做到這一點?

謝謝

+1

通過向查詢添加兩個佔位符,而不是一個? –

+0

@YourCommonSense你能更具體地說明這些應該如何綁定?在執行之前,我是否需要知道查詢中要使用多少個值?例如,如果我想返回'$ w_ft = array(「48」,「36」,「12」)'的結果呢?謝謝 – 1252748

回答

1

看起來像你正在執行數組錯誤。 它取值不是隨後的執行,而只是一次執行。
所以,值的數量應該等於佔位符的數量。
如此這般

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

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

我不是PG用戶的,所以,我可以迷惑一些語法。

+0

好的,謝謝。我是否以現代的方式從第二個示例中的結果集中提取值?或者是否有內置於PDO的內容來做到這一點?再次感謝! – 1252748

+1

我相信沒有「現代」的方式,它們或多或少都是平等的。但看看[fetchall](http://php.net/manual/ru/pdostatement.fetchall.php)方法。 –

0

PDO是PHP的一個不可知的數據庫訪問API。這意味着,無論您的數據庫是什麼,您都可以使用相同的對象和方法來查詢並獲取結果。 PDO是PHP中數據庫抽象層的第一步。

pg_ * API是afaik,不會被棄用,專用於Postgres。它還包含未在PDO中實現的功能(如二進制轉義或事件通知程序功能等)。

PDO和專用庫之間的選擇往往隱藏在您在控制器代碼中使用的模型管理器中。它可以是像ORM(Doctrine,Propel和其他許多)這樣的抽象層上的Object Relational Mapper,也可以是Pomm專用於Postgresql的Object Model Manager(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. 

注意兩個奧姆斯和的OMMs做提議方便查詢生成器:

$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(是的,幾乎PHP中的任何lib都是怪異的)。此外,因爲PDO只是一個訪問層,它將返回結果作爲字符串數組(二進制或不)。Postgres中的布爾值是't'和'f',因此需要將其轉換爲PHP使用的布爾(sic)類型。 ORM和OMM確實提出這樣的翻譯機制,Pomm專門爲Postgres提供支持Arrays,HStore,LTree,幾何和複合類型轉換等等。