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

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

ただいまの
回答率

88.22%

DBのカラムにcheckboxの値をすべて表示させたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 607
退会済みユーザー

退会済みユーザー

前提・実現したいこと

タイトルの通り、phpMyAdminのダッシュボードにフォームのデータ(checkboxの値)を反映させたいのです。
一つのカラムに、checkboxのチェックされた値全てが入るようにしたいと考えています。

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

checkboxの値が入るはずのカラムには「Array」だけが表示され、値が上手く反映されません。

該当のソースコード

【index.php】
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>問い合わせフォーム|入力画面</title>
</head>

<body>
<div class="form">
    <h2>問い合わせフォーム</h2>
    <form method="post" action="confirm.php">
        <dl>
            <dt>お名前</dt>
            <dd><input type="text" name="name" size="35" required></dd>
            <dt>メールアドレス</dt>
            <dd><input type="email" name="email" size="35" required></dd>
            <dt>必要なサービスはありますか?</dt>
            <dd>
                <input type="checkbox" name="service[]" value="A" id="A"><label for="A">サービスA</label><br>
                <input type="checkbox" name="service[]" value="B" id="B"><label for=""B>サービスB</label><br>
                <input type="checkbox" name="service[]" value="C" id="C"><label for="C">サービスC</label><br>
                <input type="checkbox" name="service[]" value="D" id="D"><label for="D">サービスD</label>
            </dd>
        </dl>
        <p><input type="submit" value="確認画面" class="submit"></input></p>
    </form>
</div><!--/.form-->
</body>
</html>
【confirm.php】
<?php
if( !(isset($_POST['name'])) || !(isset($_POST['email'])) ){
     header('Location:input.php');
       exit;
}

$name = htmlspecialchars($_POST['name'],ENT_QUOTES);
$email = htmlspecialchars($_POST['email'],ENT_QUOTES);
$service = $_POST ['service'];

session_start();

$_SESSION['name'] = $name;
$_SESSION['email'] = $email;
$_SESSION['service'] = $service;

?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>問い合わせフォーム|確認画面</title>
</head>

<body>
    <div class="form">
        <h2>問い合わせフォーム</h2>
    <form method="post" action="submit.php">
    <dl>
        <dt>お名前</dt>
        <dd>
            <?php
            echo $name;
            ?>
        </dd>
        <dt>メールアドレス</dt>
        <dd>
            <?php
            echo $email;
            ?>
        </dd>
        <dt>必要なサービスはありますか?</dt>
        <dd>
            <?php                
            if (isset($_POST["service"])) {
            foreach($_POST['service'] as $value){
            echo $value.' ';
            }
            }else {
                echo 'なし';
            }
            ?>
        </dd>
    </dl>
    <p><input type="button" value="入力画面に戻る" onclick="history.back();">
    <input type="submit" value="送信"></p>
        </form>
</div><!--/.form-->
</body>
</html>
【submit.php】
<?php

session_start();

$name = $_SESSION['name'];
$email = $_SESSION['email'];
$service = $_SESSION['service'];

?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>問い合わせフォーム|完了画面</title>
</head>

<body id="submit">
    <div class="form">
        <h2>問い合わせフォーム</h2>
        <h3>送信完了</h3>
        <p>お問い合わせありがとうございました。</p>
    </div><!--/.form-->

 <?php

  $user = 'root';
  $pass = '';

 $dsn = 'mysql:host=localhost;dbname=my-db;charset=utf8';
 $conn = new PDO($dsn, $user, $pass); 

 $sql = 'INSERT INTO customer (name, email, service) VALUES("'.$name.'","'.$email.'","'.$service.'")';
 VALUES("'.$name.'","'.$email.'","'.$service.'")';
 $stmt = $conn -> prepare($sql);
 $stmt -> execute();

session_destroy();    
?>    
</body>
</html>

試したこと

ここにも似たような質問があったため確認しましたが、解決できませんでした。
confirm.phpでは「foreach($_POST['service'] as $value」と記し、ここまでは選択したサービスがきちんと表示されます。
submit.phpでは、「$service」としか記載がないため、Arrayとなって表示されてしまうのではないかと感じています。
しかし、インサートする際にどのように記載すればカラムに全て反映されるかが分かりません。

初歩的な問題化と思われますが、お力添えいただけると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/06/02 14:21

    コードはマークダウンのcode機能を利用してご提示ください

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/06/03 12:06

    ご指摘いただき、ありがとうございます。
    code機能を利用して書き直しました。

    キャンセル

回答 1

checkベストアンサー

+1

カラム定義次第ですが、下記のどちらかでしょうか。

  1. implodeでセパレータつけて結合する
    →取得する際に同じセパレータでexplodeする
  2. json_encodeする
    →取得する際にjson_decodeする

また、
カラム自体を配列型にするとか
別途serviceだけを保存するテーブルを別途持っておいて親id(customerテーブルのid)を一緒に保管、選択肢ひとつに対して1レコード作るやり方もありますが、そこはやりやすいように。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/03 13:43

    解決されたようで何よりです。
    回答で提示したように幾つかやり方があるので、そこは要件にあわせて柔軟に対応してください。
    いずれもできるようになっておくといざというときに使える引き出しが多くなります。

    キャンセル

  • 2019/06/11 17:32

    再びすみません。
    以前、submit.phpに

    if (isset($_POST["service"])) {
    $service = implode(',', $service);
    }

    と記述し、$serviceに値が入っていた場合はカラムにコンマで区切られて表示されるようになったのですが、
    その後メール送信などの記述をしていたら、以前は正常にカラムに入っていたはずの値が再びArrayとしか表示されなくなってしまいました。
    上記のif~におかしな点はありますでしょうか。

    また、if(isset($_POST["service"])){}を外して
    $service = implode(',', $service);
    のみですと、チェックボックスが空の場合に
    Warning: implode(): Invalid arguments passed
    とエラーが出てしまいます。

    キャンセル

  • 2019/06/11 18:29

    if (isset($service)) {
    $service = implode(',', $service);
    }
    とすることで解決しました。

    キャンセル

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

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

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