我有一个奇怪的问题,我假设很容易修复。
我正在简化上下文的事情,但是假设我有以下代码:
$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();
这有效。
但是,如果我想在查询中多次使用:schbind,通过更改$ sql变量,如下所示:
$sql = "SELECT Col1, Col2, Col3 FROM MyTable WHERE (Col1 LIKE :schbind OR Col2 LIKE :schbind)";
查询失败的意思是它不返回任何行。
正常的SQL逻辑告诉我这应该工作,即如果发现搜索值与Col1或Col2匹配,则返回该行。
为什么这不起作用?
您不能两次使用一个占位符。你需要这样做:
$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