【先着1,000名様!】1,000円分をプレゼント!

やりたいことは、PHPでPOSTされた複数のデータを結合して、MySQLの一つのカラムに収めたいと思います。例えば、3つのフォームよりPOSTされてきたデータをカンマ区切りで結合して、それらをデータベースに登録し、読み込むときは、逆にカンマ区切りでexplode()で配列に分割したいと思います。

例えば、下記のように簡単なサンプルで表現していますが、POSTされてきた3つの変数データは英単語又は、フレーズが格納されており、ときどき、カンマを含むフレーズがある場合があります。この場合、カンマ区切りで結合することはできるのですが、分割したときに、英語フレーズに含まれるカンマでも分割されてしまいます。こういう場合、カンマのエスケープはどのようにやるのが適切でしょうか?

//$_POSTの中身
//$_POST['a'] = "Sunday";
//$_POST['b'] = "Monday";
//$_POST['c'] = "He is a teacher,isn't he?";

$text = $_POST['a'].",".$_POST['b'].",". $_POST['c'].","; //カンマで区切って結合

echo $text;
$text =explode(',',$text);  //カンマで分割
   print_r($text);

/*$textの出力結果 2と3に分割されてしまう。
array
(
[0] => Sunday
[1] => Monday
[2] => He is a teacher
[3] => isn't he?
[4] =>
)
*/

A 回答 (1件)

3つの方針が考えられます



(1) 「カンマ区切りをexplodeで」というのをやめて、別の書式を使う
・CSVで使われている「ダブルクオートで囲む」を使って
"Sunday","Monday","He is a teacher,isn't he?"
で保存→読み出したらCSV用ライブラリで分割
・元のデータに絶対に含まれない文字を区切りに使う。
http://php.net/manual/ja/function.serialize.php
http://php.net/manual/ja/function.json-encode.php


(2) データ中のカンマを別の文字列に変換→読み出し時に explode後に逆変換
http://php.net/manual/ja/function.urlencode.php


(3)そもそも「一つの列に納める」というテーブル設計自体を見直す
    • good
    • 1
この回答へのお礼

ありがとうござまいす。とても勉強になりました。

お礼日時:2018/01/02 09:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

Qダブルコーテーション(

str_replace関数にてダブルコーテーション(")を空白文字列に置換したいのですが、
どのような手法を取ればよろしいのでしょうか?

str_replace(""", "", $file);
ではないことは確認しているのですが。。
ご教授お願いします。

Aベストアンサー

rapid6さんこんにちは。


str_replace("\"", "", $file);

str_replace('"', "", $file);


今回のようにダブルクォーテーションの中でダブルクォーテーションを使おうとする場合は、
エスケープ文字(\)でエスケープしてやる必要があります。

シングルクォーテーションの中でシングルクォーテーションを使用する場合も同じようにエスケープする必要があります。

このあたりは エスケープ文字 などで検索すると詳しくわかると思います。

Q別ファイルのfunctionの読み込み方

こんにちは
外部ファイル hello.js
-----------------------------
function aisatsu(){
var aa="hello"
}
-----------------------------
というファイルが存在した時にjikkou.htmlでaaの値、”hello”を呼び込みたい場合はどう記述すればよいのでしょうか?htmlのなかでaisatsu()をどこに記述していいのか分かりません。どうか教えてください。ただ、hello.jsのほうは実際の記述を簡略化したものであるのでそちらのほうはいじれません。

宜しくお願いします。

必要ないかもしれませんが、念のために私が最初に書いたhtmlの文です(もちろん実行できませんでした)
------------------------------------
<html>
<script language="javascript" src="hello.js">
aisatsu(){
document.write(aa);
}
</script></html>
------------------------------------

こんにちは
外部ファイル hello.js
-----------------------------
function aisatsu(){
var aa="hello"
}
-----------------------------
というファイルが存在した時にjikkou.htmlでaaの値、”hello”を呼び込みたい場合はどう記述すればよいのでしょうか?htmlのなかでaisatsu()をどこに記述していいのか分かりません。どうか教えてください。ただ、hello.jsのほうは実際の記述を簡略化したものであるのでそちらのほうはいじれません。

宜しくお願いします。

必要ないかもしれませんが、念のために...続きを読む

Aベストアンサー

function内で「var」をつけて変数を宣言するとfunction外からその変数の内容を取得することができなくなります。(returnで参照することはできます。)
なので変数の内容を取得する場合は「hello.js」の内容を

function aisatsu(){
var aa="hello";
return aa;
}

このように修正し、

<script language="javascript" src="hello.js"></script>
<script language="javascript">
var data=aisatsu();//「aisatsu()」関数の「aa」変数内のデータを引っ張り出す(return aa;)
document.write(data);//書いたり
alert(data);//アラートしたり
window.status=data;//ステータスバーに表示したり・・
</script>

QonClickに複数の関数を挿入する方法

初心者なのですがアニメーションの関数anime1、anime2、anime3を作成し、onClickに下記のように設定しました。
クリックするとアニメーション2つの設定ではは動くのですが、3つ目を設定すると動かなくなります。
通常はこのような設定はしないものなのでしょうか?
教えてください。
よろしくお願いします。
<INPUT type="button" value="START" onClick="anime1(), anime2()">・・・OKです。
<INPUT type="button" value="START" onClick="anime1(), anime2(),anime3()">・・・動きません。

Aベストアンサー

セミコロンでつなぐのが常道ですが、3つ以上なら
別途function化したほうが、可読性が高くなると
思います。

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

QPHPでPDFファイルの直接印刷

HTML、PHP、JavascriptでWeb画面上から印刷枚数を指定し、Web画面上の「印刷」ボタンを押すと、直接、特定のファイルパスのPDFファイルを印刷できるようにしたいと思っています。
かなり検索したのですが、それを実現できるようなものが見当たりません。
どうかご教授ください。よろしくお願い致します。

Aベストアンサー

PXDocについて、
所詮はXMLなので、PHPで、SVGの記述にそったXMLを出力すればよいです。ブラウザ側には、pxd拡張子で投げるため、
PHPで、header指定のコードを記述する必要はありそうです。

header("Content-type: application/pxd");

PXDocのサイト(参考URL)にサンプルとリファレンスがあります。
.pdx という拡張子がありますが、単なるXMLファイル(テキストファイル)なので、メモ帳なり秀丸なりで開けば、ああなるほどとわかると思います。

複雑な帳票で、テンプレートを作り、部分的に動的な値を埋め込む場合は、テンプレートをExcelとかOpenOffice.orgで作ってSVG保存したものを使えばよいと思います。

※SVG(つまり実体はXML)はテキストファイルなので、
ユーザが内容を書き換えることが可能です。(書き換えようと思えばですが)

PDFのように、編集不可にする手段はないのでご注意ください。

参考URL:http://www.pxdoc.com/sample/index.htm

PXDocについて、
所詮はXMLなので、PHPで、SVGの記述にそったXMLを出力すればよいです。ブラウザ側には、pxd拡張子で投げるため、
PHPで、header指定のコードを記述する必要はありそうです。

header("Content-type: application/pxd");

PXDocのサイト(参考URL)にサンプルとリファレンスがあります。
.pdx という拡張子がありますが、単なるXMLファイル(テキストファイル)なので、メモ帳なり秀丸なりで開けば、ああなるほどとわかると思います。

複雑な帳票で、テンプレートを作り、部分的に動的な値...続きを読む

Q、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

質問させてください。

abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd

のような文字列があります。
これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。
取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。

preg_match('/"([.*])"/', $str, $matches);とやったり
preg_match('/\"([.*])\"/', $str, $matches);とやったり
preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、
どうしても$matchesにほしい結果は入っていません。

どのような正規表現で取得可能でしょうか?

何卒ご教授ください。

Aベストアンサー

preg_match('/"(.*?)"/', $str, $matches);
でよいのでは?

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

QPHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?

PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?
for文やwhile文ではbreakやcontinueなどが使えるようですが、if文にはないのでしょうか?

条件分岐がいくつかあって、その一つを途中で抜けて次の条件分岐へと移行したいのですが、
exitを使ってしまうと、次へ行かずに処理が中止されてしまいますし、
どのようにすればよいのか分からず困っています。何かよい方法はないでしょうか?

Aベストアンサー

例えば「goto 演算子」を使うとかですね。
http://php.net/manual/ja/control-structures.goto.php
(参考URL)

「if文を強制終了」というより「ステップの強制移動」と言った感じです。

ただ、あまりgoto演算子はお勧めできません。
複雑な処理になればなるほど、バグが発生した際にバグ元を発見し難くなります。

本来は細かく制御文を入れていけば、あまり必要ないと思いますが・・・

QjavascriptテキストBOX色を元に戻したい

f.txtbox.style.backgroundColor = 'red';

このようにしてチェックボックスをクリックすると、あるテキストボックスの背景色が変わるようにしたのですが、
変える前のデフォルトのテキストボックス背景色に戻す(デフォルトに戻す)にはどうすればいいですか?

#ffffffにする以外どうすればいいでしょうか?

Aベストアンサー

こんにちは。

検証してみました。

style.removeProperty('background-color')と
style.backgroundColor = '';

Firefox,Chromeのツール上では同じ結果です。

IEではstyle.removePropertyが動きませんがstyle.backgroundColor = '';で動きます。

jQuery等利用すればこの辺の差を吸収してくれると思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング