PHPmySQLでデータベースの検索結果を出力したいです。
接続はPDOで行いました。テーブル(適当)の画像は下に貼っておきます。
下記コードでは、フリーワードで入力した値は出力できる
ようになっています。チェックボックスや、フリーワードで
絞り込み検索する事が難しいです。
やりたい事を下部画像で言うと2つです。
・東京都にチェックを入れたら、所在地が東京都の行を出力する。
・東京都にチェックいれてフリーワードを入力すると、所在地が
東京かつフリーワードが含まれる行を出力する。
色々調べて挫折したため、ご教授いただけると大変助かります。
ご不備等ありましたら遠慮なくご指摘ください。
どうぞよろしくお願いいたします。
php
1<?php 2 3$database = 'mysql:dbname=trainning'; 4$host = 'localhost'; 5$username = 'trainning'; 6$password = 'password'; 7$table_name = 'tablename'; 8 9$options = array( 10 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 11); 12 13try{ 14 15 $pdo = new PDO($database, $username, $password, $options); 16 $pdo->query('SET NAMES utf8'); 17 print('<br>'); 18 19 if ($pdo == null){ 20 21 print('接続に失敗しました。<br>'); 22 23 } 24 25 $pdo->query('SET NAMES utf8'); 26 27 28}catch (PDOException $e){ 29 print('Error:'.$e->getMessage()); 30 die(); 31} 32 33?> 34 35<html> 36<head> 37<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 38<title>search engine1.1</title> 39 40</head> 41 42<body> 43 44<center><h1>search engine1.1</h1> 45 46<form action="" method="get"> 47 48 <input type="checkbox" name="search1" value="東京都" ><label>東京都</label><br> 49 <input type="checkbox" name="search2" value="大阪府"><label>大阪府</label><br> 50 <input type="checkbox" name="search3" value="愛知県"><label>愛知県</label><br> 51 <input type="checkbox" name="search4" value="福岡県"><label>福岡県</label><br> 52 <input type="checkbox" name="search5" value="海外"><label>海外</label> 53 54 <p><input type="search" name="search6" size="30" maxlength="255"placeholder="Search..."> 55 <input type="submit" value="検索"></p> 56 57</form> 58 59 60</center> 61 62 63<?php 64$search_type_and = false; 65$raw_keyword = $_GET["search"]; 66print("検索したキーワード [ ".$raw_keyword." ]<br>"); 67 68//文字入力があれば実行 69if(null != $raw_keyword){ 70 71 if(isset($_GET["page"]) && preg_match("/^[0-9]+$/", $_GET["page"])){ 72 $page_number = (int)$_GET["page"]; 73 if($page_number <= 0) $page_number = 1; 74 } 75 else{ 76 $page_number = 1; 77 } 78 $page_articles = 10; // 1ページに表示する件数(定数) 79 $offset = ($page_number - 1) * $page_articles; // オフセットを計算 80 81 82 $keywords = explode(" ", trim(str_replace(" ", " ", $raw_keyword))); 83 84 $target_columns = array( 85 86 "番号", 87 "企業名", 88 "ヨミガナ", 89 "上場企業", 90 "所在地", 91 "資本金", 92 "売上高", 93 "業種", 94 "事業内容", 95 "従業員数", 96 "備考欄", 97 "PDFURL" 98 99 ); 100 101 $where = array(); 102 103 104 foreach($target_columns as $index_column => $column){ // カラムのループ 105 $tmp = array(); 106 foreach($keywords as $index_keyword => $keyword){ // キーワードのループ 107 $tmp[] = "{$column} LIKE :keyword{$index_column}_{$index_keyword}"; 108 } 109 110 /* AND検索なら、すべてのキーワードが含まれるデータを対象とする 111 上のループで作ったLIKE文の配列を " AND " で繋げる */ 112 $where[] = join($search_type_and ? " AND " : " OR ", $tmp); 113 } 114 115 $query = "SELECT SQL_CALC_FOUND_ROWS * FROM {$table_name} WHERE " . join(" OR ", $where). 116 " LIMIT {$offset}, {$page_articles}"; 117 118 $stmt = $pdo->prepare($query); 119 120 foreach($target_columns as $index_column => $column){ 121 foreach($keywords as $index_keyword => $keyword){ 122 if(!$stmt->bindValue(":keyword{$index_column}_{$index_keyword}", "%{$keyword}%")) { 123 exit("Failed to bind value: " . $keyword); 124 } 125 } 126 } 127 128 129 $stmt->execute(); 130 131 $data_meta = null; 132 133 if($stmt_all = $pdo->query("SELECT FOUND_ROWS() AS 'all'")){ 134 $data_meta = $stmt_all->fetch(); 135 136 137 } 138 139 if(!$data_meta){ 140 exit("Failed to query FOUND_ROWS()."); 141 } 142 143 $all_data_length = (int)$data_meta["all"]; 144 145 146 147 if($all_data_length > $offset){ 148 $cnt = 1; 149 $start = $offset + 1; // 開始位置 150 $end = min($offset + $page_articles, $all_data_length); // 終了位置 151 $current_offset = $start == $end ? $start : "{$start}~{$end}"; // 現在の位置 152 153 print "[{$page_number}ページ目の検索結果]\n"; 154 print "{$all_data_length} 件中 {$current_offset} 件を表示しています。\n\n<br>"; 155 156 157 //ここで保存 $session変数とかでセッションとかで保存すれば 158 159 160 while($data = $stmt->fetch(PDO::FETCH_ASSOC)){ 161 //print $cnt++ . "つ目の検索結果:\n"; 162 //print_r($data); 163 164 $pdf = $data['PDFURL']; 165 //ファイル名の後ろから4文字を削除 166 $pdf2 = substr($pdf, 46, -4); 167 168 //urlを接続しながら吐き出し 169 $url = "<a href='"; 170 171 print($url.$pdf."'>".$pdf2."</a><br>"); 172 //print("<br>".$data['PDFURL']."<br>"); 173 } 174 175 176 } 177 else{ 178 print " 検索条件に該当する企業はありませんでした。 179 条件を変更してもう一度検索してください。"; 180 /* 181 while($data = $stmt->fetch(PDO::FETCH_ASSOC)){ 182 print $cnt++ . "つ目の検索結果:\n"; 183 //print_r($data); // 184 185 $pdf = $data['PDFURL']; 186 //ファイル名の後ろから4文字を削除 187 //pdf2 = substr($pdf, 34, -4); 188 189 //urlを接続しながら吐き出し 190 //$url = "<a href='"; 191 192 //print($url.$data['備考欄']."'>".$pdf2."</a><br>"); 193 print("<br>".$data['PDFURL']."<br>"); 194 195 196 } 197 */ 198 } 199} 200?> 201 202 <p>現在 203 <?php 204 205 echo $page_number; 206 $maxpage = ceil($all_data_length / $page_articles); 207 //print($maxpage); 208 209 210 ?> 211 ページ目です。</p><br> 212 213 <?php 214 215 if (1 < $page_number){ 216 print("<a href='?search={$raw_keyword}&page=".($page_number-1)."'>前のページへ | </a>"); 217 218 } 219 220 221 if ($page_number < $maxpage){ 222 223 print("<a href='?search={$raw_keyword}&page=".($page_number+1)."'>次のページへ</a>"); 224 225 } 226 227 228 ?> 229 230</body> 231</html>
回答2件
あなたの回答
tips
プレビュー