我在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();
这有效,但有什么方法我不必用真实的预处理语句两次声明相同的变量?我有很多这些查询,并希望将它们全部替换为使用真实的预处理语句。
正如有人在评论中提到的那样:为什么我要关闭模拟?我没有真正的偏好,但现在似乎真正准备好的陈述比模拟陈述更严格。我的理解是否正确,最好用真实的预备陈述进行开发,以保证它能适用于这两种设置?
答案 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();