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

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

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

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

PHP

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

Q&A

解決済

3回答

1823閲覧

PHPからMySQLへのデータ送信のプログラミング構造

akoro

総合スコア27

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/01/24 04:16

編集2019/01/24 05:38

プログラミング二か月目、MySQL数日目の初心者です。
見よう見まねで全ては理解できていない状態でプログラミングしました。

ユーザ登録画面です、この前のページで名前とメールアドレスを入力してもらい、DBにその情報を送る操作を打ちました。
Mysqlのファイルにデータが送信できることは確認済みです。
ただ、当方の書いたものだと名前とメアドが違う横列に入ってしまいます。
どこを統一すれば同一人物の情報だと認識して、DBに格納されるのでしょうか?

最初のif (!isset($_POST['Name']) || $_POST['Name'] === "" && !isset($_POST['Ad']) || $_POST['Ad'] === "")にするなど試したのですがうまくいきませんでした。
ご教授願います。

<?php //name if(empty($_POST)) { echo "<a href='projlogin.php'>ログイン画面</a>←こちらのページからどうぞ"; }else{ //名前入力判定 if (!isset($_POST['Name']) || $_POST['Name'] === "" ){ echo "名前が入力されていません。"; }else{ //プリペアドステートメント $stmt1 = $mysqli->prepare("INSERT INTO user_list (user_name) VALUES (?)"); if($stmt1){ //プレースホルダへ実際の値を設定する $stmt1->bind_param('s', $Name); $Name = $_POST['Name']; if($stmt1->execute()){ echo htmlspecialchars($Name, ENT_QUOTES, 'UTF-8')."さんで登録いたしました。"; }else{ echo $stmt1->errno . $stmt1->error; } //ステートメント切 $stmt1->close(); }else{ echo $mysqli->errno . $mysqli->error; } } //アド入力判定 if (!isset($_POST['Ad']) || $_POST['Ad'] === "" ){ echo "アドレスが入力されていません。"; }else{ //プリペアドステートメント $stmt2 = $mysqli->prepare("INSERT INTO user_list (user_ad) VALUES (?)"); if($stmt2){ //プレースホルダへ実際の値を設定する $stmt2->bind_param('s', $Ad); $Ad = $_POST['Ad']; if($stmt2->execute()){ echo "メールアドレスは".htmlspecialchars($Ad, ENT_QUOTES, 'UTF-8'); echo "で登録いたしました。"; }else{ echo $stmt2->errno . $stmt2->error; } //ステートメント切断 $stmt2->close(); }else{ echo $mysqli->errno . $mysqli->error; } } } // データベース切断 $mysqli->close(); ?>

回答をもとに変更してみました。
以下のように記述しましたら、
1136Column count doesn't match value count at row 1
のエラーが出ました。
調べたところ、コラムの数が合わないのが原因のようなのですが、対処方法はありますでしょうか?
たしかにDBにはインデックスとしてauto_incrementでもう一つコラムは設定されています。

<?php $name=filter_input(INPUT_POST,"Name"); $ad=filter_input(INPUT_POST,"Ad"); //名前入力判定 //プリペアドステートメント $stmt = $mysqli->prepare("INSERT INTO user_list (user_name,user_ad) VALUES (?,?)"); if($stmt){ //プレースホルダへ実際の値を設定する $stmt->bind_param('s', $Name); $stmt->bind_param('s', $Ad); $Name = $_POST['Name']; $Ad = $_POST['Ad']; if($stmt->execute()){ echo "お名前は".htmlspecialchars($Name, ENT_QUOTES, 'UTF-8')."さん<br>"; echo "メールアドレスは".htmlspecialchars($Ad, ENT_QUOTES, 'UTF-8')."<br>"; echo "で登録いたしました。"; }else{ echo $stmt->errno . $stmt->error; } //ステートメント切断 $stmt->close(); }else{ echo $mysqli->errno . $mysqli->error; } // データベース切断 $mysqli->close(); ?>

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

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

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

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

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

guest

回答3

0

自己解決

回答者様の意見総合的に見て解決できました、ありがとうございます。
以下で解決

$name=filter_input(INPUT_POST,"Name"); $ad=filter_input(INPUT_POST,"Ad"); $stmt = $mysqli->prepare("INSERT INTO user_list (user_name,user_ad) VALUES (?,?)"); $stmt->bind_param('ss', $name,$ad);

今後の自身のためのメモ:insertと$stmt->bind_paramはまとめる、sは変数(打ち込みデータ)の数

投稿2019/01/24 07:41

編集2019/01/24 07:47
akoro

総合スコア27

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

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

m.ts10806

2019/01/24 07:45

データ二個ならssでは。 いずれにしてもpdoに切り替えられた方が書きやすくなります。
akoro

2019/01/24 07:48

ご指摘ありがとうございます。最重要箇所間違えておりました。
guest

0

insertを2回送信していれば別レコードになるのは当然です。

下記のようなSQLを送信してください。

sql

1INSERT INTO user_list (user_name,user_ad) VALUES (?,?)

どちらも必須のようですが、必須にも関わらず一方だけでも登録できるのはDB設計上のミスと思います。
テーブル定義がどうなっているか分かりませんが、必須のカラムはNot Nullに設定してください。
そうするとSQLのエラーになるので今回のミスに気づけます。

投稿2019/01/24 04:37

編集2019/01/24 04:39
m.ts10806

総合スコア80850

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

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

akoro

2019/01/24 04:42

insert intoを統一するのですねありがとうございます。 Nullになってました、Not nulに変えます、ありがとうございます。
m.ts10806

2019/01/24 04:47 編集

DBはキーが決まっている配列と思った方がイメージがわきやすいです。 質問者さんの現在のコードはPHPの配列作る処理だと下記です。 $arr = []; $record1 =["name"=>"なまえ","mail"=>""]; $arr[] = $record1; $record2 =["name"=>"","mail"=>"aaa@example.com"]; $arr[] = $record2; insertはその配列に1つのレコードを作る処理です。1つのinsertで1レコード挿入します。
akoro

2019/01/24 05:42

なぜ検索で出てくる例はすべて配列なんだろうかと疑問に思っておりました。 考え方の解説ありがとうございます。 >insertはその配列に1つのレコードを作る処理です。1つのinsertで1レコード挿入します。 このアドバイスと、ほかの方のも参考に変えてみたのですが、また違うエラーが出てしまいました。
m.ts10806

2019/01/24 06:18

> なぜ検索で出てくる例はすべて配列なんだろうか fetchArray()など「配列で取り出す」機能を利用しているからだと思います。 SQL自体はあくまで結果を返しているだけです。 取り出し方によってはオブジェクトメンバー($rec->name )のような形にもなります。
m.ts10806

2019/01/24 06:20

>このアドバイスと、ほかの方のも参考に変えてみたのですが、また違うエラーが出てしまいました。 変数は大文字と小文字を大別します。 aとAは別物 bとBは別物です。 定義したならどんなに短い次数でも手入力せずにコピペするのが基本です。
akoro

2019/01/24 07:38

なるほど、ありがとうございます。 今回のエラーはタイプミスではなく、構造無知湯故の普通のミスだったのですが、コピペ意識して今後取り組みます。
m.ts10806

2019/01/24 07:42

もう少しphpマニュアルをきちんと読んだ方がいいかなと。 ネットの記事を参考にするのも良いですが、そもそものphpの機能の仕様を理解して使うことが前提です
akoro

2019/01/24 08:03

仕組を理解できるようにマニュアルも読みます、ありがとうございます。
guest

0

PHP

1$name=filter_input(INPUT_POST,"Name"); 2$ad=filter_input(INPUT_POST,"Ad"); 3 4$stmt = $mysqli->prepare("INSERT INTO user_list (user_name,user_ad) VALUES (?,?)"); 5$stmt->bind_param('s', $name); 6$stmt->bind_param('s', $ad); 7

おなじレコードに登録するのですから一度に投入してください

投稿2019/01/24 04:34

yambejp

総合スコア114814

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

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

akoro

2019/01/24 04:41

ありがとうございます、試してみます。
akoro

2019/01/24 07:28

>$stmt->bind_param('s', $name); >$stmt->bind_param('s', $ad); の箇所に mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables というエラーがでてしまたのですが、解決策はありますでしょうか?
akoro

2019/01/24 07:32

まとめて$stmt->bind_param('ss', $name,$ad);で解消しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問