失礼します。
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検索時の処理が間違っているのか(もしくはどちらも)自分では解決できなかったので質問させていただきました。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/01/08 07:59