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

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

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

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

PHP

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

Q&A

解決済

1回答

859閲覧

PHPからMySQLへのデータ登録について

Dai5

総合スコア13

MySQL

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

PHP

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

0グッド

0クリップ

投稿2020/07/08 14:36

前提・実現したいこと

現在PHPを使い、MySQLにデータを登録するプログラムを書いています。
開発環境はMAMP,phpMyAdminです。

HTMLの入力フォーム3つ以上に入力された値全てをデータベースに登録したいです。

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

学籍番号,姓,名といった項目があり、それらを登録したいのですが、3つ以上になると登録できません。
下記プログラムで言いますと学籍番号と姓や学籍番号と名といったフォームだと、問題なくデータベースに登録されるのですが、学籍番号、姓、名の全てフォームに実装して登録しようとすると”登録が失敗しました”が表示されます。
登録ボタンを押した後は、"登録が失敗しました"と表示されるだけで、具体的なエラーメッセージは表示されません。

該当のソースコード

HTML

1<!DOCTYPE html> 2 <form method="post" action="form2.php"> 3 <p>学籍番号</p><input type="text" name="student_id"><br> 4 <p>姓</p><input type="text" name="l_name"><br> 5 <p>名</p><input type="text" name="f_name"><br> 6 <input type="submit" value="登録する"><br> 7 </form>

PHP

1<?php 2 // データーベースへ接続 3 $link = mysqli_connect(" "," "," ",""); 4 5 // 接続に失敗すれば強制終了 6 if(mysqli_connect_error()){ 7 die("Failed Connect DB."); 8 } 9 //データが入力されているかどうかチェックする 10 if(array_key_exists('student_id',$_POST) OR array_key_exists('l_name', $_POST) OR array_key_exists('f_name', $_POST)) 11 { 12 if($_POST['student_id'] == ''){ 13 echo "学籍番号を入力してください"; 14 } 15 elseif($_POST['l_name']==''){ 16 echo "姓を入力してください"; 17 } 18 elseif($_POST['f_name']==''){ 19 echo "名を入力してください"; 20 } 21 else{ 22 //学籍番号が既に使用されていないかチェックする 23 $query = "SELECT `student_id` FROM `students` WHERE student_id = '".mysqli_real_escape_string($link,$_POST['student_id'])."'"; 24 $result = mysqli_query($link,$query); 25 if(mysqli_num_rows($result) > 0){ 26 echo "既にその学籍番号は使用されています。"; 27 }else{ 28 //未使用の場合、データベースに登録する 29 $query = "INSERT INTO `students` (`student_id`,`l_name`, 'f_name') VALUES('" 30 .mysqli_real_escape_string($link,$_POST['student_id']) 31 ."','" 32 .mysqli_real_escape_string($link,$_POST['l_name']) 33 ."','" 34 .mysqli_real_escape_string($link,$_POST['f_name']) 35 ."')"; 36 37 if(mysqli_query($link,$query)){ 38 echo "登録が成功しました。"; 39 } else{ 40 echo "登録が失敗しました"; 41 } 42 } 43 } 44 } 45?>

試したこと

フォームの値が正しく受け取れていないのかと思ったので、echoでPOSTされた値を出してみたり、データベース側のテーブル名やカラム名が間違っていないか見直したりしましたが、特に問題はありませんでした。
入力フォームが2つの場合はINSERTできているので、基本的な文は合っているかと思うのですが、3つ以上になると最後の$queryが実行できず、"登録が失敗しました"となってしまいます。
実際のプログラムでは、$link = mysqli_connect(" "," "," ","");
の部分は値を入れています。接続も確認済みです。

同じような経験がある方や、PHP経験者の方のアドバイスを頂きたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

具体的なエラーメッセージは表示されません。

具体的なエラーメッセージが出るようなコードになっていません。
MySQLはPHPからすると外部の仕組みなので、「エラーハンドリング」と言って、意図的に拾う仕組みをコーディングしないと、MySQL内で起きたエラーまでは拾いません。
mysqli::$errorを見るとか、できれば例外処理を入れましょう。

あと、先に書いたように外部の仕組みですので、その仕組み内で直接実行して想定の結果を得られないのであれば、PHPから実行しても当然、成功しません。

PHPから実行する前に、直に実行して(それぞれのパラメータは固定値で良い)想定の結果を得られるか確認してください。
ひとまず、実行前の$queryをechoした文字列を取得してください。

※これも問題切り分けの1歩目なので、これだけで解決できるかは不明ですが、mysqli_queryの結果がfalseであることからSQL自体に問題がある可能性はあると解釈できます

蛇足:
mysqli_real_escape_stringよりも、preparebind_paramexecuteの流れを覚えた方が良いかと思います。
ただ、DBはMySQLだけではないので、できれば、接続部分以外の流れ(SQL自体を除く)がMySQLに依存しない、PDOを覚えた方が良いです。
入力値の受け取りも、$_POST 直に参照するのではなくfilter_inputのほうがスッキリ書けます。

投稿2020/07/08 18:46

編集2020/07/08 18:49
m.ts10806

総合スコア80850

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

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

Dai5

2020/07/09 00:18

m.ts10806さん ご回答ありがとうございます。 PHPとMySQLの関係性を理解できていない部分があったので、アドバイスがとても参考になりました。 $queryをechoした文字列を取得してみたところ、 INSERT INTO `students` (`student_id`,`l_name`, 'f_name') VALUES('実際の値','実際の値','実際の値'); と表示されました。 ターミナルに直接打ち込んだところ ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax というエラーが出ました。 どうやら`students` (`student_id`,`l_name`, 'f_name')の部分(テーブル名,カラム名)のシングルクォーテーションがいらなかったみたいです。 値が二つの場合はシングルクォーテーションがあっても実行されていたので、疑問が残りますが今後はechoでSQL文を表示させることをやっていこうと思います。 また、prepare→bind_param→executeの流れも試してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問