CGIでMySQLからデータを取得できない

このQ&Aのポイント
  • Perl初心者の方がレンタルサーバ上でMySQLからデータを取得して表示するプログラムを作成したいとのことですが、どうしてもうまくいかないようです。
  • バス経路票や経路票、駅バス停関係票の中身を表示したかったそうですが、期待した結果が得られずに困っています。
  • アドバイスや修正ポイントを教えていただけると助かります。
回答を見る
  • ベストアンサー

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
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • diszo
  • ベストアンサー率78% (32/41)
回答No.3

No.1です。 MySQLの文字コードの確認を行ってください。 また、ソースコードの文字コードはどのようになっているでしょうか? また、テーブル名などを英数字にすることは、不可能なのでしょうか? テーブル名を日本語にしたことがないのですが、 いらぬところで、はまったりしそうなので。。。 ためしに、英数字のテーブルでスクリプトを試してみては いかがでしょうか? ソースコード的には、動かないものではなさそうですので。

gusutaf
質問者

お礼

解決しました。ありがとうございます。

gusutaf
質問者

補足

返信遅れて申し訳ありません。確認いたします。

その他の回答 (2)

  • YkazubonY
  • ベストアンサー率30% (26/86)
回答No.2

perlにモジュールDBIがインストールされていないのでは。 他にも、DBD::mysql?の様なモジュールもインストールされていないのでは。

gusutaf
質問者

お礼

解決しました。ありがとうございます。

gusutaf
質問者

補足

返信遅れて申し訳ありません。確認いたします。

  • diszo
  • ベストアンサー率78% (32/41)
回答No.1

気になった点を上げさせていただきます。 ご参考になれば幸いです。 1.テーブル名が日本語ですが、MySQLで使用する場合は、   バッククォート「`」で囲むのでは?    2.executeの文に、エラー表示を付けた方がいいと思います。   execute || print $sth->errstr();   #これで、CGI経由でもSQLのエラーが取得できます。

gusutaf
質問者

補足

コメント、ありがとうございます。 修正したら以下が表示されました。 test test You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''`ƒoƒXŒo˜H•[`' at line 1Invalid utf8 character string: 'Œo˜H•['Invalid utf8 character string: '‰wƒoƒX’âŠÖŒW•[' test インターネットでも調べたのですが分かりませんでした。何だろ???

関連するQ&A

  • データベース接続エラー

    質問させて頂きます。 環境は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
  • 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
  • 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 最大値 取得 

    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
  • 一回の処理で、2回以上データベースに対してアクセスできない??(perlDBIを使用)

    質問があるのですが、よろしくお願いします。 use DBI; $dbuser = 'root'; $passwd = 'abc'; $db = DBI->connect('DBI:mysql:DB:localhost',$dbuser, $passwd); $prepare = "select MAIL from user where USER_ID = $userid"; $sth->prepare("$prepare"); $sth->execute; @user = $sth->fetchrow_array; $sth->finish; while( ($key, $value) = each %in ){ $sth = $db->prepare("UPDATE user SET $key = '$value' where USER_ID = $in{userid}"); $sth->execute; $sth->finish; } $db->disconnect; という処理を行わせたいのですが、どうもUPDATE文の辺りで、処理が止まってしまっているようなのです。select文はしっかり実行されている形跡があるのですが、1回の処理で2回以上データベースに対してアクセスすることは出来ないのでしょうか? どなたか分かる方いらっしゃいましたらご教授のほどよろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースから取得したデータを配列に格納

    データベースから取得したデータを配列に格納することができません。 唯一、以下の方法で格納できたのですが、この場合データベースの項目の数が、あらかじめ分かっている場合にしか使用できません。googleで検索して出てくるサンプルは全てループ内でprintしているので参考になりませんでした。 やりたいことは単純で、データベースにクエリーを発行した結果の複数レコードをそのまま配列に格納することです。perlに詳しい方がおられましたらよろしくお願いします。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ■データベース内のデータ id=1,subid=1,data1=aaa id=1,subid=2,data1=bbb id=1,subid=3,data1=ccc ■期待する結果 @result = ("1","1","aaa", "1","2","bbb", "1","3","ccc", ) _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ■実際のソース ********************************************************** use DBI; #//■DB接続 $db = DBI->connect("DBI:mysql:$DbName:$DbHost", $DbUser, $DbPass); $sth = $db->prepare($sql); $sth->execute; $cnt = $sth->rows; for($i=0; $i<$cnt; $i++){ @work = $sth->fetchrow_array; @result[$i] = ([$work[0],$work[1],$work[2],]); } #//■CLOSE $sth->finish; $db->disconnect; for($i=0; $i<$cnt; $i++){ print "<p>".$result[$i][0]."/".$result[$i][1]."/".$result[$i][2]."</p>\n"; } **********************************************************

    • ベストアンサー
    • Perl
  • perlからmysqlに接続できない

    #! c:/perl/bin/perl  use DBI; $user = 'root'; $passwd = 'パスワード'; $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO bunrui VALUES (1,'1st','memo')"); $sth->execute; $sth->finish; $db->disconnect; perlからmysql二接続するためDBIをインストールして、上のようなサンプルコードを実行してみたのですが Internal Server Error になってしまいます。どこかコードが違っているのでしょうか?

    • ベストアンサー
    • Perl
  • perlのプログラムでエラーが出ます。

    普段PHPerなんですがbatchの関係でperlを使用しなければならなくなり書いていたんですが、 下記のソースコードの中でINSERT INTOの部分でエラーが発生してしまいます。 最初selectしている部分はcreate tableで作っているテーブル構成と同じです。 それからサイト名に関するレコード部分は*で隠しています。 よろしくお願いいたします。 #!/usr/bin/perl use DBI; # データソース $d = 'DBI:mysql:a_anime'; # ユーザ名 $u = '************'; # パスワード $p = '************'; # データベースへ接続 $dbh = DBI->connect($d, $u, $p); $sth = $dbh->prepare("select * from tweet where tweetid BETWEEN '1' AND '21562745' limit 5"); $sth->execute; while( @row = $sth->fetchrow_array ){ $priduct_id = @row['3']; $user_url = @row['6']; $sth2 = $dbh->prepare("show tables from a_anime like 'tweet_@row['3']'"); $sth2->execute; @row2 = $sth2->rows; $sth2->finish; if (@row2 != 1){ $sth22 = $dbh->prepare("CREATE TABLE `tweet_@row['3']` ( `id` int(255) NOT NULL auto_increment, `userid` int(25) DEFAULT NULL, `text` text NOT NULL, `product_id` int(255) NOT NULL, `product_name` varchar(30) NOT NULL, `date` varchar(20) NOT NULL, `user_url` varchar(160) NOT NULL, `username` varchar(100) NOT NULL, `flag` int(1) NOT NULL DEFAULT '1', `rev_point` int(1) NOT NULL DEFAULT '1', `t_tweetid` bigint(255) DEFAULT NULL, `rev_id` int(10) DEFAULT NULL, `rev_flag` int(1) NOT NULL DEFAULT '0', `*****_flag` int(1) DEFAULT NULL, `res_info` int(100) DEFAULT NULL, `fav_info` int(255) DEFAULT NULL, `user_img` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`), KEY `index3` (`flag`), KEY `user url` (`user_url`), KEY `t_tweetid` (`t_tweetid`), KEY `index4` (`flag`,`rev_point`,`product_id`), KEY `index5` (`flag`,`product_id`), KEY `index6` (`userid`,`flag`), KEY `index7` (`username`,`flag`), FULLTEXT KEY `index2` (`text`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8"); $sth22->execute; $sth22->finish; } $sth3 = $dbh->prepare("select user_url from tweet_@row['3']"); $sth3->execute; print "@row['3']\n"; print "@row['6']\n"; @row3 = $sth3->fetchrow_array; $sth3->finish; #if ($user_url != $row3){ print @row['2'] ; print "\n"; $sth4 = $dbh->prepare("INSERT INTO tweet_@row['3'] VALUES (@row['1'],@row['2'],@row['3'],@row['4'],@row['5'],@row['6'],@row['7'],@row['8'],@row['9'],@row['10'],@row['11'],@row['12'],@row['13'],@row['14'],@row['15'],@row['16'])"); print $sth4; print "\n"; $sth4->execute; $sth4->finish; } } $sth->finish; $dbh->disconnect;

  • DBの検索

    #!C:\Perl\bin\perl use DBI; $shouhinmei="手袋"; $db=DBI->connect("DBI:mysql:example_DB:localhost","user","password",{RaiseError => 0,PrintError => 1}); if(!$db){ print "接続は失敗です\n"; exit; } $sql="select * from shouhin_tbl"; $sql.="where shouhinmei='" . $shouhinmei . "'"; $sth=$db->prepare($sql); if(!$sth->execute){ print "SQLの失敗です\n"; exit; } *********************************** *********************************** $sth->finish; $db->disconnect; この***で囲まれた部分に、次のような処理を行いたいのですが、どのように書いたらいいのでしょうか。 『selectのSQLが成功したとき、DBのshouhinmeiフィールドに「手袋」がすでにあるならば、そのshouhinmei_idをブラウザに表示させ、』 shouhinmeiフィールドに「手袋」がなければ、 $sql="insert into shouhin_tbl(shouhinmei)"; $sql.="values('" . $shouhinmei . "')"; として追加させたいのですが、『』はどう書いたらいいか教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlでSQLiteを使おうとしてもうまく行きません

    下記のような感じでPerlプログラムからSQLiteのデータベースから読み出すプログラムを組んでみました。 もちろん、実際にデータベースのファイルを作ってあります。 下のように、かなりシンプルで簡単なプログラムですし、 間違ってもいないとは思うのですが・・・ use DBI; $db = DBI->connect("dbi:SQLite:dbname=accountdb","","",); $sth = $db->prepare("SELECT * FROM user"); $sth->execute;#結果を取得しresに代入 print "$sth\n"; $sth->finish; exit; 上を実行した結果は、下記の通りです。 DBI::st=HASH(0x32706c4) closing dbh with active statement handles during global destruction. 私が思うに、データが$sthに帰って来ると思うのですが、 実際にはDBI::st=HASH(*****)のようなものしかかえってきません アドバイスをどうか宜しく御願いします (別カテゴリで似たような質問をさせていただきましたが、これはまた別です・・・)

専門家に質問してみよう