• 締切済み

データベースへのデータの受け渡し

今データベースとCGIを自分で作り掲示板のような物を作成しています。 その中で、データベースにデータを受け渡す部分を if($syoujyou ne "" and $geninn eq "" and $taisyo eq ""){ $INS = $dbh->prepare("INSERT INTO $DBtable (syurui,syoujyou,geninn,taisyo) VALUES (\'$syurui\',\'$syoujyou\',\'$geninn\',\'$taisyo\')"); $INS->execute or $err2 = "execute"; } 上記のように記述しています。 このままでCGIを実行し、書き込みを行うとデータがデータベースに受け渡されません。 試しにif文を除き強制的に実行してもダメでした。 その代わり、if文を除くと何も書き込まない状態(受け渡しの変数内<(\'$syurui\',\'$syoujyou\',\'$geninn\',\'$taisyo\')>がNULL)だと書き込まれます。 つまりデータベースには何もない状態でテーブルの中にカラムが作成されます。 データベースは create table データベース名 ( id INT(4) AUTO_INCREMENT NOT NULL, syurui TEXT NOT NULL , syoujyou TEXT NOT NULL, geninn TEXT NOT NULL, taisyo TEXT NOT NULL, PRIMARY KEY(id) ) AUTO_INCREMENT = 1; のようにして作っています。 更に、上記の中のINSERT文をprintし、表示された物 INSERT INTO データベースの名前 (syurui,syoujyou,geninn,taisyo) VALUES ('ハード','あ','い','う') を直接プロンプトから実行した場合データは正しく挿入されます。 更にデータを消す文として if(($delpass == '****') and ($delfilid ne "")){ $DELETE = $dbh->prepare("DELETE FROM $DBtable WHERE id=\'$delfilid\'"); $DELETE->execute; $DELETE->finish; } と記述しているのですが、これは正常に動作します。 何がいけないのかが判らないので詳しい方教えてください。

みんなの回答

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.4

こんにちは、#3です。 >このスクリプトは動きました! >何故自分で書いた者でuse strict;が許可されなかったのかは、まだわからないんですが… >でもデータベースにデータは入りませんでした。 finish!とブラウザに表示されたけど データは入ってなかったって事ですか? ちょっと簡単にテストできる環境がないのでアレなんですが… 以下を変更してやってみてください。 my $db = DBI->connect("DBI:mysql:$database:localhost", $user, $passwd , { RaiseError => 1, AutoCommit => 0 }) or die $db->errstr; my $sth = $db->prepare("INSERT INTO $table (id,syurui,syoujyou,geninn,taisyo) VALUES(?,?,?,?,?)") or die $db->errstr; $sth->execute(undef,'test1','test2','test3','test4') or die $db->errstr; die しなかったらデータは入っていると思うんですが… あと、データの確認はどうやっているんですか?

すると、全ての回答が全文表示されます。
  • g_p_
  • ベストアンサー率53% (28/52)
回答No.3

こんにちは、 とりあえず、 http://search.cpan.org/~timb/DBI-1.58/DBI.pm にならって、短くて単純なスクリプトを書いてみたらどうですか? 例えば以下の様な感じで  (特に詳しい人間じゃありませんし、テストはしてませんので動く保障はなしでお願いします。) #! /usr/bin/perl use strict; use warnings; use DBI; use CGI::Carp qw(fatalsToBrowser); my $user = 'your_name'; my $passwd = 'password'; my $database = 'database'; my $table = 'table'; my $db = DBI->connect("DBI:mysql:$database:localhost", $user, $passwd , { RaiseError => 1, AutoCommit => 0 }); my $sth = $db->prepare("INSERT INTO $table (id,syurui,syoujyou,geninn,taisyo) VALUES(?,?,?,?,?)"); $sth->execute(undef,'test1','test2','test3','test4'); $sth->finish(); $db->disconnect(); print << "EOD"; Content-Type: text/html finish! EOD __END__ use strict; した短いスクリプトを出して、 うまくいかないんですけど助けて!って質問したら、 良い回答が付きやすいと思いますよ。 まあ、データベースがらみの問題もあるかも知れないので、 一概には言えないかも知れませんが。 参考になればいいですけど。

参考URL:
http://search.cpan.org/~timb/DBI-1.58/DBI.pm
tamanele
質問者

補足

このスクリプトは動きました! 何故自分で書いた者でuse strict;が許可されなかったのかは、まだわからないんですが… でもデータベースにデータは入りませんでした。

すると、全ての回答が全文表示されます。
  • necomimi3
  • ベストアンサー率40% (124/307)
回答No.2

$INS->execute or $err2 = "execute"; 最近のコーディングの主流なんでしょうかね わたしの知らないことばかり(^w^ これだと、式の評価の順によっては片方は実行されないんじゃ ないでしょうか。 $err2 = "execute";が先に評価されればexecute は実行しないと 思います。 他にも突っ込みところはありますが…

tamanele
質問者

補足

$INS->execute のみにしたとしても無理でした。 単純にperlからだとデータのINSERTのみが出来ないと言う状況です。 DELETE等は出来ますので。 しかし、直接MySqlにでINSERTを入力すると受け付けてくれます。 DB自体の権限の問題かとも思い、CGIからDBを操作するユーザーをrootにしてみましたが駄目でした。 他の突っ込み所も指摘お願いしますm(__)m

すると、全ての回答が全文表示されます。
  • nov-d
  • ベストアンサー率36% (51/140)
回答No.1

if文中の > $syoujyou ne "" and $geninn eq "" and $taisyo eq "" のand条件が、テーブル側の > syoujyou TEXT NOT NULL, > geninn TEXT NOT NULL, > taisyo TEXT NOT NULL, の各not null条件と矛盾しているのではないでしょうか? 「$syoujyou ne ""」はいいと思いますが、「$geninn eq ""」と「$taisyo eq ""」がandで結ばれているために両方ともnullじゃないとifの中に入れず、入ったら今度はテーブルのnot null制約ではじかれている状態ではないかと思うのですが。。。 試しに > geninn TEXT NOT NULL, > taisyo TEXT NOT NULL, のnot nullを外してみられてはいかがでしょうか?

tamanele
質問者

補足

create table データベース名 ( id INT(4) AUTO_INCREMENT NOT NULL, syurui TEXT, syoujyou TEXT, geninn TEXT, taisyo TEXT, PRIMARY KEY(id) ) AUTO_INCREMENT = 1; としてデータベースを作成してみました。 その後CGI内のINSERT文のifを外して強制的に実行しましたが、現状は変わらずでした。 何か権限のような物で書き込めないのでしょうか? 試しにエラー検証をした所、 $INS->execute or $err2 = "execute"; の部分(INSERT分のすぐ後)でエラーが出ています。 つまり$INS->executeが実行されていないわけです。 ですが、DELETEの場合はちゃんと実行されているので接続が出来てないとかでは無いと思うのです。

すると、全ての回答が全文表示されます。

関連するQ&A