4481


失礼します。

`explode()` で半角スペースを区切り文字として入力された文字列を配列に格納しようと思っています。

入力された文字列：「り す」  
配列：(［0］り［1］す)

上のような状態に持って行きたいです。  
伝わっているでしょうか？

`explode()` を使用している部分のコードはこちらです。

[code]

    //三項演算子で検索文字列の有無を判定し処理
    $data = isset($_POST['data']) ? trim($_POST['data']) : '';
    //OR検索
    $query = 'SELECT * FROM goods WHERE ';  //クエリ前半
    $sql ="";
    if($data){
        $count = 1; //カウントを１にしておく
        //全角スペースはmb_convert_kana()関数で半角スペースに変換
        $datalist = mb_convert_kana($data, 's');
        //print $datalist.'<br />';
        //複数キーワードでの検索
        //if(stristr($datalist," ")){
            //検索ワードをスペースで分割して配列に格納
            $keyword = explode(" ",$datalist);
    
[/code]

コメントアウトの部分は確認用だったり必要か不要かが個人的に曖昧なものを残してあるだけなので無視してくださって構わないかと思います。

現在の状態では、「り す」と入力すると配列の中身は([0]り す)となってしまいます。

なお、文字コードセットはUTF8の状態でファイルを保存してあります。  
MySQL が UTF8 で文字化けしてしまうということもあるので、これも原因なのではと思っていますが解決法が見つかりません。

どこが間違っているでしょうか？  
よろしくお願いします。

念の為に全コードを載せておきます。

[code]

    <?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; //カウントを１にしておく
        //全角スペースは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>
    
[/code]


CC BY-SA 3.0
2015-01-08T12:00:32.397
4296
2015-01-13T06:01:32.577
2015-01-09T03:42:40.380
4978
5985
question
php mysql
全角・半角の区別なく、文字列をスペースで分割して配列としたい。


回答のつもりではないです。要素の整理だけ。単純化しましょうよ。

たぶん、エンコードの問題と思いますが・・・  
とりあえず `var_dump()` でいちいち変数をダンプしていくことかな・・・

str_split.php:

[code]

    <?php
    header("Content-Type:text/html; charset=UTF-8");
    // ---------------
    $data1 = 'あおげば　とおとし わがしの なんとか';
    $data2 = mb_convert_kana($data1, 's', 'UTF-8');
    $data3 = explode(" ", $data2);
    // ---------------
    echo '$data1: '; var_dump( $data1);
    echo '<br/>$data2: '; var_dump( $data2);
    echo '<br/>$data3: '; var_dump( $data3);
    ?>
    
[/code]

Output:

[code]

    $data1: string(53) "あおげば　とおとし わがしの なんとか" 
    $data2: string(51) "あおげば とおとし わがしの なんとか" 
    $data3: array(4) { 
            [0]=> string(12) "あおげば" 
            [1]=> string(12) "とおとし" 
            [2]=> string(12) "わがしの" 
            [3]=> string(12) "なんとか" 
    }
    
[/code]


CC BY-SA 3.0
2015-01-08T12:48:13.070
4298
2015-01-08T12:48:13.070
4978
4296
answer


まふゆさんのコードを実行してみても問題が再現しませんでしたので、想像での回答となります。  
おそらく、non-breaking space(`\xA0`)が入りこんでいるのではないかと考えました。

それを取り除くことで解決する方法を以下に提示いたします。

`mb_convert_kana` している箇所を下記のようにしてみてください。

[code]

    $delimiter = "\x20";
    $datalist = preg_replace('/[\x{a0}\x{3000}]/u', $delimiter, $data);
    
[/code]

また `explode` している箇所を下記のように変更してください。

[code]

    $keyword = explode($delimiter, $datalist);
    
[/code]

コードで解決するには以上のようになるかと思います。  
ただし、 `preg_replace` は重い関数なのでどうしても…という場合以外は避けた方がよいかもしれません。


CC BY-SA 3.0
2015-01-09T06:43:28.883
4326
2015-01-09T06:43:28.883
3160
4296
answer


今だ解決には至っていませんが、新しく質問を投げるためにここで今までの回答をまとめさせていただきます。

まずKID the Euforiaさんにご指摘頂いたとおりにコードを直したところ、エラーが発生してしまいました。

次にHiroshi Yamamotoさんにご指摘頂いたとおりにコードを書いたところ、問題なく動きました。

話し合いの末環境の方に問題がある可能性が高いとのことでしたので、別に質問を投げさせていただきたいと思います。  
回答を下さった皆様ありがとうございました。


CC BY-SA 3.0
2015-01-13T06:01:32.577
4481
2015-01-13T06:01:32.577
5985
4296
answer