前提・実現したいこと
以前使っていたMySQL、PHPで複数の項目から検索システムをPDO、bindValueを使って更新しているのですが
実装すると上手くいきません。お力を貸していただけると幸いです。
列の項目には複数の文字が含まれるためLIKEの部分検索を取り入れています。
以前のPHP&HTML コード
//search.phpのコード function getUserData( $params ) { //DBの接続情報 include_once( 'database.php' ); //DBコネクタを生成 $Mysqli = new mysqli( $dsn, $usr, $passwd ); $Mysqli->set_charset( 'utf8' ); $query = "SELECT * FROM TABLE1"; //接続状況チェック if ( $Mysqli->connect_error ) { error_log( $Mysqli->connect_error ); exit; } //入力された検索条件からSQl文を生成 $where = []; if ( !empty( $params[ 'search_name' ] ) ) { $where[] = "search_name like '%{$params['search_name']}%'"; } if ( !empty( $params[ 'color' ] ) ) { $where[] = "color like '%{$params['color']}%'"; } if ( !empty( $params[ 'category' ] ) ) { $where[] = "category like '%{$params['category']}%'"; } if ( $where ) { $whereSql = implode( " AND ", $where ); $sql = "select * from TABLE1 where " . $whereSql; } else { $sql = "select * from TABLE1"; } $query .= $where; //SQL文を実行する $UserDataSet = $Mysqli->query( $sql ); //扱いやすい形に変える $result = []; while ( $row = $UserDataSet->fetch_assoc() ) { $result[] = $row; } return $result; } //ーーー HTML側 ーーー <!doctype html> <?php include_once( 'search.php' ); $userData = getUserData( $_POST ); ?> <html> <head> </head> <body> //キーワード検索、チェックボックス、セレクションの3タイプで検索 <input name="search_name" value="<?php echo isset($_POST['search_name']) ? htmlspecialchars($_POST['search_name']) : '' ?>"> <input type="checkbox" name="color" value="白" <?php echo isset($_POST['color']) && $_POST['color'] == '白' ? 'selected' : '' ?>><label for="color">白</label>//他省略 <select name="category"> <option value="0" <?php echo empty($_POST['category']) ? 'selected' : '' ?>>分類A</option>//他省略 </select> <button type="submit" name="search">検索</button> //上記項目以外のデータで結果表示 <?php if(isset($userData)): ?> <?php foreach($userData as $row): ?> <img src="../<?php echo htmlspecialchars($row['img']); ?>"> <?php echo htmlspecialchars($row['original_name']) ?> <?php endforeach; ?> <?php endif; ?> </body> </html>
改定後
//search.phpのコード function getUserData() { include_once( 'database.php' ); try { $db = new PDO( $dsn, $usr, $passwd ); $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $db->setAttribute( PDO::ATTR_EMULATE_PREPARES, false ); $q = ( string )filter_input( INPUT_GET, 'q' ); $maxKeywords = -1; $keywords = preg_split( '/(?:\p{Z}|\p{Cc})++/u', $q, $maxKeywords, PREG_SPLIT_NO_EMPTY ); if ( $keywords ) { foreach ( $keywords as $keyword ) { $holders[] = "((search_name LIKE ? ESCAPE '!') OR (color LIKE ? ESCAPE '!') OR (category LIKE ? ESCAPE '!'))"; $values[] = $values[] = '%' . preg_replace( '/(?=[!_%])/', '!', $keyword ) . '%'; } $sql = "SELECT * FROM TABLE1 WHERE (' . implode(' AND ', $holders) . ')"; $UserDataSet = $bd->prepare( $sql ); $UserDataSet->execute( $values ); $userData = $UserDataSet->fetchAll( PDO::FETCH_ASSOC ); } print '接続に成功しました'; } catch ( PDOException $e ) { header( 'Content-Type: text/plain; charset=UTF-8', true, 500 ); exit( '接続できませんでした' . $e->getMessage() ); } function h( $str ) { return htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ); } } //ーーー HTML側 ーーー <!doctype html> <?php include_once( 'search.php' ); $userData = getUserData( $_GET ); ?> <html> <head> </head> <body> //キーワード検索、チェックボックス、セレクションの3タイプで検索 <input name="search_name" value="<?php echo isset($search_name) ?= h($search_name) : '' ?>"> <input type="checkbox" name="color" value="白" <?php echo isset($color) && $color == '白' ? 'selected' : '' ?>><label for="color">白</label>//他省略 <select name="category"> <option value="0" <?php echo empty($category) ? 'selected' : '' ?>>分類A</option>//他省略 </select> <button type="submit" name="search">検索</button> //$holders[]に指定した列以外のデータで結果表示 <?php if (isset($err)) : ?> <p><?= h($err->getMessage()); ?></p> <?php endif; ?> <?php if (0 < count($userData)): ?> <?php foreach ($userData as $row) : ?> <div class="box_warp"> <div><img class="circular" height="80" src="../<?= h($row['img']); ?>"></div> <div class="break-word"><?= h($row['original_name']); ?></div> </div> <?php endforeach; ?> <?php endif; ?> </body> </html>
回答4件
あなたの回答
tips
プレビュー