0

我有这样的情况:

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它自己吗?

4

2 回答 2

1

当您绑定参数时,以一种简化的方式告诉数据库“这不是语句的一部分,而是它的参数值”。您的数据库不会将其作为一条 SQL 处理,而是作为一个值处理,因此理论上您最终会得到如下结果:

select 
  count(id) as parent 
from 
  datable 
where 
  id = '123' 
  and uType = '(2 or type = 1)' 
  and countryCode = 'US'

注意'周围的值,它不会那样工作,解决方案确实是使用 IN 语句。

注意:实际上,在准备/执行执行流程中,当您绑定参数并执行语句时,数据库甚至没有使用 SQL 语句字符串,而是使用查询的内部表示。我编写示例只是为了让您更清楚为什么您的代码不起作用,但实际上并非如此。

于 2013-06-18T13:49:39.150 回答
0

它不起作用,因为 bindParam 作为方法名称建议绑定参数而不是语句。我想到的解决方案是始终绑定 2 个永远不存在的参数。

$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,因此当至少 1 个变量为真时,该语句将为真,type2 的默认值始终为假,因此当它的第一部分为真时,该语句将为真。所以脚本中什么都不会改变。

情况 3

声明部分之一必须是真的,所以当它找到 type 或 type2 时,它将返回 uest 的正确结果。

于 2013-06-18T13:52:40.627 回答