2017-09-04 120 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没有问题,基本思想是在评估之后字符串不会被更改,即使用作其依赖项的变量也会更改,但是,可以缓存值以确保您不会评估已经评估过的字符串。 –

相关问题