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

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

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

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

PHP

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

Q&A

解決済

4回答

648閲覧

PHPでmysqlにINSERT出来ず悩んでおります。

mizuoniku

総合スコア10

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/07/01 20:27

formから送らててきた値をmysqlにINSERTできず悩んでおります。

初心者でsql文が長すぎて、どこに問題があるか気が付けていないのですが、
もっとsql文を短くできる方法がありましたらご教授頂けないでしょうか。
とても長いSQL文で大変も見苦しい上、お手間がかかると思われとても申し訳ございません。
(子供たち用のwebアプリで個人で作成しているものなので公開しても問題ありません。)

データベースのテーブル
create table test(sno int auto_increment,uno int,day date,hour int,min int,tag int,place int,meal int,eaten int,q101 int,q102 int,q103 int,q104 int,q105 int,q106 int,q107 int,q108 int,q109 int,q201 int,q202 int,q203 int,q204 int,q205 int,q206 int,q207 int,q208 int,q209 int,q210 int,q211 int,q212 int,q213 int,q214 int,q215 int,q301 int,q302 int,q303 int,q304 int,q305 int,q306 int,q307 int,q308 int,q309 int,q310 int,q311 int,q312 int,q313 int,q314 int,q315 int,q316 int,q317 int,q318 int,q319 int,q320 int,q321 int,q401 int,q402 int,q403 int,q404 int,q405 int,q406 int,q407 int,q408 int,q409 int,q410 int,q411 int,q412 int,q413 int,q414 int,q415 int,q416 int,q417 int,q418 int,q419 int,q420 int,q421 int,q422 int,q423 int,q424 int,q425 int,q426 int,q427 int,q428 int,q429 int,q430 int,q431 int,q432 int,q433 int,q434 int,q435 int,q436 int,q437 int,q438 int,q439 int,q501 int,q502 int,q503 int,q504 int,q505 int,q506 int,q507 int,q508 int,q509 int,q510 int,q511 int,q512 int,q513 int,q514 int,q515 int,q550 int,q551 int,q552 int,q553 int,q554 int,q555 int,q556 int,q557 int,q558 int,q601 int,q602 int,q603 int,q604 int,q605 int,q606 int,q651 int,q652 int,q653 int,q661 int,q662 int,q663 int,q664 int,q665 int,q666 int,q701 int,q702 int,q703 int,q704 int,q705 int,q706 int,q707 int,q708 int,q709 int,q710 int,q711 int,q712 int,q713 int,q714 int,q715 int,q716 int,q717 int,q718 int,q801 int,q802 int,q803 int,q804 int,q805 int,q806 int,q807 int,q808 int,q809 int,q810 int,q811 int,q812 int,q850 int,q851 int,q852 int,q901 int,q902 int,q903 int,q904 int,q905 int,q906 int,q907 int,q908 int,q909 int,q910 int,q911 int,q912 int,calorie int,protein DOUBLE,lipid DOUBLE,carbohydrate DOUBLE,calcium DOUBLE,iron DOUBLE,zinc DOUBLE,magnesium DOUBLE,folic_acid DOUBLE,vitamin_a DOUBLE,vitamin_d DOUBLE,vitamin_e DOUBLE,vitamin_k DOUBLE,vitamin_b1 DOUBLE,vitamin_b2 DOUBLE,vitamin_c DOUBLE,dietary_fiber DOUBLE,age int,primary key(sno));

<?php $day = $_GET['day']; $hour = $_GET['hour']; $min = $_GET['min']; $tag = $_GET['tag']; $place = $_GET['place']; $meal = $_GET['meal']; $eaten = $_GET['eaten']; $q101 = $_GET["q101"]; $q102 = $_GET["q102"]; 文字数制限の為省略、 echoで確認したところ値は取れていました。 $calorie = $_GET['calorie']; $protein = $_GET['protein']; $lipid = $_GET['lipid']; $carbohydrate = $_GET['carbohydrate']; $calcium = $_GET['calcium']; $iron = $_GET['iron']; $zinc = $_GET['zinc']; $magnesium = $_GET['magnesium']; $folic_acid = $_GET['folic_acid']; $vitamin_a = $_GET['vitamin_a']; $vitamin_d = $_GET['vitamin_d']; $vitamin_e = $_GET['vitamin_e']; $vitamin_k = $_GET['vitamin_k']; $vitamin_b1 = $_GET['vitamin_b1']; $vitamin_b2 = $_GET['vitamin_b2']; $vitamin_c = $_GET['vitamin_c']; $dietary_fiber = $_GET['dietary_fiber']; $age = $_GET['age']; //データベース接続時の例外処理 try{ //データベースへの接続、PDOインスタンスの生成 //第1引数は接続文字列、DBMS名、ホスト名とデータベース名を指定 //第2引数はユーザー名、第3引数はパスワード $db = new PDO("mysql:); print("<p>データベース「test」に接続しました</p>"); //SQL文の準備prepareメソッド、PDOStatmentオブジェクトを取得。$stoに代入 //SQL文としてINSERT文を準備 //値をセットするにはプレイスフォルダを使用する(SQLインジェクション対策) //プレイスフォルダ名は「:」に続けて名前を設定 $sto=$db->prepare('INSERT INTO test(sno int auto_increment,day,hour,min,tag,place,meal,eaten,q101,q102,q103,q104,q105,q106,q107,q108,q109,q201,q202,q203,q204,q205,q206,q207,q208,q209,q210,q211,q212,q213,q214,q215,q301,q302,q303,q304,q305,q306,q307,q308,q309,q310,q311,q312,q313,q314,q315,q316,q317,q318,q319,q320,q321,q401,q402,q403,q404,q405,q406,q407,q408,q409,q410,q411,q412,q413,q414,q415,q416,q417,q418,q419,q420,q421,q422,q423,q424,q425,q426,q427,q428,q429,q430,q431,q432,q433,q434,q435,q436,q437,q438,q439,q501,q502,q503,q504,q505,q506,q507,q508,q509,q510,q511,q512,q513,q514,q515,q550,q551,q552,q553,q554,q555,q556,q557,q558,q601,q602,q603,q604,q605,q606,q651,q652,q653,q661,q662,q663,q664,q665,q666,q701,q702,q703,q704,q705,q706,q707,q708,q709,q710,q711,q712,q713,q714,q715,q716,q717,q718,q801,q802,q803,q804,q805,q806,q807,q808,q809,q810,q811,q812,q850,q851,q852,q901,q902,q903,q904,q905,q906,q907,q908,q909,q910,q911,q912,calorie,protein,lipid,carbohydrate,calcium,iron,zinc,magnesium,folic_acid,vitamin_a,vitamin_d,vitamin_e,vitamin_k,vitamin_b1,vitamin_b2,vitamin_c,dietary_fiber,age)values($day,$hour,$min,$tag,$place,$meal,$eaten,$q101,$q102,$q103,$q104,$q105,$q106,$q107,$q108,$q109,$q201,$q202,$q203,$q204,$q205,$q206,$q207,$q208,$q209,$q210,$q211,$q212,$q213,$q214,$q215,$q301,$q302,$q303,$q304,$q305,$q306,$q307,$q308,$q309,$q310,$q311,$q312,$q313,$q314,$q315,$q316,$q317,$q318,$q319,$q320,$q321,$q401,$q402,$q403,$q404,$q405,$q406,$q407,$q408,$q409,$q410,$q411,$q412,$q413,$q414,$q415,$q416,$q417,$q418,$q419,$q420,$q421,$q422,$q423,$q424,$q425,$q426,$q427,$q428,$q429,$q430,$q431,$q432,$q433,$q434,$q435,$q436,$q437,$q438,$q439,$q501,$q502,$q503,$q504,$q505,$q506,$q507,$q508,$q509,$q510,$q511,$q512,$q513,$q514,$q515,$q550,$q551,$q552,$q553,$q554,$q555,$q556,$q557,$q558,$q601,$q602,$q603,$q604,$q605,$q606,$q651,$q652,$q653,$q661,$q662,$q663,$q664,$q665,$q666,$q701,$q702,$q703,$q704,$q705,$q706,$q707,$q708,$q709,$q710,$q711,$q712,$q713,$q714,$q715,$q716,$q717,$q718,$q801,$q802,$q803,$q804,$q805,$q806,$q807,$q808,$q809,$q810,$q811,$q812,$q850,$q851,$q852,$q901,$q902,$q903,$q904,$q905,$q906,$q907,$q908,$q909,$q910,$q911,$q912,$calorie,$protein,$lipid,$carbohydrate,$calcium,$iron,$zinc,$magnesium,$folic_acid,$vitamin_a,$vitamin_d,$vitamin_e,$vitamin_k,$vitamin_b1,$vitamin_b2,$vitamin_c,$dietary_fiber,$age)'); //プレイスフォルダに値をセットするbindValueメソッド //プレイスフォルダの数だけbindValueメソッドを実行する //SQL文の実行を行うexecuteメソッド //SQLが正常に実行できた場合はtrue、そうでない場合はfalseを返す if($sto->execute()){ print("<p>情報を新規登録しました</p>"); }else{ print("<p>SQL文実行時にエラーが発生しました</p>"); } //データベースの接続を閉じる $db = null; print("<p>データベースを切断しました</p>"); //PDOの例外処理 } catch (PDOException $e){ //中断関数die() die("<h2>データベース接続に失敗しました</h2>"); } ?>

mysqlに直接insertした場合はday以外入力できました。
INSERT INTO test(day,hour,min,tag,place,meal,eaten,q101,q102,q103,q104,q105,q106,q107,q108,q109,q201,q202,q203,q204,q205,q206,q207,q208,q209,q210,q211,q212,q213,q214,q215,q301,q302,q303,q304,q305,q306,q307,q308,q309,q310,q311,q312,q313,q314,q315,q316,q317,q318,q319,q320,q321,q401,q402,q403,q404,q405,q406,q407,q408,q409,q410,q411,q412,q413,q414,q415,q416,q417,q418,q419,q420,q421,q422,q423,q424,q425,q426,q427,q428,q429,q430,q431,q432,q433,q434,q435,q436,q437,q438,q439,q501,q502,q503,q504,q505,q506,q507,q508,q509,q510,q511,q512,q513,q514,q515,q550,q551,q552,q553,q554,q555,q556,q557,q558,q601,q602,q603,q604,q605,q606,q651,q652,q653,q661,q662,q663,q664,q665,q666,q701,q702,q703,q704,q705,q706,q707,q708,q709,q710,q711,q712,q713,q714,q715,q716,q717,q718,q801,q802,q803,q804,q805,q806,q807,q808,q809,q810,q811,q812,q850,q851,q852,q901,q902,q903,q904,q905,q906,q907,q908,q909,q910,q911,q912,calorie,protein,lipid,carbohydrate,calcium,iron,zinc,magnesium,folic_acid,vitamin_a,vitamin_d,vitamin_e,vitamin_k,vitamin_b1,vitamin_b2,vitamin_c,dietary_fiber,age)values(2019-06-30,6,10,2,1,1,1,0,0,0,0,0,0,0,108,0,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,828,31.6,39.7,80.4,63,3.4,4.1,45.7,56,150,2.3,1.4,14,0.32,0.58,10,0.5,9);

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

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

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

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

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

takasima20

2019/07/01 22:58

どっかにエラーメッセージが出てないスか?
m.ts10806

2019/07/02 00:04

コードは(SQLも含めて)マークダウンのcode機能にてご提示ください(どのような表示になるかは既についている回答を参考にしてください) https://teratail.com/help#about-markdown
mizuoniku

2019/07/02 16:25

ありがとうございました。
m.ts10806

2019/07/03 00:03

質問は編集できるので適宜ご対応いただければ良いですよ
guest

回答4

0

ベストアンサー

このコードでどういう問題が起きているかを確認してください。

  1. エラー表示をONにする
  2. 捕捉しているPDOExceptionからエラーメッセージを出力して確認する。はじめのうちはいっそ$eごとvar_dump()しても良いと思います。

下記、気になったこと、また直接の問題点
0. シングルクォート内に変数入れても展開されないから注意
NG:',$test,' OK:','.$test.','または",{$test},"
0. 変数をそのままSQLに突っ込むとSQLインジェクションの脆弱性があります。
自身でもプレイスフォルダに値をセットするbindValueメソッドと書かれているように、prepare()にセットする際は値を疑問符 (?) パラメータマークか名前パラメータで投入して、bindValueでバインドさせたほうが良いです。
※固定値セットする場合でもなるべく値は全て同じようにパラメータセットからのバインドが望ましいです。

蛇足:

(子供たち用のwebアプリで個人で作成しているものなので公開しても問題ありません。)

ご自身の判断において公開されているのでこれは老婆心にはなってしまうのですが、
名前や生年月日など、特定可能な情報を入れないように注意してくださいね。
※もし今後も同アプリケーションで質問していくのなら余計に

投稿2019/07/02 00:22

m.ts10806

総合スコア80850

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

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

mizuoniku

2019/07/02 16:23

とてもご丁寧に教えて頂きありがとうございました。 お陰様で出来ました。ダブルクォーテーションとシングルクォーテーションで間違いがありました。ご指摘いただいたようにbindValueに直します。ありがとうございました。
m.ts10806

2019/07/03 00:04

解決につながったようで何よりです
guest

0

「'」と「"」では動作に違いがあるので、その点を理解しましょう。

http://www.24w.jp/study_contents.php?bid=php&iid=php&sid=string&cid=006

投稿2019/07/02 00:27

kasa0

総合スコア578

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

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

guest

0

とりあえず

php

1$db = new PDO("mysql:);

ダブルクオーテーションが足りませんね。
--- 追記 ---
あとこのへんとか

php

1$sto=$db->prepare('INSERT INTO test(sno int auto_increment,day,hour,min,tag,place,meal,eaten,q101,q102,q103,q104,q105,q106,q107,q108,q109,q201,q202,q203,q204,q205,q206,q207,q208,q209,q210,q211,q212,q213,q214,q215,q301,q302,q303,q304,q305,q306,q307,q308,q309,q310,q311,q312,q313,q314,q315,q316,q317,q318,q319,q320,q321,q401,q402,q403,q404,q405,q406,q407,q408,q409,q410,q411,q412,q413,q414,q415,q416,q417,q418,q419,q420,q421,q422,q423,q424,q425,q426,q427,q428,q429,q430,q431,q432,q433,q434,q435,q436,q437,q438,q439,q501,q502,q503,q504,q505,q506,q507,q508,q509,q510,q511,q512,q513,q514,q515,q550,q551,q552,q553,q554,q555,q556,q557,q558,q601,q602,q603,q604,q605,q606,q651,q652,q653,q661,q662,q663,q664,q665,q666,q701,q702,q703,q704,q705,q706,q707,q708,q709,q710,q711,q712,q713,q714,q715,q716,q717,q718,q801,q802,q803,q804,q805,q806,q807,q808,q809,q810,q811,q812,q850,q851,q852,q901,q902,q903,q904,q905,q906,q907,q908,q909,q910,q911,q912,calorie,protein,lipid,carbohydrate,calcium,iron,zinc,magnesium,folic_acid,vitamin_a,vitamin_d,vitamin_e,vitamin_k,vitamin_b1,vitamin_b2,vitamin_c,dietary_fiber,age)values($day,$hour,$min,$tag,$place,$meal,$eaten,$q101,$q102,$q103,$q104,$q105,$q106,$q107,$q108,$q109,$q201,$q202,$q203,$q204,$q205,$q206,$q207,$q208,$q209,$q210,$q211,$q212,$q213,$q214,$q215,$q301,$q302,$q303,$q304,$q305,$q306,$q307,$q308,$q309,$q310,$q311,$q312,$q313,$q314,$q315,$q316,$q317,$q318,$q319,$q320,$q321,$q401,$q402,$q403,$q404,$q405,$q406,$q407,$q408,$q409,$q410,$q411,$q412,$q413,$q414,$q415,$q416,$q417,$q418,$q419,$q420,$q421,$q422,$q423,$q424,$q425,$q426,$q427,$q428,$q429,$q430,$q431,$q432,$q433,$q434,$q435,$q436,$q437,$q438,$q439,$q501,$q502,$q503,$q504,$q505,$q506,$q507,$q508,$q509,$q510,$q511,$q512,$q513,$q514,$q515,$q550,$q551,$q552,$q553,$q554,$q555,$q556,$q557,$q558,$q601,$q602,$q603,$q604,$q605,$q606,$q651,$q652,$q653,$q661,$q662,$q663,$q664,$q665,$q666,$q701,$q702,$q703,$q704,$q705,$q706,$q707,$q708,$q709,$q710,$q711,$q712,$q713,$q714,$q715,$q716,$q717,$q718,$q801,$q802,$q803,$q804,$q805,$q806,$q807,$q808,$q809,$q810,$q811,$q812,$q850,$q851,$q852,$q901,$q902,$q903,$q904,$q905,$q906,$q907,$q908,$q909,$q910,$q911,$q912,$calorie,$protein,$lipid,$carbohydrate,$calcium,$iron,$zinc,$magnesium,$folic_acid,$vitamin_a,$vitamin_d,$vitamin_e,$vitamin_k,$vitamin_b1,$vitamin_b2,$vitamin_c,$dietary_fiber,$age)');

※項目名を指定する先頭のあたり
--- 追記 ---
※上記は他の方も指摘されているようにダブルクオーテーションを使うとこですね。

投稿2019/07/01 23:00

編集2019/07/02 13:59
takasima20

総合スコア7458

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

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

mizuoniku

2019/07/02 16:24

ありがとうございました。助かりました。
guest

0

-- シングルクォート $eaten = $_GET['eaten']; -- ダブルクォート $q101 = $_GET["q101"];

と混ざっているけど、良いの?

コードは 対応しているMarkdownの機能 の[コードを入力]に修正してください。他のMarkdownの機能も良く読んでおきましょう。

投稿2019/07/01 21:10

Orlofsky

総合スコア16415

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

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

m.ts10806

2019/07/02 00:05

Orlofskyさん 「キーとなる文字列」なのでどちらでも問題ないです。 ※もちろんコーディング上は統一したほうが望ましいです。
mizuoniku

2019/07/02 16:25

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問