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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

SQL

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

PHP

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

Q&A

解決済

2回答

501閲覧

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

dog57

総合スコア131

MySQL

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

SQL

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

PHP

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

0グッド

1クリップ

投稿2017/12/02 01:31

編集2017/12/02 02:14

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

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

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

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

php

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

エラー内容

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

エラー画面
イメージ説明

Mysql
イメージ説明

・確認画面 confirm.php

php

1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', TRUE); 4error_reporting(E_ALL); 5 6session_start(); 7 8// 文字化けを治す 9header("Content-type: text/html; charset=utf-8"); 10 11// 変数の定義(初期化) 12$name = ""; 13$email = ""; 14$password = ""; 15$tel = ""; 16$prefectures = ""; 17$hobby = ""; 18$gender = ""; 19$contact = ""; 20 21 22$form_Content = array($name, $email, $password, $tel, $prefectures, $hobby, $gender, $contact); 23 24// エラーメッセージの配列の初期化 25$errorMsg = array(); 26// セッション変数の初期化 27$_SESSION['errorMsg'] = array(); 28 29 30// XSS対策 サニタイズ(無毒化) 31function h($string){ 32 33 if(is_array($string)){ 34 return array_map("h", $string); 35 36 } else { 37 38 return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 39 } 40} 41 42 // XSS対策 (hrefやsrcの値がURLか確認する) 43 function urlCheck($form_Content) { 44 if (!preg_match("/^(https?:.+)$/", $form_Content)) { 45 return $errorMsg[] = "不正を検知しました。"; 46 } else { 47 return true; 48 } 49 } 50 51 52 53// POST時 54if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') { 55 56 57 $_SESSION["name"] = filter_input(INPUT_POST, 'name'); 58 $_SESSION["email"] = filter_input(INPUT_POST, 'email'); 59 $_SESSION["password"] = filter_input(INPUT_POST, 'password'); 60 $_SESSION["tel"] = filter_input(INPUT_POST, 'tel'); 61 $_SESSION["prefectures"] = filter_input(INPUT_POST, 'prefectures'); 62 $_SESSION["hobby"] = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 63 $_SESSION["gender"] = filter_input(INPUT_POST, 'gender'); 64 $_SESSION["contact"] = filter_input(INPUT_POST, 'contact'); 65 66// 67// 未入力チェック 68// 69 70// エラーメッセージの配列の初期化 71$errorMsg = array(); 72 73// 名前の未入力チェック 74if (empty($_SESSION["name"])) { 75 $errorMsg[] = "名前を入力してください。"; 76} 77 78// メールアドレスの未入力チェック 79if (empty($_SESSION["email"])) { 80 $errorMsg[] = "メールアドレスを入力してください。"; 81} 82 83// パスワードの未入力チェック 84if (empty($_SESSION["password"])) { 85 $errorMsg[] = "パスワードを入力してください。"; 86} 87 88// 電話番号の未入力チェック 89if (empty($_SESSION["tel"])) { 90 $errorMsg[] = "電話番号を入力してください。"; 91} 92 93// 都道府県の未入力チェック 94if ($_SESSION["prefectures"] == "選択") { 95 $errorMsg[] = "都道府県を選択してください。"; 96} 97 98 // 99 // 文字数チェック 100 // 101 102 // 名前の文字数チェック 103 if (strlen($_SESSION["name"]) >= 60) { 104 $errorMsg[] = "氏名が長すぎます。"; 105 } 106 107 // パスワード文字数チェック(8文字以上か) 108 if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $_SESSION["password"])) { 109 $errorMsg[] = "パスワードは8文字以上で入力してください。"; 110 } 111 112 // 電話番号の文字数チェック(10文字 or 11文字) 113 if (strlen($_SESSION["tel"]) >= 1 && strlen($_SESSION["tel"]) <= 9 && preg_match("/^[0-9]+$/", $_SESSION["tel"])) { 114 $errorMsg[] = "電話番号は10文字か11文字で入力してください。"; 115 } elseif (strlen($_SESSION["tel"]) >= 12 && preg_match("/^[0-9]+$/", $_SESSION["tel"])) { 116 $errorMsg[] = "電話番号は10文字か11文字で入力してください。"; 117 } 118 119 // 120 // 形式チェック 121 // 122 123 // メールアドレス形式チェック 124 if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_SESSION["email"]) && $_SESSION["email"] !== "") { 125 $errorMsg[] = "メールアドレスに間違いがあります。"; 126 } 127 128 // 電話番号の形式チェック 129 if (preg_match("/[-]+/", $_SESSION["tel"])) { 130 $errorMsg[] = "電話番号はハイフンなしで入力してください。"; 131 } 132 133 // 134 // 半角英数字チェック 135 // 136 137 // 電話番号の数字チェック 138 if (!preg_match("/[0-9]/", $_SESSION["tel"]) && $_SESSION["tel"] !== "") { 139 $errorMsg[] = "電話番号は半角数字で入力してください。"; 140 } 141 142 143 // 電話番号の全角チェック Todo 144 //if (strlen($tel) !== mb_strlen($tel, "UTF-8")) { 145 // $errorMsg[] = "電話番号に全角が含まれています。"; 146 //} 147 148 149 if (count($errorMsg) >= 1) { 150 $_SESSION['errorMsg'] = $errorMsg; 151 foreach ($errorMsg as $error) { 152 echo $error; 153 } 154 155 header("location: http://192.168.33.15/registration.php"); 156 exit; 157 158 } else { 159 echo ""; 160 } 161 162 163 164} 165 166 ?> 167 168 <!DOCTYPE html> 169 <html lang="ja"> 170 <head> 171 <meta charset="utf-8"> 172 <title>確認フォーム</title> 173 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 174 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 175 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 176 177 </head> 178 <body> 179 180 181 <form class="form-horizontal" action="registered.php" method="post"> 182 <fieldset> 183 184 <!-- Form Name --> 185 <legend style=background-color:#65ace4;><h1 style=text-align:center;>確認フォーム</h1></legend> 186 187 <ol class="breadcrumb"> 188 <li><a href="http://192.168.33.15"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>トップ</a></li> 189 <li><a href="http://192.168.33.15/registration.html">新規登録フォーム</a></li> 190 <li class="active">確認フォーム</li> 191 </ol> 192 193 <div class="container"> 194 195 <div class="form-group"> 196 <label class="col-sm-5 control-label">氏名</label> 197 <div class="col-sm-5"> 198 <p class="form-control-static"><?php echo h($_SESSION["name"]); ?></p> 199 </div> 200 </div> 201 202 <div class="form-group"> 203 <label class="col-sm-5 control-label">メールアドレス</label> 204 <div class="col-sm-5"> 205 <p class="form-control-static"><?php echo h($_SESSION["email"]); ?></p> 206 </div> 207 </div> 208 209 <div class="form-group"> 210 <label class="col-sm-5 control-label">パスワード</label> 211 <div class="col-sm-5"> 212 <p class="form-control-static"><?php echo h($_SESSION["password"]); ?></p> 213 </div> 214 </div> 215 216 217 <div class="form-group"> 218 <label class="col-sm-5 control-label">電話番号</label> 219 <div class="col-sm-5"> 220 <p class="form-control-static"><?php echo h($_SESSION["tel"]); ?></p> 221 </div> 222 </div> 223 224 <div class="form-group"> 225 <label class="col-sm-5 control-label">都道府県</label> 226 <div class="col-sm-5"> 227 <p class="form-control-static"><?php echo h($_SESSION["prefectures"]); ?></p> 228 </div> 229 </div> 230 231 <div class="form-group"> 232 <label class="col-sm-5 control-label">趣味</label> 233 <div class="col-sm-5"> 234 <p class="form-control-static"><?php 235 236 if (isset($_SESSION["hobby"])) { 237 foreach ($_SESSION["hobby"] as $value) { 238 echo h($value); 239 } 240 echo " "; 241 } 242 243 244 ?></p> 245 </div> 246 </div> 247 248 <div class="form-group"> 249 <label class="col-sm-5 control-label">性別</label> 250 <div class="col-sm-5"> 251 <p class="form-control-static"><?php echo h($_SESSION["gender"]); ?></p> 252 </div> 253 </div> 254 255 <div class="form-group"> 256 <label class="col-sm-5 control-label">お問い合わせ</label> 257 <div class="col-sm-5"> 258 <p class="form-control-static"><?php echo h($_SESSION["contact"]); ?></p> 259 </div> 260 </div> 261 262 263 <div class="button-group"> 264 <div class="col-md-5 col-sm-offset-5 col-sm-7 col-xs-offset-4 col-xs-8"> 265 <a href="http://192.168.33.15/registration.php"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a> 266 <button type="submit" class="btn btn-primary">送信する</button> 267 <p class="help-block" style=margin-top:15px;>以上の内容でよろしければ、送信ボタンを押してください。</p> 268 </div> 269 </div> 270 271 272 273 274 275</div> 276 </fieldset> 277 </form> 278 279 280 281 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 282 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 283 </body> 284 </html> 285

・登録完了画面 registered.php

php

1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', TRUE); 4error_reporting(E_ALL); 5 6session_start(); 7 8header("Content-type: text/html; charset=utf-8"); 9 10require_once(__DIR__. '/db.php'); 11 12 13try { 14 15 $dbh = new PDO($dsn, $user, $password); 16 $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)"); 17 18 if ($statement) { 19 20 // プレースホルダへ実際の値を設定する 21 $statement->bindValue(':name', $_SESSION["name"], PDO::PARAM_STR); 22 $statement->bindValue(':email', $_SESSION["email"], PDO::PARAM_STR); 23 $statement->bindValue(':password', $_SESSION["password"], PDO::PARAM_STR); 24 $statement->bindValue(':tel', $_SESSION["tel"], PDO::PARAM_INT); 25 $statement->bindValue('prefectures', $_SESSION["prefectures"], PDO::PARAM_STR); 26 $statement->bindValue('hobby', $_SESSION["hobby"], PDO::PARAM_STR); 27 $statement->bindValue('gender', $_SESSION["gender"], PDO::PARAM_STR); 28 $statement->bindValue('contact', $_SESSION["contact"], PDO::PARAM_STR); 29 30 // 実行する 31 if (!$statement->execute()) { 32 $errors['error'] = "登録失敗しました。 "; 33 } 34 35 //データベース切断 36 $dbh = null; 37 38 39 } 40 41 42} catch (PDOException $e) { 43 print('Error:'.$e->getMessage()); 44 $errors['error'] = "データベース接続失敗しました。"; 45} 46 47 48 49 ?> 50 51 52 <!DOCTYPE html> 53 <html> 54 <head> 55 <meta charset="utf-8"> 56 <title>登録完了</title> 57 </head> 58 <body> 59 60登録完了! 61 62 63 64<a href="http://192.168.33.15"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a> 65 66 67 68 </body> 69 </html> 70

結果
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

投稿2017/12/02 04:29

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

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

投稿2017/12/02 01:43

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dog57

2017/12/02 02:16

実際に行ってみました. 質問欄の一番下に画像を貼りましたが このような結果で大丈夫ですか? ちゃんと日本語だけにならないとおかしいですか?
tanat

2017/12/02 02:26

元々文字列で表せないものを文字列に変換するのでそのまま日本語にならない事自体は正しいです。 ただ、一連の処理が正しいかどうかは別問題なので、 データを取得して使用する時に正しくデコードできるかどうかで一連の処理が正しいかどうか判断してください。 json_encode() json_decode()はmysqlと関係なく、例えば一時的にテキストファイルに配列を保存するような場合でも使えるので、簡単なサンプルを作ってみて動作イメージを把握してみることをお勧めします。
dog57

2017/12/04 01:02

ありがとうござうます! 実際に、行ってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問