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

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

ただいまの
回答率

91.37%

  • PHP

    15181questions

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

  • MySQL

    4388questions

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

  • SQL

    1697questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHPのPDOで新規登録画面から登録すると配列だけMysqlに登録できません。

解決済

回答 2

投稿 2017/12/02 10:31 ・編集 2017/12/02 11:14

  • 評価
  • クリップ 1
  • VIEW 73

andrew57

score 68

PHPのPDOで新規登録画面から登録すると、趣味の配列だけMysqlに登録できません。

配列の趣味だけが、なぜ登録できないのでしょうか?

新規登録画面→確認画面→登録完了画面

該当してるエラーコード registrated.php 26行目

$statement->bindValue('hobby', $_SESSION["hobby"], PDO::PARAM_STR);

エラー内容

Notice: Array to string conversion in /var/www/html/public_html/registered.php on line 26 登録完了!

エラー画面
![イメージ説明](8c46484a13092cbaa7c8aad1200284c8.png)

Mysql
イメージ説明

・確認画面 confirm.php

<?php
// 開発時にこれを書かないのはNG
ini_set('display_errors', TRUE);
error_reporting(E_ALL);

session_start();

// 文字化けを治す
header("Content-type: text/html; charset=utf-8");

// 変数の定義(初期化)
$name = "";
$email = "";
$password = "";
$tel = "";
$prefectures = "";
$hobby = "";
$gender = "";
$contact = "";


$form_Content = array($name, $email, $password, $tel, $prefectures, $hobby, $gender, $contact);

// エラーメッセージの配列の初期化
$errorMsg = array();
// セッション変数の初期化
$_SESSION['errorMsg'] = array();


// XSS対策 サニタイズ(無毒化)
function h($string){

    if(is_array($string)){
        return array_map("h", $string);

    } else {

        return htmlspecialchars($string, ENT_QUOTES, "UTF-8");
    }
}

  // XSS対策 (hrefやsrcの値がURLか確認する)
  function urlCheck($form_Content) {
      if (!preg_match("/^(https?:.+)$/", $form_Content)) {
          return $errorMsg[] = "不正を検知しました。";
      } else {
          return true;
      }
  }



// POST時
if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') {


    $_SESSION["name"] = filter_input(INPUT_POST, 'name');
    $_SESSION["email"] = filter_input(INPUT_POST, 'email');
    $_SESSION["password"] = filter_input(INPUT_POST, 'password');
    $_SESSION["tel"] = filter_input(INPUT_POST, 'tel');
    $_SESSION["prefectures"] = filter_input(INPUT_POST, 'prefectures');
    $_SESSION["hobby"] = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
    $_SESSION["gender"] = filter_input(INPUT_POST, 'gender');
    $_SESSION["contact"] = filter_input(INPUT_POST, 'contact');

//
// 未入力チェック
//

// エラーメッセージの配列の初期化
$errorMsg = array();

// 名前の未入力チェック
if (empty($_SESSION["name"])) {
    $errorMsg[] = "名前を入力してください。";
}

// メールアドレスの未入力チェック
if (empty($_SESSION["email"])) {
    $errorMsg[] = "メールアドレスを入力してください。";
}

// パスワードの未入力チェック
if (empty($_SESSION["password"])) {
    $errorMsg[] = "パスワードを入力してください。";
}

// 電話番号の未入力チェック
if (empty($_SESSION["tel"])) {
    $errorMsg[] = "電話番号を入力してください。";
}

// 都道府県の未入力チェック
if ($_SESSION["prefectures"] == "選択") {
    $errorMsg[] = "都道府県を選択してください。";
}

  //
  // 文字数チェック
  //

  // 名前の文字数チェック
  if (strlen($_SESSION["name"]) >= 60) {
    $errorMsg[] = "氏名が長すぎます。";
  }

  // パスワード文字数チェック(8文字以上か)
  if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $_SESSION["password"])) {
      $errorMsg[] = "パスワードは8文字以上で入力してください。";
  }

  // 電話番号の文字数チェック(10文字 or 11文字)
  if (strlen($_SESSION["tel"]) >= 1 && strlen($_SESSION["tel"]) <= 9 && preg_match("/^[0-9]+$/", $_SESSION["tel"])) {
      $errorMsg[] = "電話番号は10文字か11文字で入力してください。";
  } elseif (strlen($_SESSION["tel"]) >= 12 && preg_match("/^[0-9]+$/", $_SESSION["tel"])) {
      $errorMsg[] = "電話番号は10文字か11文字で入力してください。";
  }

  //
  // 形式チェック
  //

  // メールアドレス形式チェック
  if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $_SESSION["email"]) && $_SESSION["email"] !== "") {
      $errorMsg[] = "メールアドレスに間違いがあります。";
  }

  // 電話番号の形式チェック
  if (preg_match("/[-]+/", $_SESSION["tel"])) {
      $errorMsg[] = "電話番号はハイフンなしで入力してください。";
  }

  //
  // 半角英数字チェック
  //

  // 電話番号の数字チェック
  if (!preg_match("/[0-9]/", $_SESSION["tel"]) && $_SESSION["tel"] !== "") {
    $errorMsg[] = "電話番号は半角数字で入力してください。";
  }


  // 電話番号の全角チェック Todo
  //if (strlen($tel) !== mb_strlen($tel, "UTF-8")) {
    //  $errorMsg[] = "電話番号に全角が含まれています。";
  //}


  if (count($errorMsg) >= 1) {
      $_SESSION['errorMsg'] = $errorMsg;
      foreach ($errorMsg as $error) {
          echo $error;
      }

      header("location: http://192.168.33.15/registration.php");
      exit;

  } else {
    echo "";
  }



}

 ?>

 <!DOCTYPE html>
 <html lang="ja">
 <head>
     <meta charset="utf-8">
     <title>確認フォーム</title>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen">
     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">

 </head>
 <body>


   <form class="form-horizontal" action="registered.php" method="post">
     <fieldset>

       <!-- Form Name -->
       <legend style=background-color:#65ace4;><h1 style=text-align:center;>確認フォーム</h1></legend>

       <ol class="breadcrumb">
           <li><a href="http://192.168.33.15"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li>
           <li><a href="http://192.168.33.15/registration.html">新規登録フォーム</a></li>
           <li class="active">確認フォーム</li>
         </ol>

    <div class="container">

       <div class="form-group">
           <label class="col-sm-5 control-label">氏名</label>
           <div class="col-sm-5">
               <p class="form-control-static"><?php echo h($_SESSION["name"]); ?></p>
           </div>
       </div>

       <div class="form-group">
           <label class="col-sm-5 control-label">メールアドレス</label>
           <div class="col-sm-5">
               <p class="form-control-static"><?php echo h($_SESSION["email"]); ?></p>
           </div>
       </div>

       <div class="form-group">
           <label class="col-sm-5 control-label">パスワード</label>
           <div class="col-sm-5">
               <p class="form-control-static"><?php echo h($_SESSION["password"]); ?></p>
           </div>
       </div>


    <div class="form-group">
      <label class="col-sm-5 control-label">電話番号</label>
      <div class="col-sm-5">
        <p class="form-control-static"><?php echo h($_SESSION["tel"]); ?></p>
      </div>
    </div>

    <div class="form-group">
      <label class="col-sm-5 control-label">都道府県</label>
      <div class="col-sm-5">
        <p class="form-control-static"><?php echo h($_SESSION["prefectures"]); ?></p>
      </div>
    </div>

    <div class="form-group">
      <label class="col-sm-5 control-label">趣味</label>
      <div class="col-sm-5">
          <p class="form-control-static"><?php

          if (isset($_SESSION["hobby"])) {
              foreach ($_SESSION["hobby"] as $value) {
                  echo h($value);
              }
              echo " ";
          }


          ?></p>
      </div>
    </div>

    <div class="form-group">
      <label class="col-sm-5 control-label">性別</label>
      <div class="col-sm-5">
          <p class="form-control-static"><?php echo h($_SESSION["gender"]); ?></p>
      </div>
    </div>

    <div class="form-group">
      <label class="col-sm-5 control-label">お問い合わせ</label>
      <div class="col-sm-5">
        <p class="form-control-static"><?php echo h($_SESSION["contact"]); ?></p>
      </div>
    </div>


    <div class="button-group">
      <div class="col-md-5 col-sm-offset-5 col-sm-7 col-xs-offset-4 col-xs-8">
        <a href="http://192.168.33.15/registration.php"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a>
        <button type="submit" class="btn btn-primary">送信する</button>
        <p class="help-block" style=margin-top:15px;>以上の内容でよろしければ、送信ボタンを押してください。</p>
      </div>
    </div>





</div>
      </fieldset>
   </form>



   <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
   <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
   </body>
   </html>

・登録完了画面 registered.php

<?php
// 開発時にこれを書かないのはNG
ini_set('display_errors', TRUE);
error_reporting(E_ALL);

session_start();

header("Content-type: text/html; charset=utf-8");

require_once(__DIR__. '/db.php');


try {

  $dbh = new PDO($dsn, $user, $password);
  $statement = $dbh->prepare("INSERT INTO users (name, email, password, tel, prefectures, hobby, gender, contact, creation_time) VALUES (:name, :email, :password, :tel, :prefectures, :hobby, :gender, :contact, creation_time)");

  if ($statement) {

    // プレースホルダへ実際の値を設定する
    $statement->bindValue(':name', $_SESSION["name"], PDO::PARAM_STR);
    $statement->bindValue(':email', $_SESSION["email"], PDO::PARAM_STR);
    $statement->bindValue(':password', $_SESSION["password"], PDO::PARAM_STR);
    $statement->bindValue(':tel', $_SESSION["tel"], PDO::PARAM_INT);
    $statement->bindValue('prefectures', $_SESSION["prefectures"], PDO::PARAM_STR);
    $statement->bindValue('hobby', $_SESSION["hobby"], PDO::PARAM_STR);
    $statement->bindValue('gender', $_SESSION["gender"], PDO::PARAM_STR);
    $statement->bindValue('contact', $_SESSION["contact"], PDO::PARAM_STR);

    // 実行する
    if (!$statement->execute()) {
      $errors['error'] = "登録失敗しました。 ";
    }

    //データベース切断
    $dbh = null;


  }


} catch (PDOException $e) {
    print('Error:'.$e->getMessage());
        $errors['error'] = "データベース接続失敗しました。";
}



 ?>


 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>登録完了</title>
   </head>
   <body>

登録完了!



<a href="http://192.168.33.15"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a>



   </body>
 </html>

結果
イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+3

そもそも論ですが、RDBMSであれば、配列をそのまま入れるというのは処理しづらい原因となります。

正規化といって、「配列を入れるテーブルを別に用意して、親のテーブルとIDで紐付ける」というのが本来取るべき手段です。

「ただ格納して取得できればいい」のであれば配列を文字列化した形でもそんなに困りませんが、検索などデータベースの機能性を活かそうとした場合には、とたんに不便になります。

投稿 2017/12/02 13:29

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+1

PHPの配列やオブジェクトはそのPHPの中だけでしか使えず、MySQL等に直接登録することは出来ません。

ではどうするかというと、一度文字列に変換してから他システムに渡して、使用するときは同じルールで逆変換します。

MySQLの文字列として登録する場合は
serialize

json_encode
といった関数を使用して文字列に変換(エンコード)して、
使用する場合は文字列として取り出した後に
unserialize

json_decode
でデコードしてPHPの配列やオブジェクトとして使えるようにします。

投稿 2017/12/02 10:43

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/02 11:16

    実際に行ってみました.

    質問欄の一番下に画像を貼りましたが
    このような結果で大丈夫ですか?

    ちゃんと日本語だけにならないとおかしいですか?

    キャンセル

  • 2017/12/02 11:26

    元々文字列で表せないものを文字列に変換するのでそのまま日本語にならない事自体は正しいです。
    ただ、一連の処理が正しいかどうかは別問題なので、
    データを取得して使用する時に正しくデコードできるかどうかで一連の処理が正しいかどうか判断してください。

    json_encode() json_decode()はmysqlと関係なく、例えば一時的にテキストファイルに配列を保存するような場合でも使えるので、簡単なサンプルを作ってみて動作イメージを把握してみることをお勧めします。

    キャンセル

  • 2017/12/04 10:02

    ありがとうござうます!

    実際に、行ってみたいと思います。

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

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

  • PHP

    15181questions

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

  • MySQL

    4388questions

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

  • SQL

    1697questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。