2012-10-23 220 views
1

我想破譯一個PHP程序中正在做Mysql查詢的特定語句。查詢有?:和?在裏面。有什麼功能?帶問號和冒號的Mysql聲明

$data = db_get_field("SELECT data FROM ?:order_data WHERE order_id = ?i AND type = 'A'", $order_id); 

感謝您的幫助。

Chris

+0

'db_get_field'不是內置函數。找到定義。 –

+0

他正在使用pdo –

+0

許可證已付費。只是好奇什麼?:是。 –

回答

1

它們看起來就像預先準備好的語句的佔位符。您提供?,您稍後將提供實際值。從PHP文件看看這個例子:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); 
$stmt->bindParam(1, $name); 
$stmt->bindParam(2, $value); 

來源:http://php.net/manual/en/pdo.prepared-statements.php

你具體的例子似乎是從CS-Cart。例如,根據他們的文檔?i強制傳遞到該佔位符的值被轉換爲整數(這與sprintf的工作方式類似)。

$number = 9; 
echo sprintf("I have %d tasks.", $number); 
// Outputs "I have 9 tasks." 

在上述情況下,$number被視爲整數。如果我試圖將字符串傳遞到該插槽中,我會得到截然不同的結果:

$number = "completed"; 
echo sprintf("I have %d tasks.", $number); 
// Outputs "I have 0 tasks." 

注意這裏怎麼我的類型不匹配,因此0輸出代替completed

底線,這些是佔位符。

+1

這很奇怪,儘管'?'是一個匿名佔位符,':order_data'可以是一個名字。我從來沒有在查詢中看到過這兩種混合。 –

+0

@MarcB根據[此評論](http://www.php.net/manual/en/pdostatement.bindparam.php#98715),不支持混合兩者。我認爲OPs代碼在幕後還有其他事情要做。 – Sampson

0

字符?:標識符以形成參數化查詢。稍後將值綁定到變量,引擎將執行多個值的查詢。這個工作更快,因爲查詢是由服務器編譯一次,而不是編譯每個變量=值集。