2017-09-04 25 views
2

我有一個變量$query1在此,我有一個查詢字符串,並在此查詢字符串中,我使用了另一個變量$sORp。主要的問題是我想在運行時爲這個$sORp變量賦一個值,而不改變我的字符串變量持有查詢。這可能嗎?如何給字符串中存在的變量賦值,當這個字符串也是一個字符串變量?

代碼片段如下(虛擬爲例):

$query1="SELECT $sORP,name from table1 
    where $sORp=:SRC_NAME 
    group by $sORp,name 
    order by $sORp"; 

我想在運行時指定這個變量$sORp「SRC」和「池」,因爲我不想寫兩次查詢具有不同的值。

使用代碼:

$sORp='SRC'; 
$sql=$query1; 
$sth = oci_parse($con,$sql); 

,這是不工作,有沒有這方面的任何解決方案。

以及運行該PHP文件中的錯誤是:ORA-00936:缺少表達

+0

定義$ sORp _before_您定義$ query1並且PHP應該完成其餘部分。或者使用sprintf或其他東西。 – ADyson

+0

但我想在運行時分配'$ sORp'的值。我試圖在'$ query1'之前全局聲明'$ sORp',但問題是一樣的。 –

回答

1

你不能在這種腳本語言中做到這一點。 $sql必須在$sORp之後定義。

$sORp='SRC'; 
$sth = oci_parse($con,"SELECT $sORP,name from table1 
         where $sORp=:SRC_NAME 
        group by $sORp,name 
        order by $sORp"); 

如果你希望你可以創建一個function這將產生對意志的權利查詢:;

function foo($sORp) { 
    $retVal="SELECT $sORP,name from table1 
      where $sORp=:SRC_NAME 
      group by $sORp,name 
      order by $sORp"; 
    return $retVal; 
} 

$sth = oci_parse($con,foo($sORp)); 
+0

它的工作很好,並清除了我未來的概念,在這個程序中使用。謝謝。 :) –

+1

請注意避免SQL注入安全攻擊。確保變量值不從用戶輸入中獲取。 –

1

在字符串字面量使用它之前賦值給變量。雙引號字符串文字會自動擴展雙引號字符串文字中使用的變量。

$sORp='SRC'; 

$query1="SELECT $sORP,name from table1 
where $sORp=:SRC_NAME 
group by $sORp,name 
order by $sORp"; 

echo $query1; 

// run query 

$sORp='POOL'; 

$query1="SELECT $sORP,name from table1 
where $sORp=:SRC_NAME 
group by $sORp,name 
order by $sORp"; 

echo $query1; 
+0

是否也會動態更改,我是否可以在執行此查詢後執行'$ sORp'值'「POOL」'來執行具有POOL而不是SRC的新查詢? –

+0

不,你必須爲'$ sORp'指定一個新的值,然後重新進行查詢 – RiggsFolly

+0

然後它不是有用的bcz我必須寫兩遍。我可以在沒有變量的情況下編寫查詢,然後用'POOL'和'SRC'替換'$ sORp' –

1

不,這是不可能的。當一個字符串被評估時,即使你使用了一個變量來完成這個變量並且這個變量稍後會改變,它的值也會被確定。您嘗試優化生成字符串的方式,但過早地進行優化。至少與您的查詢相比,字符串生成在您的情況下會很快。您可以最小化以這種方式生成的查詢的數量:

$cachedQueryTexts = array(); 
function generateQueryText($key) { 
    return (isset($cachedQueryTexts[$key])) ? $cachedQueryTexts[$key] : ($cachedQueryTexts[$key] = "your query using the $key variable"); 
} 
+0

謝謝,哥們,但對不起,因爲我只是一個初學者,我完全無法理解你的答案。它必須是更高的水平。謝謝回答。可能將來我可以從中得到一個參考。 –

+0

@ShivamSharma沒有問題,基本思想是在評估之後字符串不會被更改,即使用作其依賴項的變量也會更改,但是,可以緩存值以確保您不會評估已經評估過的字符串。 –

相關問題