アプリ版:「スタンプのみでお礼する」機能のリリースについて

mysql+phpでWebアプリを作り始めた者です。
行き詰っている部分がありまして、教えて頂けると助かります。

select文の選択結果に対してのレコード番号を動的に取得したくて、下記のようなSQL文をphpの中で実行するため、下記のようなコードを書きました。

$sql="set @nm=0;select * from (select @nm:=@nm+1 as cnt, f01,f02 from tbl where f02="***") as a limit 0,10";
$rs = mysqli_query($cn, $sql);
$cnt = mysqli_num_rows($rs); // 総行数

$rs = mysqli_query($cn, $sql);
while ($row = mysqli_fetch_assoc($rs)) {
 // 略
}

ここで、結果をphpで取得する部分の行で、
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in *****.php on line 70
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in *****.php on line 289
というエラーが発生してしまい、結果が1件も返りません。

SQL>set @nm=0;select * from (select @nm:=@nm+1 as cnt, f01,f02 from tbl where f02="***") as a limit 0,10
と直接にSQLを入れた場合は、正常に結果が表示されます。

このレコード番号を取得するための変数を入れる前は、下記のようなSQLを実行していましたが、正常に動作しておりました。
$sql="select f01,f02 from tbl where f02="***" limit 0,10";

変数を含んだSQL文をphpで実行するのは無理なんでしょうか?

A 回答 (2件)

まず、ダブルクォーテーションが競合しています。


$sqlに渡す外側に"をつかっているならwhere句のクォーテーションはシングルクォートにしてください

またmysqliならマルチクエリが実行可能だとは思いますが、なれない場合はやはり
1行ごとSQL文を実行したほうがいいでしょう。

$sql="set @nm=0";
$rs = mysqli_query($cn, $sql);
$sql="select * from (select @nm:=@nm+1 as cnt, f01,f02 from tbl where f02='***') as a limit 0,10";
$rs = mysqli_query($cn, $sql);
    • good
    • 0

一応むりやりやるならこう



$sql="select (select @nm:=@nm+1 from (select @nm:=0) as dummy) as cnt,tbl.* from tbl where f02='***' limit 0,10 ";
    • good
    • 0
この回答へのお礼

有難うございました。こういう書き方もあるんですね。なんとなく判るような気もしますが、自分のレベルでは可読性が悪くなってしまうので、前述の書き方でさせて貰います。

お礼日時:2017/06/13 09:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す