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

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

ただいまの
回答率

90.83%

  • PHP

    18663questions

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

  • HTML

    8067questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • MySQL

    5364questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

foreachでDB内データを呼び出したとき、配列が文字列で保存されてしまう

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 153

ASU

score 15

 前提・実現したいこと

PHPで簡単な会員登録、登録情報の編集フォームを作成しています。
編集画面では、DBに格納したデータを呼び出し、UPDATEしています。

![イメージ説明

5つのチェックボックスのチェック有無は 0_1_2_3_4 という形で保存しています。
※1つ目と3つめをチェックなら→ 0_2 というデータを格納

編集のときDBから、trafficというkey内の、配列(0_2)呼び出しますが、
foreachしたあと文字列(Array)になってしまいますが、配列のまま上書きしたいです。

どこがおかしいのか判っていないため、アドバイスいただければ幸いです。

 発生している問題・エラーメッセージ

trafficの値が、配列から文字列になってしまう

http://localhost/phpmyadmin/の画面
イメージ説明

DBに格納しているKeyと値
Key : traffic
value : 0_1_2_3_4

UPDATE時に格納されるデータ
Key : traffic
value : Array

var_dump($dataArr)した結果

ray(18) { 
["family_name"]=> string(6) "捕鯨" ["first_name"]=> string(6) "太郎" 
["family_name_kana"]=> string(6) "ほげ" ["first_name_kana"]=> string(12) "たろう" 
["sex"]=> string(1) "1" 
["year"]=> string(4) "1948" ["month"]=> string(2) "08" ["day"]=> string(2) "01" 
["zip1"]=> string(3) "110" ["zip2"]=> string(4) "0003" 
["address"]=> string(24) "東京都台東区根岸" ["email"]=> string(14) "hoge@gmail.com" 
["tel1"]=> string(3) "090" ["tel2"]=> string(4) "0000" ["tel3"]=> string(4) "1111" 
["traffic"]=> array(2) { [0]=> string(1) "0" [1]=> string(1) "2" } 
["contents"]=> string(0) "" ["mem_id"]=> string(2) "14" }

var_dump($column)した結果

string(291) "family_name='捕鯨',first_name='太郎',
family_name_kana='ほげ',first_name_kana='たろう',
sex='1',year='1982',month='05',day='03',
zip1='110',zip2='0001',address='東京都台東区谷中',
email='hoge@gmail.com',tel1='090',tel2='0000',tel3='1111',
traffic='Array',contents='',mem_id='16',"

 該当のソースコード

case 'update_complete'://編集からの登録

  unset($_POST['update_complete']);
  $dataArr = $_POST; //この時点ではtraffic内のvalueが配列になっている

  $column = '';

  foreach ($dataArr as $key => $value) {
    $column .= $key . '=' . "'" . $value . "'" . ',';

  }

  //traffic内のvalueが配列→文字列になっている

  $query = " UPDATE member SET "
    . $column
    . " update_date=11"
    . " WHERE "
    . " mem_id = "
    . $dataArr['mem_id'];

  $res = $db->execute($query); //SQL実行
  $db->close(); //DB Close

  var_dump($dataArr);
  var_dump($column);

 補足情報(FW/ツールのバージョンなど)

XAMMPローカル環境
MySQL

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+5

こういうコードを見ていると、POST送信するデータに細工されたらデータベースを破壊されそうだなって思っちゃって、なかなか本筋の問題に目が向かなくなっちゃうところですが。
フォーム送信されたデータを適切に検証してから保持するべきです。

たぶん、ラクするために配列に$_POSTデータを全ツッコミしていることが良くないのだと思います。
チェックボックスのデータをどう受けているかを点検するべきです。

一見難しそうなfilter_input_array()を駆使したほうが、
その後の処理が質問者さんが想定する配列のイメージで扱いやすくなりそうに見えますね。

下記、他の方の回答からヒントを得て:

  foreach ($dataArr as $key => $value) {
    if (is_array($value)) {
      $column .= $key . '=' . "'" . implode('_', $value) . "'" . ',';
    } else {
      $column .= $key . '=' . "'" . $value . "'" . ',';
    }
  }


とかすれば、一応狙ったとおりになるんだろうか、うごかしてないので、なんとも。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 15:49

    初心者で不正対策まで念頭にありませんでした。勉強になります。

    キャンセル

+5

$_POST['traffic']が配列になっていてforeach内でシングルクォートでくくっているので文字列になってしまうのでは?
上手く説明できないのですが、以下のような感じでどうですか??

  // 0_1_2_3形式にする
  $_POST['traffic'] = implode('_', $_POST['traffic']);

  $column = '';

  foreach ($dataArr as $key => $value) {
    $column .= $key . '=' . "'" . $value . "'" . ',';

  }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 11:12 編集

    Array(型)だよ、って返しているのをシングルクォートをつけて文字列'Array'にしちゃっている、それだ!

    キャンセル

  • 2018/05/31 15:50

    指摘の点をまだ理解できていないため、こちらの方法で試してみます!

    キャンセル

+1

考え方がいくつかあるのですが手っ取り早く

  • チェックボックスの項目を利用してDBにデータを登録するなら「set型」を使う
  • 特に制限なくデータの羅列でいいなら文字列型でもよい
  • チェックボックスの項目が高い頻度で不特定に増減するなら別途正規化を行う

上記1番の例をあげておきます

create table tbl(
id int not null primary key auto_increment,
v1 set('A','B','C') not null,
v2 varchar(20) not null
);
insert into tbl(v1,v2) values('A','A'),('',''),('A,B','A,B'),('A,B,B','A,B,B'),('C,A,B','C,A,B');

上記、v1とv2の挙動の違いは以下

  • set型なら重複をゆるさない
  • set型なら投入順にかかわらずsetに登録順にデータが格納される

さらに、set型はデータ自体がビットで登録されているため
データ投入にbit和を利用できます

insert into tbl(v1,v2) values(1,1),(5,5);


※上記v1=1→「A」が登録される
v1=5→「A,C」が登録される

このデータからv1にAを含むレコードを取り出すためにはfind_in_set関数を利用します。

select * from tbl where find_in_set('A', v1);

実はfind_in_set関数は文字列型でも検索が可能です

select * from tbl where find_in_set('A', v2);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 15:47 編集

    指摘の点をまだ理解できていないため、こちらのSETでの方法も試してみます!

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18663questions

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

  • HTML

    8067questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • MySQL

    5364questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。