前提・実現したいこと
検索窓からMySQLDB内のgift_tbから、複数のカラムをconcat関数で結合し、LIKE検索してデータを取り出したいのですが上手くいきません。
var_dump($sql) : " SELECT * FROM gift_tb WHERE CONCAT('gift_name','detail','reason') LIKE ? ORDER BY postdate desc limit 15 " var_dump($arrVal) : array(1) { [0]=> string(13) "'%検索ワード%'" }
となっていて、?に%検索ワード%がバインドされません。
ただ、public function select($table, $column ='', $where ='', $arrVal =[])は他の場面では機能しています。
値をバインドする部分がよくわかっていません。
ご教授願います。
※検索文字列に"%"が含まれる時ののエスケープ処理はとりあえず飛ばしています。
該当のソースコード
top.php
php
1if(isset($_GET['search']) === true){ 2 $search_word = htmlspecialchars($_GET['search']); 3 // var_dump($search_word); 4 $dataArr = $gift->getSearchGift($search_word); 5 var_dump($dataArr); 6 if($dataArr == false){ 7 $errMsg = '" ' . $search_word . ' "'. ' を含む 対象は見つかりませんでした。'; 8 } 9}
Gift.class.php
php
1public function getSearchGift($search_word) 2 { 3 $table = 'gift_tb'; 4 $col = ''; 5 $where = " CONCAT('gift_name','detail','reason') LIKE ?"; 6 $arrVal = ($search_word !== '') ? ["'%" . $search_word . "%'"] : []; 7 // var_dump($arrVal); 8 $res = $this->db->select($table, $col, $where, $arrVal); 9 var_dump($res); 10 return ($res !== false && count($res) !== 0) ? $res : false; 11 }
PDO.class.php
php
1public function select($table, $column ='', $where ='', $arrVal =[]) 2 { 3 $sql = $this->getSql('select' , $table, $where, $column); 4 5 $this->sqlLogInfo($sql, $arrVal); 6 var_dump($sql); 7 var_dump($arrVal); 8 $stmt = $this->dbh->prepare($sql); 9 $res = $stmt->execute($arrVal); 10 11 if($res === false){ 12 $this->catchError($stmt->errorInfo()); 13 } 14 var_dump($res); 15 $data = []; 16 while ($result = $stmt->fetch(\PDO::FETCH_ASSOC)){ 17 array_push($data,$result); 18 } 19 return $data; 20 21 } 22 23private function getSql($type, $table, $where = '', $column = '') 24 { 25 switch ($type){ 26 case 'select': 27 $columnkey = ($column !== '') ? $column : "*"; 28 break; 29 30 case 'count': 31 $columnkey = 'COUNT(*) AS NUM '; 32 break; 33 34 default: 35 break; 36 } 37 38 $whereSQL = ($where !== '') ? ' WHERE ' . $where : ''; 39 $other = $this->groupby . " " . $this->order . " " . $this->limit . " " . $this->offset; 40 41 //SQL文の作成 42 $sql = " SELECT " . $columnkey . " FROM " . $table . $whereSQL . $other; 43 var_dump($sql); 44 return $sql; 45 } 46 47 public function setOrder($order = '', $limit= '') 48 { 49 if ($order !== ''){ 50 $limit2 = ($limit !== '') ? $limit: 'desc limit 20'; 51 $this->order = ' ORDER BY ' . $order . ' ' . $limit2; 52 } 53 }
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー