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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

5077閲覧

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

s.kono

総合スコア37

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/11/11 05:35

PHP5.3.3
MySQL5.7

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

呼び足し側

PHP

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

結果

PHP

1選択実施しました 2Array ( [keyaddress] => %神奈川% [limit] => 5 [offset] => 0 ) 3select 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; 4選択実施できません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

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

PHP

1 public function selQuery($sql,$data) 2 { 3 try{ 4 $this->cn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 5 $stmt = $this->cn-> prepare($sql); 6 foreach ($data as $key => $val) { 7 if($key === 'limit'){ 8 $stmt->bindValue(':' . $key, (int) $val, PDO::PARAM_INT); 9 }elseif($key === 'offset'){ 10 $stmt->bindValue(':' . $key, (int) $val, PDO::PARAM_INT); 11 }else{ 12 $stmt->bindValue(':' . $key, $val); 13 } 14 } 15 $stmt->execute(); 16 $rows = $stmt->fetchAll(); 17 echo("選択実施しました"); 18 } catch (\PDOException $e) { 19//\header('Content-Type: text/plain; charset=UTF-8', true, 500); 20 echo("選択実施できません"); 21 exit("Can't select ERROR!".$e -> getMessage()); 22 } 23 return $rows; 24 }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2016/11/11 05:46

wakame_taishi

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.kono

2016/11/11 06:04

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

0

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

投稿2016/11/11 06:07

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.kono

2016/11/11 07:59

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

0

ベストアンサー

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

投稿2016/11/11 05:51

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.kono

2016/11/11 06:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問