【问题标题】:DBO Select where equals and likeDBO 选择等于和喜欢的地方
【发布时间】:2016-11-04 08:38:36
【问题描述】:

我尝试过用 100 种不同的方式编写代码,但无法找出正确的语法。似乎无论我怎么写, $loggeduser 都不会传递给 WHERE 用户名。我究竟做错了什么?什么是正确的语法?

$query = $db->prepare('SELECT * FROM sites WHERE username = ? AND name LIKE ? OR login LIKE ? AND category="te"');
$query->bindValue(1, $loggeduser);
$query->bindValue(2, '%'.$_POST[search].'%');
$query->bindValue(3, '%'.$_POST[search].'%');
$query->execute();}

【问题讨论】:

  • 试试bindParam而不是bindValue
  • 返回“致命错误:无法通过引用传递参数 2”
  • 该错误意味着第二个参数应该是对变量的引用。$_POST['search'] 是一个变量,但您的代码希望 PHP 解释常量“搜索”。您缺少标识符周围的引号。
  • 带或不带引号都存在错误。如果我将它们切换到 bindValue 而不是 bindParam 它们可以工作,但 $loggeduser 不会绑定。我已经在 $loggeduser 上尝试了 bindValue 和 bindParam ,但都没有任何效果。我还回显了传递变量的 $_POST['search'](和 $_POST[search])。
  • 我完全傻眼了。我已经尝试过 bindParam (我认为它不应该工作,因为 '%' 实际上不是对变量的引用。我尝试过 bindValue。我尝试在第一次绑定时只使用 bindParam,不管我怎么做这个,第二个和第三个绑定值工作完美,但不是第一个。我还回显了所有变量以确保返回值。我不知所措。

标签: php mysql dbo


【解决方案1】:

根据this comment

当绑定参数时,显然你不能使用占位符两次(例如“select * from mails where sender=:me or recipient=:me”),你必须给他们不同的名字,否则你的查询将返回两手空空(但不幸的是没有失败)。

这可能是您的问题,因为您尝试将相同的值绑定到两个单独的占位符。试试以下方法:

$query = $db->prepare('SELECT * FROM sites WHERE username = :username AND name LIKE :name OR login LIKE :login AND category="te"');
$query->bindValue(:username, $loggeduser);
$query->bindValue(:name, '%'.$_POST['search'].'%');
$query->bindValue(:login, '%'.$_POST['search'].'%');
$query->execute();

【讨论】:

  • 其实错误在于我没有理解 SQL。我的原始代码没有给出错误,因为它运行完美——我只是没想到它给出的结果。请注意,我说似乎 $loggeduser 变量没有被传递.. 事实证明,变量正在被传递,只是不是在 OR 之后,我没有意识到我必须写 WHERE .. .. AND .... OR .... AND ... 在 OR 之前和之后获取 $loggeduser 检查。
  • @Bruce 我明白了......很高兴你解决了它!这是有道理的。
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多