所以,我有這樣的PHP代碼:我不明白「?」這裏正在使用
$tabid = getTabid($module);
if($tabid==9)
$tabid="9,16";
$sql = "select * from field ";
$sql.= " where field.tabid in(?) and";
現在,這裏究竟怎樣的?
工作?我隱約明白,在PHP中,?:
是一個三元運算符,但冒號不在此處使用,?
也是Postgresql查詢的一部分。
最後的查詢看起來有點像這樣:
select * from field where field.tabid in('9,16')
因此,問號是由$ tabid內容所取代,那怎麼發生的呢?
問題是('9,16')
不被Postgres接受爲一個整數,它需要寫成像(9,16)
,所以我該怎麼做?我如何刪除撇號?
非常感謝您的幫助,有一個美好的一天!
編輯:請求更多代碼:
$sql.= " field.displaytype in (1,2,3) and field.presence in (0,2)";
其次,如果陳述,我認爲這是有關的一個:
if($tabid == 9 || $tabid==16)
{
$sql.= " and field.fieldname not in('notime','duration_minutes','duration_hours')";
}
$sql.= " group by field.fieldlabel order by block,sequence";
$params = array($tabid);
//Running the query.
$result = $adb->pquery($sql, $params);
哦,我想我現在明白了,我認爲這是一個佔位符,該pquery功能的一部分:這裏
function pquery($sql, $params, $dieOnError=false, $msg='') {
Stuff
$sql = $this->convert2Sql($sql, $params);
}
現在,這是它似乎變得有趣,是的C的一部分onvert2Sql功能:
function convert2Sql($ps, $vals) {
for($index = 0; $index < count($vals); $index++) {
if(is_string($vals[$index])) {
if($vals[$index] == '') {
$vals[$index] = "NULL";
}
else {
$vals[$index] = "'".$this->sql_escape_string($vals[$index]). "'";
}
}
}
$sql = preg_replace_callback("/('[^']*')|(\"[^\"]*\")|([?])/", array(new PreparedQMark2SqlValue($vals),"call"), $ps);
return $sql;
}
我認爲問題出在
$vals[$index] = "'".$this->sql_escape_string($vals[$index]). "'";
線。 sql_escape_string($str)
函數只是返回pg_escape_string($str)
。
對不起,超長的編輯,但我還是一直沒能得到過去我很害怕,感謝所有幫助!
編輯2:我解決了這一問題,時採取了鮑勃迪倫$tabid = "9,16"
至$tabid = array(9,16)
。我不知道爲什麼,哦,我也不得不刪除group by statement,因爲Postgresql要求每個字段都放在該語句中。
你能告訴我們下面的代碼嗎?這是查詢的佔位符。 –
你使用ORM的一些親戚?我們需要用於獲取結果的代碼..即command.RunQuery或其他代碼以及其前面的代碼。 – Baz1nga
請參見[關於SQL注入的維基百科文章中的參數化語句段落](http:// en。 wikipedia.org/wiki/SQL_injection#Parameterized_statements)和[維基百科有關Prepared Statements的文章](http://en.wikipedia.org/wiki/Prepared_statement)。 –