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

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

ただいまの
回答率

89.97%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 300

mizuoniku

score 4

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);

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • takasima20

    2019/07/02 07:58

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

    キャンセル

  • m.ts10806

    2019/07/02 09:04

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

    キャンセル

  • mizuoniku

    2019/07/03 01:25

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

    キャンセル

  • m.ts10806

    2019/07/03 09:03

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

    キャンセル

回答 4

checkベストアンサー

+1

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

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

下記、気になったこと、また直接の問題点

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

蛇足:

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/03 01:23

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

    キャンセル

  • 2019/07/03 09:04

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

    キャンセル

0

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

-- ダブルクォート
$q101 = $_GET["q101"];


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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/02 09:05

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

    キャンセル

  • 2019/07/03 01:25

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

    キャンセル

0

とりあえず

$db = new PDO("mysql:);


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

$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/03 01:24

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/02 09:30

    URLは https://teratail.com/help#about-markdown の [リンク] に修正してください。

    キャンセル

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

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる