2013-01-22 30 views
2

在向pgSQL準備語句進行自我介紹時,我已成功返回了一些查詢的結果。但是,我有幾個問題。無論指定或指定什麼數據類型,bindParam都能正常工作

考慮以下查詢:

$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(); 

我注意到,即使在main_products_common_dimensions表中的列是character_varying,我得到相同/正確的結果集返回,如果我使用

$w_ft = 36; 
... 
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_INT); 

$w_ft = "36"; 
... 
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_STR); 

$w_ft = "36"; 
... 
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_INT); 

$w_ft = 36; 
... 
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_STR); 

也就是說,不管怎麼綁定參數_INT_STR或設置變量(整數或字符串),數據被正確地返回。這是正常的行爲嗎?

http://php.net/manual/en/pdostatement.bindparam.php,我看到參數的數據類型是使用PDO :: PARAM_ *常量參數解釋

明確的數據類型。 要從存儲過程返回INOUT參數,請使用按位 OR運算符爲data_type 參數設置PDO :: PARAM_INPUT_OUTPUT位。

「從存儲過程返回INOUT參數」是什麼意思?這是相關的嗎?這是否意味着我沒有使用存儲過程?長度似乎是可選的,儘管這在解釋中沒有說明。提供它有好處嗎?你可以看到,我對此很陌生,只是試圖讓我的頭腦發現它。非常感謝您

+0

'$ theId'在'$ sth-> bindParam ....'中不應該是'$ w_ft'? – Tikkes

+0

@Tikkes aha,是的,我在最後一分鐘改變了這一點,但錯過了bindparam。修復...謝謝! – 1252748

+0

@Tikkes啊,不,我很抱歉。我沒有說清楚。我在我使用的實際代碼中有這個正確的。問題不在於它沒有工作,而在於(現在已更正且準確的)代碼工作。同樣感謝 – 1252748

回答

3

PDO::PARAM_INTPDO::PARAM_STR傳遞給bindParam()時,跡象表明,駕駛員可以自由地忽略。

看着PDO PG駕駛source code,看來,除了PDO_PARAM_LOB這是經過特殊處理的,所有類型的引用爲字符串(即引號之間並傳遞給LIBPQ的PQescapeStringConn功能)

你也應該瞭解PDO::ATTR_EMULATE_PREPARES屬性,該屬性控制引擎蓋下使用的方法。當false,PQprepare()與真正的查詢外參數一起使用時。如果true,參數值被注入到傳遞給非參數化PQexec()的SQL中。 從技術上講,這是完全不同的,因此您可能會在角落案例或錯誤案例中看到不同的行爲,具體取決於此屬性。

2
$w_ft = 36; 
... 
$sth->bindParam(':w_ft', $theId, PDO::PARAM_INT); 

應該

$w_ft = 36; 
... 
$sth->bindParam(':w_ft', $w_ft, PDO::PARAM_INT); 
1

這是因爲postgres接受一個整數列進行比較時的整數引用。

所以,如果你的id列是一個int,這些查詢兩種工作方式相同:

SELECT * FROM mytable WHERE id = 1; 
SELECT * FROM mytable WHERE id = '1'; 

什麼PDO::PARAM_*常數要做的就是修改報價的方式/逃逸完成的價值觀,並且是獨立的值數據類型。如果需要,Php也會進行類型轉換。如果你選擇PDO::PARAM_INT,你告訴DBMS驅動程序$ id的值是一個整數,並且應該將其作爲整數轉義,所以當它將值放入查詢時,它不會在其周圍添加引號。

$id = 1; 
$sth = $db->prepare("SELECT * FROM mytable WHERE id = :id"); 
$sth->bindParam(':id', $id, PDO::PARAM_INT); 
// resulting query would be SELECT * FROM mytable WHERE id = 1; 

$sometext = "hello"; 
$sth = $db->prepare("SELECT * FROM mytable WHERE id = :id"); 
$sth->bindParam(':id', $sometext, PDO::PARAM_INT); 
// in this case, $sometext will be casted to an integer, that will result in (int)0 
// resulting query would be SELECT * FROM mytable WHERE id = 0; 

$sometext = "hello"; 
$sth = $db->prepare("SELECT * FROM mytable WHERE id = :id"); 
$sth->bindParam(':id', $sometext, PDO::PARAM_STR); 
// in this case, $sometext is already a string, and strings should be quoted 
// resulting query would be SELECT * FROM mytable WHERE id = 'hello'; 

此外,有關的bindParam的INOUT PARAM,如果你不打算使用存儲過程的INOUT或OUT參數(比如說,比在函數內部設置好的傳遞一個引用的函數調用),你可能更好使用bindValue。使用bindValue您可以將函數的結果或任何常數值作爲要綁定的值,您不需要放置變量。

$sth->bindValue(':something', 5); 
$sth->bindValue(':something_else', $foo->bar()); 
相關問題