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

クエリで同じ名前付きパラメーターを 3 回使用:usernameいます。これは許可されていません ( man ページの「説明」セクションの 2 番目の段落。各プレースホルダー/パラメーターはクエリ内で UNIQUE である必要があります。

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

クエリを簡素化し、重複の 1 つを排除することができます。

WHERE :username IN (needs, worker)

しかし、あなたはまだORDER句の2番目の使用法にこだわっています. 2 つの異なる名前を使用し、同じ値を 2 回バインドする必要があります。

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

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

あなたはウェブアプリをやっているので、MySQLを使っていると思います。

LIMIT 0, 5 を試してください。これは、最初の 5 項目が none から始まることを意味します。

-J

于 2013-09-12T20:54:32.000 に答える