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

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

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

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

PHP

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

Q&A

解決済

2回答

3628閲覧

PHPとMySQLを利用したOR検索の結果表示が意図通りにならない

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

0グッド

0クリップ

投稿2015/01/07 12:13

失礼します。
phpとmysqlを利用したショッピングカートのシステムを作ることになったので、まず商品検索→検索結果の表示の部分から作ろうと思ってコードを書いたのですが、タイトル通りOR検索した時の出力が意図通りになりません。

データベースにはnameというカラムに「りんご」「みかん」「バナナ」「りんす」が存在します。

私がやりたいのは、「りんご みかん」と入力すると「りんご」と「みかん」の2つが出力される検索です。

以下がコードです。

lang

1<?php 2// HTTPヘッダーで文字コードを指定 3header("Content-Type:text/html; charset=UTF-8"); 4?> 5<?php 6//h()関数の読み込み 7require_once 'lib/h.php'; 8//checkinput()関数の読み込み 9require_once 'lib/checkinput.php'; 10 11//POSTされたデータのチェック 12$_POST = checkinput($_POST); 13 14//三項演算子で検索文字列の有無を判定し処理 15$data = isset($_POST['data']) ? trim($_POST['data']) : ''; 16//OR検索 17$query = 'SELECT * FROM goods WHERE '; //クエリ前半 18$sql =""; 19if($data){ 20 $count = 1; //カウントを1にしておく 21 $data = trim($data); //検索文字列の前後の空スペースだけを除去 22 //全角スペースはmb_convert_kana()関数で半角スペースに変換 23 $datalist = mb_convert_kana($data, 's'); 24 //検索ワードをスペースで分割して配列に格納 25 $keyword = explode(" ",$datalist); 26 //配列の数を数える 27 $count = count($keyword); 28 //空スペースで区切られた数によってSQL文を組み立てる 29 for($i=0; $i<$count; $i++){//配列の数だけ繰り返す 30 if($i!="0"){ 31 $sql = $sql." OR"; 32 } 33 $sql = $sql." name LIKE :$keyword ".$i; 34 } 35}else{ 36 $count = 0; 37} 38//SQL文準備 39$query = $query.$sql; 40?> 41<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 42 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 43<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> 44<head> 45<meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 46<meta http-equiv="content-script-type" content="text/javascript" /> 47<meta http-equiv="content-style-type" content="text/css" /> 48<!-- StyleSheet記述 49<link rel="stylesheet" href="./css/main.css" type="text/css" media="all" /> 50StyleSheet記述 --> 51<!-- PAGE TITLE --> 52<title>ページタイトル</title> 53</head> 54<body> 55<?php 56if(!empty($datalist)){ 57 try{ 58 $username = "root"; 59 $password = "root"; 60 $pdo = new PDO( 61 'mysql:host=localhost;dbname=shop', 62 $username, 63 $password, 64 array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 65 66 //プリペアドステートメントのエミュレーションを無効にする 67 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 68 //エラーが発生した場合、例外がスローされるようにする 69 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 70 71 //検索結果 72 if($datalist <> ""){//検索窓が空なら検索しない 73 //単ワードでの検索時 74 if($count == 1){ 75 $datalist2 = '%'.$datalist.'%'; //検索文字列を%検索文字%とする 76 $stmt = $pdo->prepare("SELECT * FROM goods WHERE name LIKE :datalist"); 77 $stmt->bindParam(':datalist',$datalist2,PDO::PARAM_STR); 78 $stmt->execute( 79 ); 80 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 81 82 }//OR検索時 83 elseif($count > 1){ 84 $stmt = $pdo->prepare($query); 85 for($i=0; $i<$count; $i++){ //検索ワードの数だけ繰り返す 86 $keyword2[$i] = '%'.$keyword.'%'; //検索ワード1つ1つを%検索文字%にする 87 $holder = ':datalist'.$i; //ホルダー用 88 $stmt->bindParam($holder,$keyword2[$i],PDO::PARAM_STR); 89 } 90 $res = $stmt->execute( 91 ); 92 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 93 } 94 } 95 96 97 if(count($result) == 0){ 98 print '<p>「'.h($data).'」はデータベースに登録がありません</p>'; 99 }else{ 100 print '<p>「'.h($data).'」はデータベースに登録がありました</p>'; 101?> 102 <p>検索結果</p> 103 <table> 104 <tr> 105 <th>商品名</th> 106 <th>価格</th> 107 </tr> 108 109<?php 110 foreach ($result as $row){ 111?> 112 <tr> 113 <td><?php print h($row['name']) ?></td> 114 <td><?php print h($row['price']) ?></td> 115 </tr> 116<?php 117 } 118 print '</table>'; 119 } 120 121//接続でいない場合、PDOException例外がスローされるのでキャッチする 122 }catch(PDOException $e){ 123 print 'エラーが発生しました。。 内容:' . h($e->getMessage()); 124 } 125} 126?> 127<p>検索したい文字列を入力</p> 128<form action="list_s.php" method="POST" > 129<input type="search" name ="data"> 130<input type="submit" value="検索"> 131</form> 132</body> 133</html>

「ん」と入力すると「データベースに登録があります」のメーッセージと共に「りんご」「みかん」「りんす」が出力されます。
しかし、「りんご みかん」と入力すると、「データベースに登録がありません」とメッセージが出力されます。
SQL文が間違っているのか、それともOR検索時の処理が間違っているのか(もしくはどちらも)自分では解決できなかったので質問させていただきました。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

lang

1 //検索ワードをスペースで分割して配列に格納 2 $keyword = explode(" ",$datalist); 3 //配列の数を数える 4 $count = count($datalist);

これって想定通りですか?
配列は$keywordのように見えるのですが。

投稿2015/01/08 02:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/01/08 07:59

気づきませんでした。 完全にミスです。ありがとうございます。
guest

0

lang

1$sql = $sql." name LIKE :$datalist ".$i;

「:$datalist "」が「:datalist"」と思います

あと、以下で検索条件が1つの場合は処理を分けていますが、
必要ないと思います。

lang

1 //単ワードでの検索時 2 if($count == 1){ 3 $datalist2 = '%'.$datalist.'%'; //検索文字列を%検索文字%とする 4 $stmt = $pdo->prepare("SELECT * FROM goods WHERE name LIKE :datalist"); 5 $stmt->bindParam(':datalist',$datalist2,PDO::PARAM_STR); 6 $stmt->execute( 7 ); 8 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 9 10 }

投稿2015/01/07 13:36

toru81

総合スコア170

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

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

退会済みユーザー

退会済みユーザー

2015/01/08 08:10

ありがとうございます。 $はいらないんですね。 もしかしてdatalistではなくてkeywordなんですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問