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

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

ただいまの
回答率

90.51%

  • PHP

    23036questions

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

  • MySQL

    6684questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

pdoでアンド検索を実装

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 382

nerd

score 25

前提・実現したいこと

php , PDO , Mysql を利用して、アンド検索を実装したいです。
参照させていただいたサイトをもとに僕の環境にて作成しました。

参照URL
http://qiita.com/ichii/items/bf4fc82b61656d3c9f72

発生している問題・エラーメッセージ

以下がエラーとして出ています。

Fatal error: Call to a member function execute() on boolean in

該当のソースコード

          <form action="function/detail.php" method="post">
          <label>商品名<input type="text" name="search_product_name"></label>
          <label>商品型番<input type="text" name="search_product_code"></label>
          <input type="hidden" name="now_page" value="<?=$now_page?>">
          <input type="hidden" name="year" value="<?=$year?>">
          <input type="hidden" name="season" value="<?=$season?>">
          <input type="hidden" name="page_max" value="<?=$page_max?>">
          <select name="page_max">
            <option value="20">20</option>
            <option value="50">50</option>
            <option value="100">100</option>
            <option value="200">200</option>
          </select>
          <input type="submit" value="search" name="search">
  $now_page = $_POST['now_page'];
  $year = $_POST['year'];
  $season = $_POST['season'];
  $page_max = $_POST['page_max'];
  $search_product_name = $_POST['search_product_name'];
  $search_product_code = $_POST['search_product_code'];
  $words = preg_split("/[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]++/u",$search_product_name,-1,PREG_SPLIT_NO_EMPTY);
  $conds = ['1'];//値がない場合の処理
  $values = [];
  foreach ($words as $word) {
      $conds[] = '検索対象フィールド名 LIKE ? ESCAPE "!"';
      $values[] = '%' . preg_replace('/(?=[!_%])/', '!', $word) . '%';
  }
  $pdo = db_connect();
  $format = "SELECT SQL_CALC_FOUND_ROWS * FROM 検索対象テーブル名 WHERE %s LIMIT %d, %d";
  $sql =sprintf($format,implode(' AND ', $conds),$page_max * ($now_page - 1),$page_max);
  $stmt = $pdo->prepare($sql);
  $stmt->execute($values);

試したこと

$sqlを生成した後を見ても文自体は問題なく表示されている印象でした。

SELECT SQL_CALC_FOUND_ROWS * FROM admin_ssk_master_spec WHERE 1 AND item_name LIKE ? AND item_name LIKE ? LIMIT -20, 20

補足情報(言語/FW/ツール等のバージョンなど)

XAMPP for Windows 5.6.24
mysql  Ver 15.1
php 5.6

何か理解の上で間違っている部分がございましたらお手数ですがご指摘いただけましたら幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

limit句が明らかにおかしいです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

PHP: PDO::prepare - Manual

もしデータベースサーバーが文を準備できなかった場合、 PDO::prepare() は FALSE を返すか PDOException を発行します (エラー処理 の方法に依存します)。 

とのことなので、$stmtにはfalseが入っていて、その上で
$stmt->execute($values);を実行しようとして該当エラーを表示していることはわかりますね?

~ WHERE 1 AND item_name LIKE ? AND ~
の1ってなんでしょうね。これのせいでprepare()が失敗しているんじゃないかと思います。
何が1であることを想定しているWHERE句なのか。
TRUEって書けばいいのかもしれませんけど。

===

もう一個可能性として、
LIMIT -20, 20かも。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9 SELECT 構文

LIMIT は 1 つまたは 2 つの数値引数を受け取ります。これは、どちらも負ではない整定数である必要があります。

とのことなので。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/23 15:55

    ご回答ありがとうございます。

    該当ページ参照で恐縮ですが

    ```
    1を代入しているのは組み立てを容易にするためです。条件が何も無いときは全部取ってくる処理になると思いますが、このとき何も考えていないコードだとWHEREを削除する必要があります。SQLを手書きする場合にこれは面倒なので、WHEREに必ず真になる条件を与える意味でWHERE 1としているのです。条件1を先頭に置いておけば検索キーワードがあっても無くても対応できます。
    ```

    とのことでしたので、利用しております。

    キャンセル

  • 2017/05/23 16:11

    1を書くやり方を私はやらないので、ちょっと違和感を覚えました。
    それが動くかどうかは試していないのでわからないのですが、改めてLIMITの数字がおかしいとわかりましたので回答内に追記しました。

    キャンセル

  • 2017/05/23 16:11

    なるほど
    LIMITの部分を今少し検証してみます。

    ありがとうございました。

    キャンセル

  • 2017/05/23 16:29

    > m6u さん
    リンク先、下にあるコメント欄で mpyw さんが解説してくれていて面白いです。私も最初違和感がありましたw
    スクリプトのレベルがチグハグなのは、部分的に mpyw さんのモノが入っているからかと。

    キャンセル

  • 2017/05/23 16:46

    WHERE 1はMySQLでは比較的よくつかわれるやり方ですね
    WHERE句にANDで条件をつなぐことができるので
    プログラムからSQL文を記述する際には重宝します。
    つまり
    SELECT * FROM テーブル WHERE 1
    として全データを表示するのをベースに

    SELECT * FROM テーブル WHERE 1 AND カラム='hoge'
    のように条件付けをしていきます

    代表的なところだとphpMyAdminでユーザーがSQL文を手動で入力する際
    WHERE 1が提案されます

    キャンセル

  • 2017/05/23 17:00

    「WHERE 1」はよくあることなんですね、今までやったことがないのと、SQL文の美しさ追求のためWHERE句条件が不要な場合はif文で分岐して作ってきたので、「そういうやり方もある」と教えていただきありがとうございます。

    キャンセル

  • 2017/05/23 17:18

    たとえば$aと$bがユーザーから提供されてそれぞれカラムaとカラムbに
    完全一致が必要な時

    $sql="select * from テーブル WHERE 1 ";
    if($a!=="") $sql.="AND `a`='$a' ";
    if($b!=="") $sql.="AND `b`='$b' ";
    とすると$aや$bの状況にあわせて処理が簡単に書けます。
    もしここでWHERE 1をつかわないと
    $a!==""のときに$sql内にwhere句があるかチェックしてつなげる
    など無駄な処理が必要になります

    したがってあくまでもプログラムからSQL文をつくるための
    書き方だとおもってください

    キャンセル

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

  • PHP

    23036questions

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

  • MySQL

    6684questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。