• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHP PDO化作業中ORDERでソートできない)

PHP PDO化作業中ORDERでソートできない

このQ&Aのポイント
  • WAMP初級者です。いままでPEAR::DBを使って書いていたサイトがあり、PDOを利用するように書き換えていますが、いろいろ試してもorderでの並び替えが効いてくれません。
  • 該当箇所のみ切り出して例示いたします。キーワード検索した結果画面で、$keywordはPOSTで渡って来ています。
  • 初歩的な質問ですみませんが、どなたお助けいただけますと幸いです。環境はApache/2.2.4 (Win32) PHP/5.4.22です

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

真っ白になる → エラーが発生しているということです。デバッグ環境ではphp.iniの設定で display_errors = On error_reporting = E_ALL | E_STRICT としてください。 (くどいですけど一応貼っておきます) http://qiita.com/mpyw/items/b00b72c5c95aac573b71 PHP5.4に更新されたならば、エンコーディング指定の方法を望ましい方法に変えましょう。以下にサンプルコードを掲載します。 (全角スペースでインデントしています) ● 例1 最初のうまくいった例ですが、LIKE検索に使われる特殊文字「_」「%」「\」のエスケープが行われていなかったので追記しておきました。 try {    // 接続  $pdo = new PDO(   'mysql:host=127.0.0.1;dbname=test_db;charset=utf8',   'root',   'root',   array(    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,   )  );    // SQL実行  $sql = implode(' ', array(   'SELECT *',   'FROM `test_tbl`',   'JOIN `test_tbl2` USING(`Code`)',   'WHERE `NameW` LIKE ?',  ));  $stmt = $pdo->prepare($sql);  $stmt->execute(array('%' . addcslashes($keyword, '%_\\') . '%'));    // 表示  foreach ($stmt as $i => $row) {   /* 表示処理 */  }   } catch (PDOException $e) {    // 例外メッセージ  echo $e->getMessage();   } ● 例2 「10K」「10B」という名前のカラムが存在するってことでいいんですよね? try {    // 接続  $pdo = new PDO(   'mysql:host=127.0.0.1;dbname=test_db;charset=utf8',   'root',   'root',   array(    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,   )  );    // SQL実行  $sql = implode(' ', array(   'SELECT *',   'FROM `test_tbl`',   'JOIN `test_tbl2` USING(Code)',   'WHERE `NameW` LIKE ?',   'ORDER BY `10K` + `10B` DESC',  ));  $stmt = $pdo->prepare($sql);  $stmt->execute(array('%' . addcslashes($keyword, '%_\\') . '%'));    // 表示  foreach ($stmt as $i => $row) {   /* 表示処理 */  }   } catch (PDOException $e) {    // 例外メッセージ  echo $e->getMessage();   } カラム名やDESCなどの特別なキーワードをプレースホルダを使ってバインドすると、バッククオートではなくシングルクオートで括られて文字列の扱いを受けてしまうので、プレースホルダを用いることは出来ません。もしこれらを可変パラメータにする場合は、十分に入力が正しいか検証した後、prepareメソッドをコールする前の段階でsprintf関数などを活用してクエリ文を組み立てておく必要があります。

buttero
質問者

お礼

いつもアドバイスありがとう御座います。解決いたしました。 また、サンプルコードも感謝いたします。初心者用のテキストにはなかなか出てこない上級なコードでこれだけで発見が多くありました。"PHPでデータベースに接続するときのまとめ"はいつも開きっぱなしにしてますが、初級者の私にはすべて理解ができていませんが、少しずつご指摘の内容がわかってきました。引き続きがんばって勉強します。

関連するQ&A

専門家に質問してみよう