CGIによるMySQLのデータの更新処理ができない問題

このQ&Aのポイント
  • Perlの勉強を兼ねて、ユーザ管理フォームのCGIを作成中ですが、MySQLのデータの更新処理がうまく行かない問題に困っています。更新処理を実行してもエラーは表示されず、更新されたかどうかをMySQLで確認しても、変わらない値が登録されています。
  • 特に「update文」の部分に問題があるのかもしれませんが、具体的な原因が分からずに進めていません。アドバイスをいただけると助かります。
  • 開発環境はFedora9で、MySQLのバージョンはmysql-5.0.77-1です。
回答を見る
  • ベストアンサー

CGIによる、MySQLのデータの更新処理が出来きず困ってます。

最近、perlの勉強をはじめ、 勉強がてら、 ユーザ管理フォームを作りたく CGIのソースを書いています。 データはMySQLに登録しています。 以下のプログラムを使用し、 データの更新をしたい際に、 更新作業を行うと、 エラーなどは出ず、 ソースにあるように、 「データを正常に更新しました」と表示されますが、 更新されたか?をMySQLで確認すると、 データが更新されておらず、 更新作業を行う前と何ら変わらない値が登録されています。 「update文」のあたりがおかしいのかな?と 感じたのですが、 どこが検討はずれなのか?が分からず、 前に進めないでいます。 アドバイスいただけると大変ありがたいです。 宜しくお願い致します。 ソースは以下の通りです。 ========================================= use CGI; use DBI; $form = CGI->new; print "Content-type: text/html\n\n"; print "<html><body>\n"; # DBに接続 $db=DBI->connect("DBI:mysql:dbname","username","pwd", {RaiseError => 0, PrintError => 1}); if(!$db){ print "失敗\n"; exit; } # UPDATE文作成 $sql = "update test20090702 set agent='$agent',attend='$attend',name='$name',sex='$sex',remarks='$remarks' where name='$name'"; # SQL実行 $sth = $db->prepare($sql); if(!$sth->execute){ print "SQL-fail\n"; exit; } # ステートクリア $sth->finish; # DB切断 $db->disconnect; print "データを正常に更新しました。\n"; print <<"HTML"; HTML ========================================= ■開発環境:Fedora9 ■MySQL:mysql-5.0.77-1

  • CGI
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答No.1

print $sql, '<br>, $db->errstr; くらいを書いておくと、何かわかるんじゃないでしょうか。

mami_try
質問者

お礼

talooさん アドバイスありがとうございます! print $sqlで、 問題の所在が明確になり、 改善に前進できました!

関連するQ&A

  • MySQLのトランザクションについて

    初めて質問します。 今、PerlのDBIを使ってMySQLのトランザクション処理にチャレンジしています。 ところが、rollback処理がうまくできません。 具体的には、 table2 がある状態で下のプログラムを動かすと、 エラーの表示が出るのに、 table1 は作成されました。 何らかのエラーがあれば、どちらも作成されないようにしたいです。 ======================================================= my %sql; $sql{db_name} = "database"; $sql{host} = "localhost"; $sql{user_name} = "user_name"; $sql{password} = "password"; use DBI; my $dbh = DBI->connect('DBI:mysql:'.$sql{db_name}.':'.$sql{host}, $sql{user_name}, $sql{password} ,{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &Err(); my $sth; my $re; eval { my $sql_string1 = "create table table1(`id` int);"; my $sql_string2 = "create table table2(`id` int);"; $sth = $dbh->prepare($sql_string1); $re = $sth->execute; $sth = $dbh->prepare($sql_string2); $re = $sth->execute; }; if ($@) { $tag="Err:".$@."\n"; $sth = $dbh->rollback; }else{ $sth = $dbh->commit; } $sth->finish; $dbh->disconnect; ======================================================= 検索して、いろいろいじっても解決しませんでした。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • データベース接続エラー

    質問させて頂きます。 環境はWin98SE ACTIVEPERLです。 mysql4.0です。 次のコードなんですか、 DB接続の部分とSQL実行の部分のエラー処理を消すと正常に動作します。 Perlの場合、どのようにエラー処理を記入したらいいのでしょうか? [コード] #!c:\perl\bin\perl.exe # DBI利用宣言 use DBI; print "Content-type: text/html\n\n"; print "<html><body>\n"; # MySQLに接続 $db=DBI->connect('DBI:mysql:test:localhost','',''); if(!$db){  print "MySQL接続エラー\n";  exit; } # ステートメントハンドルの作成:SQL文の指定 $sth = $db->prepare("select * from test_t"); # SQL実行 if(!$sth->execute()){  print "SQL実行エラー\n";  exit; } # 検索結果を表示 while (@rec = $sth->fetchrow_array()) {  print "id=" . $rec[0] . "\n";  print "name=" . $rec[1] . "\n";  print "<BR>\n"; } # ステートメントハンドルクリア $sth->finish();

    • ベストアンサー
    • Perl
  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • mysql perl  2回保存される。

    perlとmysqlを使っています。 htmlのformタグからえたテキストをCGIに送って データベースに保存しているのですが、送信ボタンを押すと2回データベースに 保存されてしまいます。 同じデータがふたつ保存されるのではなく、 一つ目はすべてNULLのデータが保存され 二つ目にmformの内容が保存されます。 CGIのほうのSQL文はひとつしか書いていません。for文も使っていません。 <-----以下form部分のソースーーーーー> print "<form method=\"POST\" action=\"./CGI/save_DB.cgi\" name=\"saveform_2\"target=\"subwindow\" onSubmit=\"openwin();\">"; print "<div>タイトル:<input type=\"text\" name=\"TITLE\" autocomplete=off value='"; print "$TITLE\'></div>"; print "<input type=\"submit\" value=\"保存\">"; print "</form>"; <-----以下save_DB.cgi SQL実行部分のソースーーーーー> my $TITLE = $cgi->param('TITLE'); my $dbh = DBI->connect("DBI:mysql:host=${db_host};database=${db_name}", $db_user, $db_pass); my $sth = $dbh->prepare("INSERT INTO テーブル名 ( `title`) VALUES ($TITLE); my $rv = $sth->execute(); データベースへの接続などの問題はありません。 ブラウザはクロームですが、IEで試しても同じ現象がでました。 考えられる原因、おもいあたる原因がありましたら、教えてください。 また、原因がわからなくても、回避できそうなやり方があれば教えてください。 よろしくお願いいたします。

  • CGIでマイSQLからデータを取得できない。

    Perl初心者です。レンタールサーバでmysqlからデータを取得して表示するプログラムを作りたいのですインターネットで捜したのですがよく分かりませんでした。申し訳ありませんが駄目出しでも結構ですので直すポイントになるようなアドバイス、お願い致します。 #!/usr/bin/perl #変数宣言 print "Content-type: text/html;\n\n"; use DBI; $ds = 'DBI:mysql:XXXXXXXXXXX:localhost'; $user = 'XXXXXXXXXX'; $pass = 'XXXXXXXXXX'; print "test<br>\n"; $db = DBI->connect($ds, $user, $pass) || die "Got error $DBI::errstr when connecting to $ds\n"; print "test<br>\n"; #$sth = $db->prepare("SELECT mei FROM name"); #$sth->execute; # バス経路票の中身を表示したかったたのですが出来ませんでした。 $sth= $db->prepare(qq(SELECT * FROM 'バス経路票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # 経路票の中身を表示したかったたのですが出来ませんでした。 $sth = $db->prepare(qq(SELECT * FROM '経路票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # 駅バス停関係票の中身を表示したかったたのですが出来ませんでした。 $sth = $db->prepare(qq(SELECT * FROM '駅バス停関係票')); $sth->execute; while(@row = $sth->fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); } # バス経路票の中身を表示したかったたのですが出来ませんでした。 print "@basskeiro<br>\n"; # 経路票の中身を表示したかったたのですが出来ませんでした。 print "@keiro<br>\n"; # 駅バス停関係票の中身を表示したかったたのですが出来ませんでした。 print "@bassteikeiro<br>\n"; print "test<br>\n"; $rc = $sth->finish; $rc = $db->disconnect; exit;

    • ベストアンサー
    • Perl
  • DBを用いたCGI認証スクリプト(perl、mysql)

    DBに一行一ユーザーの情報があり(メールアドレス 、パスワード)、 IDをメールアドレスとし、 入力したメールアドレスが登録されているか 入力したメールアドレスのパスワードがあっているか、 をチェックするスクリプトです。 初心者のためいろいろのサイトを見ながら作りましたが、下記のソースで何とか動いています。 が、これでよいのか(スマートかどうか)、もっと簡単な方法があるのかどうかをお聞きしたく、質問させていただきました。よろしくお願いいたします。 #!/usr/bin/perl use DBI; use CGI; require "cgi-lib.pl"; #フォームからIDとPWを受け取る &ReadParse(*form); $input_id= "$form{'アイディー'}"; $input_pw= "$form{'パスワード'}"; $TABLE_name = 'メールアドレス'; $form = CGI->new; $ret = eval{ $dbh = DBI->connect('DBI:*******************) }; if ( !$ret ) { print "接続エラーが発生しました\n"; exit(); } else{ print "OK\n"; $sql = "SELECT パスワード FROM $TABLE_name where メールアドレス='$input_id'"; $sth = $dbh->prepare($sql); if(!$sth->execute){ print "SQL実行エラー\n"; exit; } $num_rows = $sth->rows; if($num_rows==0){ print "このEmailは登録されていません。\n"; } else{ #ヒットしたemailの行にあるパスワード=$rec $rec = $sth->fetchrow_array(); #ヒットしたemailの行にある「パスワード=$rec」と入力したパスワードがマッチするかどうか if($rec eq $input_pw){ #認証OK!会員ページへ print "<br>認証OK!<br>"; } else{ #認証NG(Emailは登録されているが、登録したemailとパスワードが一致しない) print "パスワードが違います\n"; } } $sth->finish; $dbh->commit; $dbh->disconnect; }

    • ベストアンサー
    • Perl
  • mysql 最大値 取得 

    mysqlのデータベースから、列の最大値を取り出したいのですが、 以下のように書いているのですが、取得される値が1しか返ってこないです。 間違っているところはあるでしょうか? perlで書いています。 my $dbh = DBI->connect("DBI:mysql:host=${db_host};database=${db_name}", $db_user, $db_pass); my $sth = $dbh->prepare("SELECT MAX(列名) FROM テーブル名"); my $rv = $sth->execute(); print "$rv";

    • ベストアンサー
    • MySQL
  • ActivePerl を使用して MySQL に

    すいません、初心者です。 ActivePerl を使用して MySQL にアクセスしたいです。 windows7 64bit にActivePerlとMySQLを入れ込みました。 MySQLにアクセスするためのユーザー名やパスワードは root です。 login_data というテーブルを適当作成しました。 実際にアクセスしてみるには、どのようなコードを書けばいいでしょうか? =========================================== use strict; use warnings; # エラーをブラウザに表示 use CGI::Carp qw(fatalsToBrowser); use utf8; binmode STDIN, ':encoding(UTF-8)'; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; use Encode; use DBI; # プログラム開始 # ユーザ名とパスワード my $user = 'root'; my $pass = 'root'; #データベースへ接続 my $db = DBI->connect('DBI:MySQL:localhost:login_data', $user, $pass,); if ( ! $db ){ print "エラー: $db->err $db->errstr\n"; } # 命令 my $sth = $db->prepare( "select * from test" ); # 実行 $sth->execute; # 出力 while( my @row = $sth->fetchrow_array ){ print "@row\n"; } #データベースから切断 $db->disconnect; __END__

    • ベストアンサー
    • Perl
  • perlでmysqlに接続

    初歩的な質問で申し訳ありません。 perlでmysqlに接続できず困っています(OSはWindowsXPです)。 バージョンは下の通りです。 perl : ActivePerl-5.8.8.820-MSWin32-x86-274739 mysql : MySQL Server 5.0 DOSでppmを入力すると「perl package manager」というウィンドウが立ち上がり、「DBD-SQLite」と「DBI」をインストールすることができました。 サンプルコードは下の通りです。 #!C:/usr/local/Perl/bin/perl use DBI; $user = '*****'; $passwd = '*****'; $db = DBI->connect('DBI:mysql:bulletin_board:localhost', $user, $passwd); $sth = $db->prepare("SELECT * FROM data"); $sth->execute; $num_rows = $sth->rows; print "該当 $num_rows 件\n"; for ($i=0; $i<$num_rows; $i++) { @a = $sth->fetchrow_array; print "no=$a[0], title=$a[1] name=$a[2] \n"; } $sth->finish; $db->disconnect; DOSで実行すると C:\Program Files\War-ftpd\FTPRoot\usr\f-taka\cgi-bin>perl sqlTest.cgi install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: C:/usr/local/Perl/site/lib C:/usr/local/Perl/lib .) at (eval 4) line 3. Perhaps the DBD::mysql perl module hasn't been fully installed, or perhaps the capitalisation of 'mysql' isn't right. Available drivers: DBM, ExampleP, File, Gofer, Proxy, SQLite, Sponge. at sqlTest.cgi line 8 というエラーが出ました。原因は何なのでしょうか。 MySQL側で設定することはあるのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • Perl
  • mysqlのデータをperlで読み込んで????を表示される

    過去にもあった質問なのですが、アドバイスお願いします。 perlからmysqlにアクセスしてデータを読み込むと日本語が「??????」と表示されます。 バージョンは下の通りです。 perl:ActivePerl-5.8.8.820-MSWin32-x86-274739 mysql:5.0 OS:windowsXP mysqlの文字コードはstatusで確かめました。 mysql> status; -------------- mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32) Connection id: 74 Current database: Current user: ******@localhost SSL: Not in use Using delimiter: ; Server version: 5.0.27-community-nt Protocol version: 10 Connection: localhost via TCP/IP Server characterset: sjis Db characterset: sjis Client characterset: sjis Conn. characterset: sjis TCP port: 3306 Uptime: 3 hours 39 min 2 sec Threads: 1 Questions: 232 Slow queries: 0 Opens: 26 Flush tables: 1 Open ta bles: 0 Queries per second avg: 0.018 -------------- mysql> SELECT * FROM table1 と打てば、日本語は表示されます。 perlのコードのコードを書きます。 #!C:/usr/local/Perl/bin/perl print "Content-type: text/html;charset=Shift_JIS\n\n"; use DBI; $user = '***'; $passwd = '***'; $sql="SELECT * FROM categ"; ----略(HTMLタグ)------ $db = DBI->connect('DBI:mysql:board:localhost', $user, $passwd); $sth = $db->prepare($sql); $sth->execute; $num_rows = $sth->rows; $categ_num=$num_rows; for ($i=0; $i<$num_rows; $i++) { @a = $sth->fetchrow_array; print"$a[0] $a[1]<br>"; } $sth->finish; $db->disconnect; ----略(HTMLタグ)------ 結果 0 ????? 1 ????? ブラウザで文字の種類を変えても「?????」のままです。 mysqlのテーブルから取り出した値をjcode.plで変換しても変わらないようです。 &jcode::convert(\$categ[$i], "sjis"); print"<tr><td>no:$i $categ[$i] </td></tr>"; まだ、設定の足りないところがあるのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • MySQL