• ベストアンサー

入力フォームからデータベースにINSERTできない。

こんにちわ。今までSQL文で直接DBに商品名や価格などを登録していたのですが、今度は入力フォームから商品名や価格などを登録しようと思いスクリプトを組んでみたのですが、「Query failed: Column count doesn't match value count at row 1」という エラーが出てしまい悩んでいます。 <html> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <body> <?php $item = $_POST["item"]; $price = $_POST["price"]; $submit = $_POST["submit"]; //ショッピング登録フォーム echo ' <form method="post" action="shoppingform.php" > <center><br>商品名:<input type="text" size="30" maxlength="60" name="item"></br></center> <center><br>値段:<input type="text" size="30" maxlength="60" name="price"></br></center> <center><input type="submit" name="submit" value="登録"></center> </form> '; if($submit == "登録"){ $item = $_POST["item"]; $price = $_POST["price"]; if($contact=mysql_connect("host","admin","root")){ echo "サーバに接続ができました。<br>"; mysql_select_db("test", $contact); $query = 'INSERT INTO shoppingtable VALUES($item,$price)'; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); } お力をお貸し願えないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.5

こんにちは。 idをオートナンバで作ることは特に問題は無いと思います。 そういったことが起こるのでNo2さんNo3さんの言うとおり、 きちんと値をセットするカラム名を指定する必要が出てきます。 いちいちカラムを指定するのは面倒かもしれませんが、指定することをオススメします。 $query = "INSERT INTO shoppingtable VALUES ( '$item', $price' ); で実行する場合はテーブルの型が create table shoppingtable ( ITEM varchar(64), PRICE int(11) ); という型でないと正しく実行されません。 質問者様のテーブルは create table shoppingtable ( ID int(11) auto_increment, ITEM varchar(64), PRICE int(11), primary key(ID) ); という型になっていると思うのでエラーが発生します。 なので、 $query = "INSERT INTO shoppingtable ( ITEM, PRICE ) VALUES ( '$item', $price )"; にする必要があります。

msnxl
質問者

お礼

大変参考になりました。ありがとうございます。

その他の回答 (4)

回答No.4

No.3です。 がるさんのおっしゃるとうり、POSTデータの正当性チェックとサニタイズは必要に同意です。 申し訳ありません。Insert文に間違いがありましたので訂正します。 $query = "INSERT INTO shoppingtable (item, price) VALUES ('".$item."',".$price.")";

msnxl
質問者

お礼

お忙しい所、訂正のご回答ありがとうございます。

回答No.3

Column count doesn't match value count at row 1 「1行目でカラムの数と値の数が一致しない」というエラーですから、 テーブル「shoppingtable」の数が2つ以上あるとか。 例えば、「id」のようなカラムを autoincrement しているとか、 そんなことはありませんか? 以前のものと同様、 $query = 'INSERT INTO shoppingtable (item,price) VALUES ('".$item."',".$price.")'; というsql文なら問題ないのでは。

msnxl
質問者

お礼

適確なご回答をいただき、助かりました。

msnxl
質問者

補足

たしかに、「id」のカラムを autoincrement としています。 深くは考えていなかったのですが、やはり何か問題があるのでしょうか?

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 ざくっと拝見して何はともあれまず2点ほど。 1.サニタイズを忘れずに POSTから取ってきたデータをそのままINSERTの値に使っているようですが、セキュリティ上、危険極まりない行為です。 データの正当性チェック、サニタイズの双方は最低限行いましょう。 サニタイズについては、「サニタイズ」とか「SQL インジェクション」とかっていうキーワードでgoogleあたりで探してみてください。 2.INSERT文にはカラム名をつける INSERT INTO shoppingtable ですと、create tableの順番に左右されてしまうので。 きちんと丁寧に INSERT INTO shoppingtable(item, price) という風に記述されるとよろしいかと思います。 また何か質問などありましたらお気軽に。

msnxl
質問者

お礼

ご回答ありがとうございます。参考になりました!

msnxl
質問者

補足

ご教授ありがとうございます。サニタイズ等も必須項目として勉強していこうと思います。 たびたび申し訳なのですが、 $query = 'INSERT INTO shoppingtable (item,price) VALUES ('".$item."',".$price.")'にしたところ、以前のエラーはでなくなりました。ただ、('".$item."',".$price.")'の$itemの商品名の部分が 入力フォームで入力し、データベースでの表示時、select文でIEに表示したとき ???等と表示されてしまいます。$priceの価格(数字)部分はきちんと表示されるのですが。データベースではitemのフィールドタイプはtext、priceのフィールドタイプはint(整数)としています。 '".$item."'のコーテーション等の問題なのでしょうか? 重ねがさね質問の連続で申し訳ありません。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 テーブルの型はこちらの質問と同じでしょうか? http://okwave.jp/kotaeru.php3?q=2269367 で、フォームより受け取ったものを登録しようとしたらエラーが発生という形でしょうか。 まずSQLを発行してエラーが出た場合はそのSQLを画面に出してみるとエラーがつかみやすいです。 print $query; 多分表示されるのはINSERT INTO shoppingtable VALUES($item,$price) になってると思います。 '(シングルクォーテーション)で囲むとそのままでは変数は展開されません。 "INSERT INTO shoppingtable VALUES ( '$item', $price )"; としてみて下さい。 商品名は文字列ですからSQL発行する際に''する必要があったので追加しました。

msnxl
質問者

お礼

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

msnxl
質問者

補足

テーブルの型は以前のものと同じです。 "INSERT INTO shoppingtable VALUES ( '$item', $price )"; としてみたのですが、やはり、「Query failed: Column count doesn't match value count at row 1」と出ます。 print $query;としますと。 string(44) "INSERT INTO shoppingtable VALUES('なし',120)" INSERT INTO shoppingtable VALUES('なし',120) とでます。これはINSERTの文自体は問題ないということでしょうか? また、「Query failed: Column count doesn't match value count at row 1」はカラムカウントは列1で値のカウントに合いません。 と翻訳されると思うのですが。これはデータベースの方に問題があるのでしょうか?