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

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

ただいまの
回答率

88.36%

アンケートフォームの回答内容をcsvで出力する部分でつまづいています

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,594

MH00214

score 51

PHP初心者です。

いま練習としてPHPでアンケートフォームを作っています。

アンケート項目を入力して、それを表示することは出来たのですが、アンケート項目をcsvファイルに出力するところでつまずいています。

返ってくるエラーは
Array to string conversion in /Applications/XAMPP/xamppfiles/htdocs/php1226/confirm_enq.php on line 80
(line 80というのはfputcsv($handle,$vararray);を指しています。

要するに、配列を文字列に変換できていない(なので読み込めません)ということなのだと思ったのですが、それを文字列に変換し、なおかつ複数選択できるチェックボックスのvalueの値をcsvでカンマ区切りにする(例:スポーツ観戦,カフェ巡り)ようにするためにはどうしたらよいのでしょうか?

初心者なので、ネットで色々調べてもよくわからず…。

csvファイルへの書き出し状況

下記、ソースコードになります。
※次のページでセッションを利用して表示をしたいので、$_POST['name']の部分は$_SESSION['name'] = $_POST['name'];として変数を使っています。

<?php

session_start();

//変数設定
if(isset($_POST['my_id'])){
    $_SESSION['my_id'] = $_POST['my_id'];
}

if(isset($_POST['number'])){
    $_SESSION['number'] = $_POST['number'];
}

if(isset($_POST['mail'])){
    $_SESSION['mail'] = $_POST['mail'];
}

if(isset($_POST['gender'])){
    $_SESSION['gender'] = $_POST['gender'];
}

if(isset($_POST['hobby'])){
    $_SESSION['hobby'] = $_POST['hobby'];
}

if(isset($_POST['lastyear'])){
    $_SESSION['lastyear'] = $_POST['lastyear'];
}

if(isset($_POST['thisyear'])){
    $_SESSION['thisyear'] = $_POST['thisyear'];
}

//POST→SESSIONとなった情報を取得
$myid = $_SESSION['my_id'];
$number = $_SESSION['number'];
$mail = $_SESSION['mail'];
$gender = $_SESSION['gender'];
if(empty($_SESSION['hobby'])){
    $csvhobby = 'なし';
}else{
    $csvhobby = $_SESSION['hobby'];
}
$lastyear = $_SESSION['lastyear'];
$thisyear = $_SESSION['thisyear'];

//csvファイルにして書き込む
$title = ['名前','出席番号','メールアドレス','性別','趣味','去年の一番の思い出','今年の抱負'];
$vararray = [$myid,$number,$mail,$gender,$csvhobby,$lastyear,$thisyear];
//文字列をUTF-8から変換
mb_convert_variables('SJIS-win', 'UTF-8', $title);
mb_convert_variables('SJIS-win', 'UTF-8', $vararray);
//ファイルへ書き込み実行
$handle = fopen('data/data.csv','a');
flock($handle,LOCK_EX);
fputcsv($handle,$title);
fputcsv($handle,$vararray);
//↑ここでエラー
flock($handle,LOCK_UN);
fclose($handle);

?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>アンケート内容確認ページ</title>
    <link rel="stylesheet" href="./css/style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
</head>
<body>
    <div class="confirm_message">
        <p>内容はこれで良いですか?</p>
    </div>
    <div class="enq_answer">
        <!-- 名前 -->
        <p class="ans-one"><?php echo htmlspecialchars($_SESSION['my_id']);?></p>
        <!-- 出席番号 -->
        <p class="ans-two"><?php echo htmlspecialchars($_SESSION['number']);?></p>
        <!-- メールアドレス -->
        <p class="ans-three"><?php echo htmlspecialchars($_SESSION['mail']);?></p>
        <!-- 性別 -->
        <p class="ans-four"><?php echo htmlspecialchars($_SESSION['gender']);?></p>
        <!-- 趣味 -->
        <p class="ans-five"><?php foreach ($_SESSION['hobby'] as $hobby) {
            echo htmlspecialchars($hobby,ENT_QUOTES).'<br>';
        }?></p>
        <!-- 去年の思い出 -->
        <p class="ans-six"><?php echo htmlspecialchars($_SESSION['lastyear']);?></p>
        <!-- 今年の抱負 -->
        <p class="ans-seven"><?php echo htmlspecialchars($_SESSION['thisyear']);?></p>
    </div>

    <p><a href="input_finish.php">アンケートを送信する</a></p>
</body>
</html>

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

fputcsvに渡す配列の要素に配列が混じっているときのエラーです。$csvhobby = $_SESSION['hobby']; のところで、$_SESSION['hobby']は配列なのにそのまま入れているのが原因です。適当な文字列に変換してあげる必要があります。

確認画面でやってるようにforeachを使ってもいいし、implode関数を使うなどしても良いでしょう。例えばカンマ区切りならこんな感じ。

$csvhobby = implode(',', $_SESSION['hobby']);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/04 16:28

    早速のご指摘ありがとうございます!
    無事に問題なく動きました!
    次はcsvの読み込みにもチャレンジしてみます。助かりました〜!

    キャンセル

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

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

関連した質問

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