質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

17817閲覧

explode()を使用して半角スペースを区切り文字として配列に分割して文字列を格納したいが分割ができない

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/01/08 09:57

失礼します。

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

入力された文字列:「り す」
配列:([0]り[1]す)

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

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

lang

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

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

lang

1$keyword = explode(" ",$datalist);

ここの部分ですね。

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

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

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

lang

1<?php 2// HTTPヘッダーで文字コードを指定 3header("Content-Type:text/html; charset=UTF-8"); 4?> 5<?php 6 7//session_start(); 8 9//h()関数の読み込み 10require_once 'lib/h.php'; 11//checkinput()関数の読み込み 12require_once 'lib/checkinput.php'; 13 14//POSTされたデータのチェック 15$_POST = checkinput($_POST); 16 17//三項演算子で検索文字列の有無を判定し処理 18$data = isset($_POST['data']) ? trim($_POST['data']) : ''; 19//OR検索 20$query = 'SELECT * FROM goods WHERE '; //クエリ前半 21$sql =""; 22if($data){ 23 $count = 1; //カウントを1にしておく 24 $data = trim($data); //検索文字列の前後の空スペースだけを除去 25 //全角スペースはmb_convert_kana()関数で半角スペースに変換 26 $datalist = mb_convert_kana($data, 's'); 27 //print $datalist.'<br />'; 28 //複数キーワードでの検索 29 //if(stristr($datalist," ")){ 30 //検索ワードをスペースで分割して配列に格納 31 $keyword = explode(" ",$datalist); 32 //print_r ($keyword); 33 //配列の数を数える 34 $count = count($keyword); 35 //空スペースで区切られた数によってSQL文を組み立てる 36 for($i=0; $i<$count; $i++){//配列の数だけ繰り返す 37 if($i!="0"){ 38 $sql = $sql." OR"; 39 } 40 $sql = $sql." name LIKE :keyword "; 41 } 42 //} 43}else{ 44 $count = 0; 45} 46//SQL文準備 47$query = $query.$sql; 48?> 49<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 50 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 51<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> 52<head> 53<meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 54<meta http-equiv="content-script-type" content="text/javascript" /> 55<meta http-equiv="content-style-type" content="text/css" /> 56<!-- StyleSheet記述 57<link rel="stylesheet" href="./css/main.css" type="text/css" media="all" /> 58StyleSheet記述 --> 59<!-- PAGE TITLE --> 60<title>ページタイトル</title> 61</head> 62<body> 63<?php 64if(!empty($datalist)){ 65 66 try{ 67 $username = "root"; 68 $password = "root"; 69 $pdo = new PDO( 70 'mysql:host=localhost;dbname=shop', 71 $username, 72 $password, 73 array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 74 75 //プリペアドステートメントのエミュレーションを無効にする 76 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 77 //エラーが発生した場合、例外がスローされるようにする 78 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 79 80 //検索結果 81 if($datalist <> ""){//検索窓が空なら検索しない 82 //単ワードでの検索時 83 if($count == 1){ 84 $datalist2 = '%'.$datalist.'%'; //検索文字列を%検索文字%とする 85 $stmt = $pdo->prepare("SELECT * FROM goods WHERE name LIKE :datalist"); 86 $stmt->bindParam(':datalist',$datalist2,PDO::PARAM_STR); 87 $stmt->execute( 88 ); 89 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 90 91 }//OR検索時 92 elseif($count > 1){ 93 $stmt = $pdo->prepare($query); 94 for($i=0; $i<$count; $i++){ //検索ワードの数だけ繰り返す 95 $keyword2[$i] = '%'.$keyword.'%'; //検索ワード1つ1つを%検索文字%にする 96 $holder = ':keyword'.$i; //ホルダー用 97 $stmt->bindParam(':holder',$keyword2[$i],PDO::PARAM_STR); 98 } 99 $stmt->execute( 100 ); 101 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 102 } 103 } 104 105 106 if(count($result) == 0){ 107 print '<p>「'.h($data).'」はデータベースに登録がありません</p>'; 108 }else{ 109 print '<p>「'.h($data).'」はデータベースに登録がありました</p>'; 110?> 111 <p>検索結果</p> 112 <table> 113 <tr> 114 <th>商品名</th> 115 <th>価格</th> 116 </tr> 117 118<?php 119 120 foreach ($result as $row){ 121?> 122 <tr> 123 <td><?php print h($row['name']) ?></td> 124 <td><?php print h($row['price']) ?></td> 125 </tr> 126<?php 127 } 128 print '</table>'; 129 } 130 131//接続でいない場合、PDOException例外がスローされるのでキャッチする 132 }catch(PDOException $e){ 133 print 'エラーが発生しました。。 内容:' . h($e->getMessage()); 134 } 135} 136?> 137<p>検索したい文字列を入力</p> 138<form action="list_s.php" method="POST" > 139<input type="search" name ="data"> 140<input type="submit" value="検索"> 141</form> 142</body> 143</html> 144

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

http://www.sitespiral.jp/archives/83.html

同じような壁にぶち当たり調べていたところ上記のサイトの対処で解決しました。
explode内の" "はbin2hex関数で「20」、切り出ししたい元の文字列には「20」がなく「C2A0」があったため分割が出来なかったようです。

str_replaceで置換した後、無事に分割できました。


str_replace( "\xc2\xa0", " ", $description );

投稿2015/05/24 10:13

編集2015/06/06 11:29
cocacola5959

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

$keyword = explode(" ",$datalist);

" "この部分の全角スペース/半角スペースを、もう一度確認してみてはどうでしょう。

投稿2015/01/08 10:00

SAMURAI-HACK

総合スコア988

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/01/08 10:21

試しに全角スペースにしてみたらエラーになりました。
guest

0

この質問に関する新たな質問をするために、未だ解決していませんがここで一度回答をまとめさせていただきます。

まずphp.iniの文字エンコードの設定ですがutf8となっています。

lang

1$keyword = explode(" ",$datalist);

このコードについては半角になっています。
ちなみに全角スペースにして実行してみたところ、エラーになりました。

現在最も有力なものとして、mysqlの文字コードの問題が挙げられます。
utf8の設定ができないことが問題なのではないかと思っているので、次の質問で詳しく記述します。
回答をくださった皆様ありがとうございました。

投稿2015/01/13 03:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2015/01/13 13:02

explodeはmysqlを呼び出す前の話なのでmysqlは関係ないです。
guest

0

文字エンコーディングの整合性がとれていないので、$datalist = mb_convert_kana($data, 's'); が失敗しているのでしょう。

php.iniで文字エンコーディングをどう設定しているのか?
入ってくる文字エンコーディングは何か?
のあたりをチェックしてください。これが合ってないはずです。

投稿2015/01/08 13:06

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/01/13 02:47

utf8と設定されています。
otn

2015/01/13 13:05

php.iniはutf8として、入ってくるデータの文字コードは何なのですか?それがutf8じゃないのでmb_convert_kanaが失敗しています。文字コードを合わせましょう。
退会済みユーザー

退会済みユーザー

2015/01/13 23:41

入ってくるデータの文字コードはどこで確認できますか? mysql以外のどこを見てもUTF8で設定されています。
guest

0

動作を確認するために簡単なプログラムを組んでみたところ私の環境では動作しました。

lang

1<?php 2mb_internal_encoding("UTF8"); 3 4function keywordSplit($data) 5{ 6 $data = mb_convert_kana($data, 's'); 7 return explode(" ", $data); 8} 9 10// 半角スペース 11var_dump(keywordSplit("り す")); 12// 全角スペース 13var_dump(keywordSplit("り す")); 14 15/* 16結果 17array(2) { 18 [0]=> 19 string(3) "り" 20 [1]=> 21 string(3) "す" 22} 23array(2) { 24 [0]=> 25 string(3) "り" 26 [1]=> 27 string(3) "す" 28} 29*/

文字コードや、タイピングミスっぽい気がします。

投稿2015/01/08 10:33

pikonori

総合スコア82

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/01/08 10:37

mysqlと連動しているのですが、mysqlの方でUTF8を指定すると文字化けをします。(なのでSJISで指定しています。) 一方コード上ではUTF8を指定しています。 原因はここでしょうか?
pikonori

2015/01/08 10:45

文字コードは統一しないと、色々と不具合が発生すると思います。 mysqlがUTF8で指定すると文字化けするというのは、もしかしたらファイルをShiftJISなどで保存していないでしょうか? その辺りを再度確認したほうが良いかもしれません。
退会済みユーザー

退会済みユーザー

2015/01/08 11:41

文字コードセットがUTF-8の状態になっていることを確認しファイルを保存して試しましたが変わりません。(SJISってShiftJISのことだったんですね…) 文字コード関連だと、HTTPヘッダーでUTF8を指定しているのですが場所が悪いのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問