我有这样的情况:
if ( $level == 1 ) {
$type = '0';
} elseif ( $level == 2 ) {
$type = '1';
} elseif ( $level == 3 ) {
$type = '(2 or type = 1)'; // This part does not work.
} elseif ( $level == 10 ){
$type = '3';
} else {
return false;
}
$sqlFindParent = 'select count(id) as parent from datable where id = :parent and uType = :type and countryCode = :countryCode';
$findParent = $conn->prepare($sqlFindParent);
$findParent->bindParam(':type',$type);
$ type是动态的。当我绑定它时,由于那里elseif ( $level ==3 )
,它在or
时不起作用。当然,我可以使用in
,但你有更好的方法使用or
本身吗?
答案 0 :(得分:1)
绑定param时,以简化的方式告诉数据库“这不是语句的一部分,而是它的参数值”。您的数据库不会将其作为一个SQL处理,而是作为一个值处理,因此您理论上可以使用以下内容进行处理:
select
count(id) as parent
from
datable
where
id = '123'
and uType = '(2 or type = 1)'
and countryCode = 'US'
注意值周围的'
,它不会像那样工作,解决方案确实是使用IN语句。
注意:实际上,在准备/执行执行流程中,当您绑定params并执行语句时,数据库甚至不使用SQL语句字符串,而是使用其查询的内部表示。我写这个例子只是为了让你更清楚为什么你的代码不起作用,但事实并非如此。
答案 1 :(得分:0)
它不起作用,因为bindParam作为方法名称建议绑定params而不是语句。 我想到的解决方案是始终绑定一个永远不会存在的parms。
$sqlFindParent = 'select count(id) as parent from datable where id = :parent and (uType = :type or uType = :type2) and countryCode = :countryCode';
然后更改你的ifs切换
$type = 0; $type2=-1;
switch($level)
{
case 1:
$type = 0;
break;
case 2:
$type = 1;
break;
case 3:
$type = 2;
$type2 = 3;
break;
}
和绑定
$findParent->bindParam(':type',$type, PDO::PARAM_INT);
$findParent->bindParam(':type2',$type2, PDO::PARAM_INT);
从逻辑的角度来看它。你有2个变量。
案例1,2
你有OR所以当至少有一个变量为真时,语句将为真,type2的默认值总是为false,所以当第一部分为真时,语句为真。所以脚本中没有任何改变。
案例3
其中一个语句部分必须是真的,所以当它找到type或type2时,它将返回uest的正确结果。