初心者だけどPerlが大好き

コードが世界を変える!

Catalystのmodelの実装

まず フォームをつくりCGIでデータを入れましょう
話は そこからです

phpMyAdminで作成したテーブルの照合順序をLatin1〜からutf8_unicode_ciに!!
そうしないとphpMyAdmin内で日本語が文字化けします
このコード用のデータベースは

id    VARCHER 4
title VARCHER 20
price INT 11

以前 model を作るとき用意したDBは id をPRIMARY KEYにしたのですが
このコードの場合 id のPRIMARY KEY は解除してください

フォームを表示するCGI todb.cgi

#!C:/xampp/perl/bin/perl
use utf8;
use CGI;
$q = new CGI;
print $q->header(-charset => 'utf-8'),
$q->start_html(-title=>"データベースにデータをいれるよ"),
$q->h1(' データベースにデータをいれるよ'),
$q->start_form(-action=>'makedb.cgi'),
$q->em("id"),
$q->textfield(-name=>'id'),
$q->br,
$q->em("title"),
$q->textfield(-name=>'title'),
$q->br,
$q->em("price"),
$q->textfield(-name=>'price'),
$q->reset,
$q->submit(-name =>'Action', -value =>'送信'),
$q->end_form,
$q->end_html;

データベースにデータを送るCGI makedb.cgi

#!C:/xampp/perl/bin/perl -w
use CGI;
use DBI;
use utf8;
$dbname = "nagoya";
$user = "e2ko777";
$passwd = "7777777";
$tbname = "book";
$host = "localhost";
$q = new CGI;
$id=$q->param('id');
$title=$q->param('title');
$price=$q->param('price');
print $q->header(-type =>'text/html', -charset =>'utf-8');
print $q->start_html;
# DBに接続
$dbh=DBI->connect("DBI:mysql:$dbname;host=$host", $user, $passwd,
                 {RaiseError => 0, PrintError => 1});
if(!$dbh){print "接続失敗\n";  exit;}
$dbh->do("SET NAMES utf8"); 
# INSERT文作成
$sql="insert into $tbname(id,title,price)
values('$id','$title','$price')";
# SQL実行
$sth = $dbh->prepare($sql);
if(!$sth->execute){
    print "SQL失敗\n";
    exit;
}
# ステートメントハンドルクリア
$sth->finish;
# DB切断
$dbh->disconnect;
print "登録完了\n";
print $q->end_html;


1 初めてのPerl第6版 3780
2 業務に役立つPerl 2919
3 モダンPerl入門 2940
4 Perl CPANモジュールガイド 2730
5 すぐわかる オブジェクト指向 Perl 3780
6 PerlフレームワークCatalyst完全入門 4410
7 かんたんプログラミング CGI/Perl 2709
8 Perl逆引きクイックリファレンス 2800

そして AppNameがnagoya というフォルダのcontroller に nagoyan を作成します
以前 nagoyaで作成しましたが AppNameと重なって紛らわしいので nagoyanに。

nagoyan の中をいじります

package nagoya::Controller::nagoyan;
use strict;
use warnings;
use base 'Catalyst::Controller';
sub index : Private {
my ( $self, $c ) = @_;
$c->response->body('Matched nagoya::Controller::nagoyan in nagoyan.');
}
sub default :Path {
my ( $self, $c ) = @_;
$c->response->body( 'Page not found' );
$c->response->status(404);
}
sub hello :Local {
my ( $self, $c ) = @_;
$c->response->body('Hello!! Catalystは面白いね!');
}
sub indexView :Local {
my ( $self, $c ) = @_;
$c->stash->{msg} = 'YAPC::Asia2012は9月27日(木)9月28日(金)9月29日(土)';
}
sub data :Local {
my ($self, $c) = @_;
$c->stash->{data} = [$c->model('nagoyaDB::Book')->all];
# $c->model('nagoyaDB')->storage->debug(1);
}
sub bookstore :Local {
my ($self, $c) = @_;
$c->model('nagoyaDB::Book')->create(
{id=>9,title=>'Perlクックブック',price=>5145});

$c->model('nagoyaDB::Book')->create(
{id=>10,title=>'Perlベストプラクティス',price=>4515});
$c->stash->{data} = [$c->model('nagoyaDB::Book')->all()];
# $c->model('nagoyaDB')->storage->debug(1);
}
1;


root nagoyan の中に .ttファイルを作ります

indexView.tt

<html>
<head>
<title>[% msg | html %]</title>
</head>
<body>
[% msg | html %]
</body>
</html>

data.tt

<html>
<head>
<title>本の在庫</title>
</head>
<body>
<table border="1">
<tr>
  <th>ID</th><th>書名</th><th>価格</th>
  </tr>
[% FOREACH item = data %]
  <tr>
    <td>[% item.id | html %]</td>
    <td>[% item.title | html  %]</td>
    <td>[% item.price %]円</td>
  </tr>
[% END %]
</table>
</body>
</html>


bookstore.tt

<html>
<head>
<title>本の在庫</title>
</head>
<body>
<table border="1">
<tr>
  <th>ID</th><th>書名</th><th>価格</th>
  </tr>
[% FOREACH item = data %]
  <tr>
    <td>[% item.id | html %]</td>
    <td>[% item.title | html  %]</td>
    <td>[% item.price %]円</td>
  </tr>
[% END %]
</table>
</body>
</html>

組み込みサーバーの localhost:3000を起動します