質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.50%

PDOでlimit,offset句のあるプリペアドステートメンについて

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,051

s.kono

score 14

PHP5.3.3
MySQL5.7

limit句がある場合「PDO::PARAM_INT」を用いて型設定していますが結果が上手くいきません。文法間違いのようですが間違いが見つけられません。
limitとoffsetを指定しない場合正常に動作しています。
よろしくお願いします。

呼び足し側

$print_r($keywords);//内容確認のため
echo $sql;//内容確認のため
$retq = $GDb -> selQuery($sql,$keywords);


結果

選択実施しました
Array ( [keyaddress] => %神奈川% [limit] => 5 [offset] => 0 ) 
select distinct m.ZuID,m.name,m.address,s.member,s.sex,m.torokudate,m.age,m.income,m.deliverydate,m.CdtFLG from M_ShainTEST as m left join M_ShainSub as s on m.ZuID=s.ZuID where m.address like :keyaddress order by m.name asc order by m.name asc limit :limit offset :offset;
選択実施できませんCan't select ERROR!SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by m.name asc limit ? offset ?' at line 1

クラスの中の呼び出される関数

public function selQuery($sql,$data)
  {
    try{
        $this->cn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        $stmt = $this->cn-> prepare($sql);
        foreach ($data as $key => $val) {
            if($key === 'limit'){
                 $stmt->bindValue(':' . $key, (int) $val, PDO::PARAM_INT);
            }elseif($key === 'offset'){
                 $stmt->bindValue(':' . $key, (int) $val, PDO::PARAM_INT);
            }else{
                $stmt->bindValue(':' . $key, $val);
            }            
      }
      $stmt->execute();
      $rows = $stmt->fetchAll(); 
      echo("選択実施しました");
      } catch (\PDOException $e) {
//\header('Content-Type: text/plain; charset=UTF-8', true, 500);
          echo("選択実施できません");
          exit("Can't select ERROR!".$e -> getMessage());
      }
          return $rows;
  }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

ただのSQLの文法エラーです。このような場合、解決するためには代入しようとしている値を入れたSQL文を作成し、PHPを介さず直接テーブルにSQL文を打ってみましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 15:04

    今度からそうしてみます!! 対応策を伝授くださりありがとうございます。

    キャンセル

checkベストアンサー

+1

SQL文の中にorder by m.name ascが2回、現れています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 15:03

    はい、重複したものを修正したら動きました。驚くほど早くて深く感謝しています。これは自分で気がつくのにだいぶかかりそうでした。

    キャンセル

+1

まぁprepare処理でINTをいちいち例外的に処理するのが面倒なら
prepareの前にsprintf("%d")で整数の代入だけ先にやっちゃってもよいかもしれません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 16:59

    今回答いただいていることに気がつきコメント遅くなりました。回答ありがとうございます。今はよくわからないですが調べてみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る