我认为很容易解决一个奇怪的问题。
我正在简化上下文的内容,但是假设我有以下代码:
$schval = "Val";
$schbind = "%".$schval."%";
$sql = "SELECT Col1, Col2, Col3 FROM MyTable WHERE Col1 LIKE :schbind";
$stmt = $conn->prepare($sql);
$stmt->bindparam(':schbind',$schbind);
$stmt->execute();
$rows = $stmt->fetchAll();
这有效。
但是,如果我想通过更改$ sql变量在查询中多次使用:schbind,则:
$sql = "SELECT Col1, Col2, Col3 FROM MyTable WHERE (Col1 LIKE :schbind OR Col2 LIKE :schbind)";
查询失败,因为它不返回任何行。
正常的SQL逻辑告诉我这应该可行,即,如果发现搜索值与Col1或Col2匹配,则返回该行。
为什么这不起作用?
答案 0 :(得分:2)
您不能使用一个占位符两次。您需要这样做:
$stmt->bindparam(':schbind1',$schbind);
$stmt->bindparam(':schbind2',$schbind);
$sql = "SELECT Col1, Col2, Col3 FROM MyTable WHERE (Col1 LIKE :schbind1 OR Col2 LIKE :schbind2)";
您可以阅读这篇文章以获得替代解决方案和进一步的解释: Use bound parameter multiple times