【问题标题】:SQL statement won't limit. Show's no resultsSQL 语句不会限制。显示没有结果
【发布时间】:2013-09-17 09:54:35
【问题描述】:

我正在创建一个 Web 应用程序,并试图限制输入的结果数量。当我进行查询时,所有结果都会返回,但如果我在语句末尾放置 LIMIT 5,则不会结果回来了。这是我的代码:

$query = $conn->prepare('SELECT * FROM notifications WHERE (needs=:username OR worker=:username) ORDER BY CASE WHEN needs=:username THEN needsread ELSE workerread END, time DESC LIMIT 5');

$query->bindParam(':username', $username);
$query->execute();

echo "<div id='notes_title' style='background-color: #333333; padding: 10px; text-align: center; font-weight: lighter; letter-spacing: 1px;'>Notes</div>";
$te = 0;
while ($rows = $query->fetch()) {

$needs = $rows['needs'];
$id = $rows['ID'];
$worker = $rows['worker'];
$title = $rows['title'];
$needsread = $rows['needsread'];
$workerread = $rows['workerread'];
$time = $rows['time'];
$type = $rows['type'];

关于它为什么不起作用的任何线索?

【问题讨论】:

  • 如果这是您拥有的实际代码,只需查看 SO 为所有内容分配的颜色。您错过了匹配的报价。脚本本身可能默默地失败了。查看 PHP 错误日志以获取更多详细信息。
  • @JustinWood 成功了,单引号在开头,双引号在结尾
  • 否定他没有搞定。您对引号的看法是正确的,但这并没有解决 LIMIT 问题。

标签: php mysql sql limit


【解决方案1】:
$query = $conn->prepare('SELECT * FROM notifications WHERE (needs=:username OR worker=:username) ORDER BY CASE WHEN needs=:username THEN needsread ELSE workerread END, time DESC LIMIT 5");

您的代码中存在错误。您以单引号开始查询字符串,并以双引号结束。您的实际查询字符串是:

'SELECT * FROM notifications WHERE (needs=:username OR worker=:username) ORDER BY CASE WHEN needs=:username THEN needsread ELSE workerread END, time DESC LIMIT 5"); $query-&gt;bindParam('

【讨论】:

  • 停止投票。这是一个语法错误,但没有解决问题...再试一次?
【解决方案2】:

我猜你正在使用 MySQL,因为你正在做一个 webapp,所以

尝试限制 0、5 这意味着您希望前 5 个项目从无开始

-J

【讨论】:

  • 试试这个 $query = $conn->prepare(' SELECT * FROM notifications WHERE (needs=:username OR worker=:username) ORDER BY CASE WHEN needs=:username THEN needsread ELSE workerread END ORDER按时间 DESC LIMIT 5')
  • 这给了我致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 /home/content/17/9932517/html/project_y/mobile_site/getnotes.php:39 的第 1 行的“ORDER BY time DESC LIMIT 5”附近使用正确的语法堆栈跟踪:#0 /home/content/17/9932517/html/project_y/mobile_site/getnotes.php(39): PDOStatement->execute() #1 {main} 在 /home/content/17/9932517/html 中抛出/project_y/mobile_site/getnotes.php 第 39 行
  • @user2774299: LIMIT 5LIMIT 0,5 在功能上是相同的。这不是问题。
【解决方案3】:

您在查询中使用了相同的命名参数:username三次。这是不允许的(man page“描述”部分的第二段。每个占位符/参数在查询中必须是唯一的。

SELECT [...snip...] WHERE (needs=:username OR worker=:username)
                                  ^^^^^^^^           ^^^^^^^^^
ORDER BY CASE WHEN needs=:username THEN [...snip...]
                         ^^^^^^^^^

您可以简化查询并消除其中一个重复项

WHERE :username IN (needs, worker)

但是你仍然坚持ORDER 子句中的第二个用法。您必须使用两个不同的名称并将相同的值绑定两次,例如

选择 ... WHERE :username1 ... ORDER BY CASE when needs=:username2

$query->bindParam(':username1', $val);
$query->bindParam(':username2', $val);

【讨论】:

  • 虽然@MarcB 的代码可能无法解决您原始问题中的所有问题,但他并没有错。 “您不能在准备好的语句中两次使用同名的命名参数标记。” - php.net/manual/en/pdo.prepare.php你应该更新你的问题。
猜你喜欢
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多