質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

2577閲覧

ActivePerl MySQL呼び出しコード記述

TomoyukiWatase

総合スコア15

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2017/04/08 20:23

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行目の何かが間違っているのかそれともそれ以外の行の書き方が違うのかわかりません。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Access denied って言われているので、まずはあなたが用意したデータベースの名前、ユーザー名、パスワードがあっているのか、DBD::mysql ではなく例えば MySQL Workbench から用意したデータベースに接続できるのかを確認するところから始めるのがよいでしょう。

...質問からは、Perl自体の書き方をまったく理解できていないようにも見受けられますが...

投稿2017/04/08 23:11

koko_u

総合スコア936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TomoyukiWatase

2017/04/09 02: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の勉強が不足しておりご迷惑をおかけしております。 よろしくお願いいたします。
koko_u

2017/04/09 02:30

基本は CPANのドキュメント(http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pm)を読むのがよいです。少なくとも日本語の解説記事を読んだあとに、正しいドキュメントを見ることには意味があります。 ドキュメントを見ると $dbstore = DBI->connect(...) で何やらマジカルな $dbstore が得られるので、これを使って、SQL文を準備して、クエリを実行して、結果を取得すればよさそうです。 ドキュメントを読む上で、ハッシュとは、リファレンスとは、デリファレンスとは、くらいが分かっていれば多分何とかなるはず。
TomoyukiWatase

2017/04/09 05:37

メッセージ頂戴しました。 ありがとうございました。 「少なくとも日本語の解説記事を読んだあとに、正しいドキュメントを見ることには意味があります。」 とのこと、確かに承りました。 私はPerlの勉強はまだまだですがご指摘いただきましたアドバイスを活用させていただきます。 それでは失礼いたします。
TomoyukiWatase

2017/04/14 18:49 編集

おかげさまで出力できました。ありがとうございました。 # 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;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問