全角・半角の区別なく、文字列をスペースで分割して配列としたい。
失礼します。
explode()
で半角スペースを区切り文字として入力された文字列を配列に格納しようと思っています。
入力された文字列:「り す」
配列:([0]り[1]す)
上のような状態に持って行きたいです。
伝わっているでしょうか?
explode()
を使用している部分のコードはこちらです。
//三項演算子で検索文字列の有無を判定し処理
$data = isset($_POST['data']) ? trim($_POST['data']) : '';
//OR検索
$query = 'SELECT * FROM goods WHERE '; //クエリ前半
$sql ="";
if($data){
$count = 1; //カウントを1にしておく
//全角スペースはmb_convert_kana()関数で半角スペースに変換
$datalist = mb_convert_kana($data, 's');
//print $datalist.'<br />';
//複数キーワードでの検索
//if(stristr($datalist," ")){
//検索ワードをスペースで分割して配列に格納
$keyword = explode(" ",$datalist);
コメントアウトの部分は確認用だったり必要か不要かが個人的に曖昧なものを残してあるだけなので無視してくださって構わないかと思います。
現在の状態では、「り す」と入力すると配列の中身は([0]り す)となってしまいます。
なお、文字コードセットはUTF8の状態でファイルを保存してあります。
MySQL が UTF8 で文字化けしてしまうということもあるので、これも原因なのではと思っていますが解決法が見つかりません。
どこが間違っているでしょうか?
よろしくお願いします。
念の為に全コードを載せておきます。
<?php
// HTTPヘッダーで文字コードを指定
header("Content-Type:text/html; charset=UTF-8");
?>
<?php
//session_start();
//h()関数の読み込み
require_once 'lib/h.php';
//checkinput()関数の読み込み
require_once 'lib/checkinput.php';
//POSTされたデータのチェック
$_POST = checkinput($_POST);
//三項演算子で検索文字列の有無を判定し処理
$data = isset($_POST['data']) ? trim($_POST['data']) : '';
//OR検索
$query = 'SELECT * FROM goods WHERE '; //クエリ前半
$sql ="";
if($data){
$count = 1; //カウントを1にしておく
//全角スペースはmb_convert_kana()関数で半角スペースに変換
$datalist = mb_convert_kana($data, 's');
//print $datalist.'<br />';
//複数キーワードでの検索
//if(stristr($datalist," ")){
//検索ワードをスペースで分割して配列に格納
$keyword = explode(" ",$datalist);
//print_r ($keyword);
//配列の数を数える
$count = count($keyword);
//空スペースで区切られた数によってSQL文を組み立てる
for($i=0; $i<$count; $i++){//配列の数だけ繰り返す
if($i!="0"){
$sql = $sql." OR";
}
$sql = $sql." name LIKE :keyword ";
}
//}
}else{
$count = 0;
}
//SQL文準備
$query = $query.$sql;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<meta http-equiv="content-script-type" content="text/javascript" />
<meta http-equiv="content-style-type" content="text/css" />
<!-- StyleSheet記述
<link rel="stylesheet" href="./css/main.css" type="text/css" media="all" />
StyleSheet記述 -->
<!-- PAGE TITLE -->
<title>ページタイトル</title>
</head>
<body>
<?php
if(!empty($datalist)){
try{
$username = "root";
$password = "root";
$pdo = new PDO(
'mysql:host=localhost;dbname=shop',
$username,
$password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
//プリペアドステートメントのエミュレーションを無効にする
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
//エラーが発生した場合、例外がスローされるようにする
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//検索結果
if($datalist <> ""){//検索窓が空なら検索しない
//単ワードでの検索時
if($count == 1){
$datalist2 = '%'.$datalist.'%'; //検索文字列を%検索文字%とする
$stmt = $pdo->prepare("SELECT * FROM goods WHERE name LIKE :datalist");
$stmt->bindParam(':datalist',$datalist2,PDO::PARAM_STR);
$stmt->execute(
);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
}//OR検索時
elseif($count > 1){
$stmt = $pdo->prepare($query);
for($i=0; $i<$count; $i++){ //検索ワードの数だけ繰り返す
$keyword2[$i] = '%'.$keyword.'%'; //検索ワード1つ1つを%検索文字%にする
$holder = ':keyword'.$i; //ホルダー用
$stmt->bindParam(':holder',$keyword2[$i],PDO::PARAM_STR);
}
$stmt->execute(
);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
if(count($result) == 0){
print '<p>「'.h($data).'」はデータベースに登録がありません</p>';
}else{
print '<p>「'.h($data).'」はデータベースに登録がありました</p>';
?>
<p>検索結果</p>
<table>
<tr>
<th>商品名</th>
<th>価格</th>
</tr>
<?php
foreach ($result as $row){
?>
<tr>
<td><?php print h($row['name']) ?></td>
<td><?php print h($row['price']) ?></td>
</tr>
<?php
}
print '</table>';
}
//接続でいない場合、PDOException例外がスローされるのでキャッチする
}catch(PDOException $e){
print 'エラーが発生しました。。 内容:' . h($e->getMessage());
}
}
?>
<p>検索したい文字列を入力</p>
<form action="list_s.php" method="POST" >
<input type="search" name ="data">
<input type="submit" value="検索">
</form>
</body>
</html>