2011-09-29 74 views
1

所以,我有這樣的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要求每個字段都放在該語句中。

+1

你能告訴我們下面的代碼嗎?這是查詢的佔位符。 –

+0

你使用ORM的一些親戚?我們需要用於獲取結果的代碼..即command.RunQuery或其他代碼以及其前面的代碼。 – Baz1nga

+0

請參見[關於SQL注入的維基百科文章中的參數化語句段落](http:// en。 wikipedia.org/wiki/SQL_injection#Parameterized_statements)和[維基百科有關Prepared Statements的文章](http://en.wikipedia.org/wiki/Prepared_statement)。 –

回答

4

這是一份準備好的聲明

看到一個位置參數:http://php.net/manual/en/function.pg-prepare.php

其實你不「刪除」引號,你必須通過整數的SQL數組而不是一個字符串值進入

// Assume that $values[] is an array containing the values you are interested in. 
$values = array(1, 4, 5, 8); 

// To select a variable number of arguments using pg_query() you can use: 
$valuelist = implode(', ', $values); 

// You may therefore assume that the following will work. 
$query = 'SELECT * FROM table1 WHERE col1 IN ($1)'; 
$result = pg_query_params($query, array($valuelist)) 
    or die(pg_last_error()); 
// Produces error message: 'ERROR: invalid input syntax for integer' 
// It only works when a SINGLE value specified. 

相反,你必須使用以下approa:做pg_execute

一個例子,當參數ch:

$valuelist = '{' . implode(', ', $values . '}' 
$query = 'SELECT * FROM table1 WHERE col1 = ANY ($1)'; 
$result = pg_query_params($query, array($valuelist)); 
+0

剛剛添加的示例 – sehe

+0

感謝大家,你是對的,它是一個位置參數,我仍然試圖理解它的一切,處理替換的函數有點高於我的頭,但我會盡快回復! – zermy

+0

原諒我,我不太清楚你在暗示什麼,我有點試過你在暗示什麼,但我認爲代碼是用一種稍微不同的方式編寫的,即不使用pg_query_params,而是使用函數取而代之。我在上面寫了一個稍微羅嗦的編輯,如果你有時間,你能否快速瀏覽一下,非常感謝你的幫助。 – zermy