ActivePerl MySQL呼び出しコード記述
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,408
Windows10を使用しています。ActivePerlのコードでMySQLの行列を呼び出す方法をお伺いします。DBD-mysqlはインストール済み。
使用させていただいたコードは次の通りです。
!/usr/bin/perl
PERL MODULES WE WILL BE USING
use DBI;
use DBD::mysql;
HTTP HEADER
print "Content-type: text/html \n\n";
CONFIG VARIABLES
$platform = "mysql";
$database = "db1";
$host = "localhost";
$port = "3306";
$tablename = "t1";
$user = "username";
$pw = "password";
DATA SOURCE NAME
$dsn = "dbi:mysql:$database:localhost:3306";
PERL DBI CONNECT (RENAMED HANDLE)
$dbstore = DBI->connect($dsn, $user, $pw) or die "Unable to connect: $DBI::errstr\n";
(出典:http://stackoverflow.com/questions/6649456/error-handling-on-dbi-connect)
エラーは次のように出ました。
DBI connect('db1:localhost:3306','username',...) failed: Access denied for user 'username'@'localhost'(using password: YES) at ... .pl line 23.
CONFIG VARIABLESの正しい記述がわかりません。socketは書く必要はありますか?またPERL DBI CONNECTの「DBI->connect」の後のカッコの中の書き方が特にわかりません。その前に$dsnで一度データソースを"dbi:mysql:$database:localhost:3306"と置いていた後その$dsnを「DBI->connect」の後に記述しているようです。この書き方ではconnectできないようです。「$dsn, $user, $pw」その他にも記述するのに必要な変数はありますでしょうか?23行目の何かが間違っているのかそれともそれ以外の行の書き方が違うのかわかりません。よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
Access denied って言われているので、まずはあなたが用意したデータベースの名前、ユーザー名、パスワードがあっているのか、DBD::mysql ではなく例えば MySQL Workbench から用意したデータベースに接続できるのかを確認するところから始めるのがよいでしょう。
...質問からは、Perl自体の書き方をまったく理解できていないようにも見受けられますが...
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/04/09 11:06
力は『Perlの絵本』を少しかじった程度です。勉強不足なので、質問の際適切な用語が出てこず、お読みになりづらい印象を与えてしまったかもしれません、大変申し訳ありません。
ご回答をいただいた後、
mysql> SELECT Host, User FROM mysql.user;でユーザー名とホストを取得しました。
Host User
127.0.0.1 root
::1 root
localhost root
localhost testuser
さらに「$user = "username"; 」を「$user = "localhost";」に、「$pw = "password";」のpasswordを私のパスワードを入力しました(以下の通り)。
# CONFIG VARIABLES
$platform = "mysql";
$database = "db1";
$host = "localhost";
$port = "3306";
$tablename = "t1";
$user = "root";
$pw = "XXXXXXXXX";
結果は「Content-type: text/html」というヘッダーだけ出力されその後改行が2行だけでした。
Content-type: text/html(改行)
(改行)
出力させたいデータベース名は'db1'、テーブル名は't1'です。目標は
a b
1 Sakura
2 Tsubaki
3 Kiku
というようなデーターベースのテーブルを表示させることです。こうなると良いのですが...
というわけでして「Access denied」というメッセージは回避できましたけれども、あともう少しだと思います。
因みに「print "Content-type: text/html \n\n";」を消去しても結果は空の行一行だけでした。
申し訳ありません、Perlの勉強が不足しておりご迷惑をおかけしております。
よろしくお願いいたします。
2017/04/09 11:30
ドキュメントを見ると $dbstore = DBI->connect(...) で何やらマジカルな $dbstore が得られるので、これを使って、SQL文を準備して、クエリを実行して、結果を取得すればよさそうです。
ドキュメントを読む上で、ハッシュとは、リファレンスとは、デリファレンスとは、くらいが分かっていれば多分何とかなるはず。
2017/04/09 14:37
ありがとうございました。
「少なくとも日本語の解説記事を読んだあとに、正しいドキュメントを見ることには意味があります。」
とのこと、確かに承りました。
私はPerlの勉強はまだまだですがご指摘いただきましたアドバイスを活用させていただきます。
それでは失礼いたします。
2017/04/13 20:50 編集
# DBI モジュールの読みこみ
use DBI;
# データソース
$d = 'DBI:mysql:db1';
# ユーザ名
$u = 'root';
# パスワード
$p = 'xxxxxxxxx';
# データベースへ接続
$dbh = DBI->connect($d, $u, $p);
# SQL文を用意
$sth = $dbh->prepare("select*from t1");
# SQLを実行
$sth->execute;
# データを問い合わせ結果を取得
while (my $ary_ref = $sth->fetchrow_arrayref) {
my ($a, $b) = @$ary_ref;
print "$a, $b\n";
}
# ステートメントハンドルオブジェクトを閉じる
$sth->finish;
# データベースハンドルオブジェクトを閉じる
$dbh->disconnect;