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

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

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

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

PHP

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

Q&A

解決済

2回答

1650閲覧

pdoでアンド検索を実装

nerd

総合スコア37

MySQL

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

PHP

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

0グッド

1クリップ

投稿2017/05/23 06:40

###前提・実現したいこと
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

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

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

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

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

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

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

guest

回答2

0

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

投稿2017/05/23 07:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

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 06:50

編集2017/05/23 07:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nerd

2017/05/23 06:55

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

退会済みユーザー

2017/05/23 07:11

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

2017/05/23 07:11

なるほど LIMITの部分を今少し検証してみます。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/05/23 07:29

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

2017/05/23 07:46

WHERE 1はMySQLでは比較的よくつかわれるやり方ですね WHERE句にANDで条件をつなぐことができるので プログラムからSQL文を記述する際には重宝します。 つまり SELECT * FROM テーブル WHERE 1 として全データを表示するのをベースに SELECT * FROM テーブル WHERE 1 AND カラム='hoge' のように条件付けをしていきます 代表的なところだとphpMyAdminでユーザーがSQL文を手動で入力する際 WHERE 1が提案されます
退会済みユーザー

退会済みユーザー

2017/05/23 08:00

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

2017/05/23 08: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文をつくるための 書き方だとおもってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問