0

我正在创建一个 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'];

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

4

3 回答 3

3
$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->bindParam('

于 2013-09-12T20:48:24.100 回答
0

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

尝试 LIMIT 0, 5 这意味着您希望前 5 个项目从无开始

-J

于 2013-09-12T20:54:32.000 回答
0

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

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

您可以通过以下方式简化查询并消除其中一个重复项

WHERE :username IN (needs, worker)

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

SELECT ... WHERE :username1 ... ORDER BY CASE when needs=:username2

$query->bindParam(':username1', $val);
$query->bindParam(':username2', $val);
于 2013-09-12T21:12:38.167 回答