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

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

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

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

PHP

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

Q&A

解決済

2回答

1357閲覧

PHP MYSQLを使用し複数条件で検索したい

ooyuki

総合スコア4

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/06/11 03:06

現在2つの条件でMYSQLからデータを引っ張ってきたいのですが
下記のコードではnameだけのデータでしか検索・表示しかできておりません。

SQLを見てみますと
SELECT * FROM p1 WHERE 1=1 AND card_name LIKE :name

PHP

1//p_no と nameを 前のページからformを使用 2$p_no = filter_input(INPUT_GET, 'p_no'); 3$name = filter_input(INPUT_GET, 'name'); 4 5if (is_string($name)) { 6 //MySQLデータベースは省略 7 try { 8 $pdo = new PDO($dsn, $user, $password); 9 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 10 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 11 // SQL文を作る 12 $sql = 'SELECT * FROM p1 WHERE 1=1'; 13 //検索条件 14 if($p_no) $sql .= ' AND pp_no = :p_no'; 15 //名前の検索条件(あいまい検索) 16 if($name) $sql .= ' AND card_name LIKE :name'; 17 $sth = $pdo -> prepare($sql); 18 //プリペアドステートメントを実行する(インジェクション対策) 19 if($area) $sth -> bindValue(':p_no', $p_no, PDO::PARAM_STR); 20 if($name) $sth -> bindValue(':name', '%'.$name.'%', PDO::PARAM_STR); 21 // $sth -> execute($sql); 22 $sth -> execute(); 23 $result = $sth->fetchAll(PDO::FETCH_ASSOC); 24 25  echo $sql; 26 27 if(count($result)>0){ 28 echo "名前に「{$name}」が含まれているレコード"; 29 // テーブルは省略 30 31 } else { 32 echo "名前に「{$name}」は見つかりませんでした。"; 33 } 34 } catch (Exception $e) { 35 echo '<span class="error">エラーがありました。</span><br>'; 36 echo $e->getMessage(); 37 } 38}

原因は
$sth -> execute();
となっているのはわかるのですが、

$sth -> execute($sql); としますと、(サンプルコードはexecute($sql)となっています)
エラー表示
Warning: PDOStatement::execute() expects parameter 1 to be array, string given in
となります。

参考にさせていただいたサンプルコードがあり、
それを自身の変数に変えるぐらいの知識しか無いため、

executeは引数に配列を期待しているがstringを渡しているための警告です。

という事がわかってもサンプルコードでは動いているはずなので、
どのPODをどのように変更してよいのかわかりません。

よろしくお願いします。

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

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

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

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

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

zushi0905

2021/06/11 04:03

サンプルコードを提示できるのであれば、もっと詳しく回答できるかもしれないので提示して欲しいです!
guest

回答2

0

ベストアンサー

if($area) $sth -> bindValue(':p_no', $p_no, PDO::PARAM_STR);

if($p_no) $sth -> bindValue(':p_no', $p_no, PDO::PARAM_STR);

ですね

} catch (Exception $e) {

ここはこうです

} catch(PDOException $e){

投稿2021/06/11 04:48

yambejp

総合スコア116724

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

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

ooyuki

2021/06/11 05:15

ご指摘ありがとうございます。 今までnoの検索が出来なかったのですが、できるようになりました。 $sth -> execute($sql); でエラーが発生していましたので その前だけ見て考えておりましたが、関係のない部分が原因だったとは・・・ 本当にありがとうございます。
guest

0

質問のコードではexecuteに渡している値がSQL文になっています。そもそも、executeに引数で渡すものはprepareで読み込んだSQL文のプリペアードステートメントのプレースホルダーに渡す値です。

今回の場合はbindValueで丁寧にパラメータを指定してあげてるので、executeの引数無しでいいとは思いますが、もしexecuteの引数でパラメータを渡すなら、配列を生成して渡してあげる必要があります。

投稿2021/06/11 04:02

zushi0905

総合スコア683

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

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

zushi0905

2021/06/11 05:32

bind関数でパラメータの数があっていれば、executeの引数は無視して実行できるんですね。勉強になりました。 サンプルコードの方はPDO::execとPDOStatement:executeを混同してる感じですね。 executeの引数はなしにしといた方がいいかとは思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問