質問: 現在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で確認に入れたのですが... ``` 商品ID ``` ``` '; } require_once "../confidential/detabaseAccses.php"; $sql="insert into ilysb(id) values(?)"; $stmt=$dbh->prepare($sql); $data[]=$id; $stmt->execute($data); $dbh=null; }catch(exception $e){ print "メンテナンス中の為ご迷惑をおかけいたします"; print ""; print "id変数の展開->"; print "$id"; print ""; print $e; exit(); } ?> ```
回答: エラーをきちんと読めば見えてくることもあるかと思います。 > > General error: 1366 Incorrect integer value: '' for column 'id' at row 1 > > Google翻訳:一般エラー:1366行1の列 'id'の整数値が不正です: '' > > > おそらくidの型がintegerなどの整数型で定義されているが、空文字が投入されたということなんでしょう。 エラーはもちろんですが、エラーメッセージの意味が分かったのであれば そこから「どういう対策があるか」より、調査対象を自身のコードにした方が良いかと思います。 問題が起きているのは他でもない、自身のコードです。 良くコードを見てみましょう。 POST値を受け取っていますが ``` $id=$_POST["id"]; ``` if内の式で上書きしています ``` if($id=""){ ``` 簡単に書くと、こう。 ``` '; } ``` これだと、未入力でもこのエラーメッセージの文字列は出力されますが、 そのまま実行されますよ。 要件次第ですが、何かしらで処理の続行を止める必要があるのでは。 簡単にするなら、die()とかexit()ですね。 > > id変数の展開->で一度$id変数を表示してみましたがnull?みたいです > > 数字はinputで確認に入れたのですが... > > > 確認する場所間違ってます。 「POSTで情報が来ているか」なら$_POSTをvar_dump()です。 別の変数に代入されてますが、変数はPOSTからきた情報かどうかはプログラムは知りません。 蛇足: 5点 1点目: コードインデントはきちんとされたほうが良いかと思います。 可読性の面で悪くなりますし、スコープも見えにくくなります。 改行しすぎもよろしくありません。 コードフォーマット機能のあるエディタ(IDEが良い)を利用しましょう。 2点目: ``` $id = htmlspecialchars($id, ENT_QUOTES, "UTF-8"); ``` DBにおさめる値なのであれば、HTMLエスケープしてはいけません。 「文字列の加工」にもなります。HTMLに表示するときのみ利用すべきです。 この直後に$idが空になるか確認していることから、「送信された情報」ではなく「PHPで加工した情報」に対するチェックになってしまっています。 type=numberの送信であること、空文字のチェックであることから 現状問題ないようには見えますが、この癖がつくと他のところで思わぬ穴に落ちます。 3点目: 細かいですが初期化してない配列にいきなり代入してます。 ``` $data[] = $id; ``` ↓ ``` $data = []; $data[] = $id; ``` 4点目: PDOなのであれば、PDOExceptionとするのが正確です。 ``` }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環境が最も環境に左右されにくいです。