PDO中的动态SQL和bindParam

时间:2013-06-18 13:41:50

标签: php pdo

我有这样的情况:

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本身吗?

2 个答案:

答案 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的正确结果。