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

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

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

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

PHP

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

Q&A

解決済

1回答

23749閲覧

エラー表示 General error: 1366 Incorrect integer value: '' for column 'id' at row 1

nguyenseiji

総合スコア156

MySQL

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

PHP

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

0グッド

0クリップ

投稿2020/07/09 15:15

現在mysqlにphpのPOST形式でデーターを入れようとしているのですが

エラーがでてしまい調べても修正方法がわからないため質問させていただきました

『エラーコード』
メンテナンス中の為ご迷惑をおかけいたします
id変数の展開->
PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'id' at row 1 in C:\MAMP\htdocs\database\receive.php:34 Stack trace: #0 C:\MAMP\htdocs\database\receive.php(34): PDOStatement->execute(Array) #1 {main}

id変数の展開->で一度$id変数を表示してみましたがnull?みたいです
数字はinputで確認に入れたのですが...

html

1 <form method="post" action="http://localhost:80//database/receive.php" name="formName"> 2 3 4 <div>商品ID</div> 5 <input type="number" name="id" id="id"> 6 7 8 <input type="submit" value="登録" name="register" id="register" /> 9 10 11 </form>

php

1<?php 2 3ini_set('mbstring.internal_encoding','UTF-8'); 4 5 6 7try{ 8 9 10$id=$_POST["id"]; 11 12 13$id=htmlspecialchars($id,ENT_QUOTES,"UTF-8"); 14 15 16 17 18if($id=""){ 19 20print "商品IDを入れてください"; 21print '<br>'; 22 23} 24 25require_once "../confidential/detabaseAccses.php"; 26 27$sql="insert into ilysb(id) values(?)"; 28 29$stmt=$dbh->prepare($sql); 30 31$data[]=$id; 32 33$stmt->execute($data); 34 35$dbh=null; 36 37}catch(exception $e){ 38 39print "メンテナンス中の為ご迷惑をおかけいたします"; 40 41print "<br>"; 42 43print "id変数の展開->"; 44 45print "$id"; 46 47print "<br>"; 48 49print $e; 50 51exit(); 52} 53 54?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーをきちんと読めば見えてくることもあるかと思います。

General error: 1366 Incorrect integer value: '' for column 'id' at row 1

Google翻訳:一般エラー:1366行1の列 'id'の整数値が不正です: ''

おそらくidの型がintegerなどの整数型で定義されているが、空文字が投入されたということなんでしょう。

エラーはもちろんですが、エラーメッセージの意味が分かったのであれば
そこから「どういう対策があるか」より、調査対象を自身のコードにした方が良いかと思います。
問題が起きているのは他でもない、自身のコードです。

良くコードを見てみましょう。

POST値を受け取っていますが

php

1$id=$_POST["id"];

if内の式で上書きしています

php

1 2if($id=""){

簡単に書くと、こう。

php

1<?php 2$a = "ああああああああああああああああああ"; 3if($a=""){} 4echo $a;

ただ「未入力だったらエラーを出す」のはいいとして

php

1if($id=""){ 2 3print "商品IDを入れてください"; 4print '<br>'; 5 6} 7

これだと、未入力でもこのエラーメッセージの文字列は出力されますが、
そのまま実行されますよ。

要件次第ですが、何かしらで処理の続行を止める必要があるのでは。
簡単にするなら、die()とかexit()ですね。

id変数の展開->で一度$id変数を表示してみましたがnull?みたいです
数字はinputで確認に入れたのですが...

確認する場所間違ってます。
「POSTで情報が来ているか」なら$_POSTをvar_dump()です。
別の変数に代入されてますが、変数はPOSTからきた情報かどうかはプログラムは知りません。


蛇足:
5点

1点目:
コードインデントはきちんとされたほうが良いかと思います。
可読性の面で悪くなりますし、スコープも見えにくくなります。
改行しすぎもよろしくありません。
コードフォーマット機能のあるエディタ(IDEが良い)を利用しましょう。

2点目:

php

1 $id = htmlspecialchars($id, ENT_QUOTES, "UTF-8");

DBにおさめる値なのであれば、HTMLエスケープしてはいけません。
「文字列の加工」にもなります。HTMLに表示するときのみ利用すべきです。
この直後に$idが空になるか確認していることから、「送信された情報」ではなく「PHPで加工した情報」に対するチェックになってしまっています。

type=numberの送信であること、空文字のチェックであることから
現状問題ないようには見えますが、この癖がつくと他のところで思わぬ穴に落ちます。

3点目:
細かいですが初期化してない配列にいきなり代入してます。

php

1 $data[] = $id;

php

1$data = []; 2$data[] = $id;

4点目:
PDOなのであれば、PDOExceptionとするのが正確です。

php

1}catch(exception $e){

5点目:

C:\MAMP\htdocs\database

Windows でMAMP
MacでXAMPP は悪手です。

teratailでもよくあがるお悩み相談です。
WindowsならXAMPP MacならMAMP で解決することも非常に多いです。
「どうしてもWindowsでMAMPでなければならない理由」ってないと思います。
だからと言って確かに「XAMPPでなければならない理由」もないのですが、
MAMPはWindowsに対して正規化されたものではないため、何か問題が起きた時に見つかる情報が少ないのです。

理想は、そういったOS関係なく利用できる仮想環境でLinuxでWebサーバーを立てることですね。LAMP環境が最も環境に左右されにくいです。

投稿2020/07/09 21:46

m.ts10806

総合スコア80875

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

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

nguyenseiji

2020/07/10 00:15

ご連絡ありがとうございます if($id="")を if($id=="")にしたら問題なく動きました 変数の中身が空白と一緒ならだったので完全にスペルミスになります。 本題の方は解決したのですが 別のところでもご指揮頂き少し気になったので質問させていただきます 『質問1』 if($id="")の()の中は条件を判断するだけの処理ではなく実行されてしまうのでしょうか 例えばif($id="")とした場合 $idは空白か判断するだけでなく $idに空白を代入してしまうのでしょうか 『質問2』 htmlspecialcharsは mysqlにデータを入れる時は使用しない mysqlから取り出してhtmlで表示する時のみ使用する の認識であっておりますでしょうか
m.ts10806

2020/07/10 02:40

1 「変数に値を代入した」という式の評価なので、型指定でもしてなければ評価結果はfalseになることは基本的にないからです。 2 はい。合ってます。 保管するデータは加工してはいけません。
m.ts10806

2020/07/10 02:53

>こちらについても 本件未解決のままではよろしくないかと。
nguyenseiji

2020/07/10 04:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問