PDO模拟关闭,多次绑定相同的值

时间:2016-07-23 00:14:14

标签: php mysql pdo

我在PHP7中有以下代码。我使用PDO连接到MySQL。

使用PDO准备语句仿真,此代码可以成功运行:

$query = $db_con->prepare('SELECT * FROM matches WHERE matches.home_team_id=:team_id OR matches.away_team_id=:team_id');
$query->bindValue(':team_id', $team_id, PDO::PARAM_STR);
$query->execute();
return $query->fetchAll();

但是对于真正的PDO预处理语句(仿真关闭),前面的代码给出了一个错误,即没有足够的值绑定。我被迫做以下事情:

$query = $db_con->prepare('SELECT * FROM matches WHERE matches.home_team_id=:team_id OR matches.away_team_id=:team_id2');
$query->bindValue(':team_id', $team_id, PDO::PARAM_STR);
$query->bindValue(':team_id2', $team_id, PDO::PARAM_STR);
$query->execute();
return $query->fetchAll();

这有效,但有什么方法我不必用真实的预处理语句两次声明相同的变量?我有很多这些查询,并希望将它们全部替换为使用真实的预处理语句。

正如有人在评论中提到的那样:为什么我要关闭模拟?我没有真正的偏好,但现在似乎真正准备好的陈述比模拟陈述更严格。我的理解是否正确,最好用真实的预备陈述进行开发,以保证它能适用于这两种设置?

2 个答案:

答案 0 :(得分:1)

通过更改查询

有一种方法
$query=$db_con->prepare('SELECT*FROM matches WHERE :team_id in(home_team_id,away_team_id)');
$query->bindValue(':team_id', $team_id, PDO::PARAM_STR);
$query->execute();

这可能不太理想,但它会立即为变量声明变量。

希望这有用。

答案 1 :(得分:1)

一个简单的解决方案是使用计数器。通过这种方式,您可以保留emulation off并仍然多次绑定相同的值,而无需计算您使用它的次数,或在更改查询时重新编号。

$count=0;
$query = $db_con->prepare(
    'SELECT * FROM matches WHERE 
    matches.home_team_id=:team_id'.(++$count).' OR 
    matches.away_team_id=:team_id'.(++$count)
    );
for($i=1; $i<($count+1) ;++$i){
    $query->bindValue(':team_id'.$i, $team_id, PDO::PARAM_STR);
    }
$query->execute();
return $query->fetchAll();