カテゴリ: プログラミング, API, C/C++, Javascript/Java, PHP, CakePHP, WSH/VBScript

ページ: << 1 ... 6 7 8 9 10 11 12 13 14 15 16 >>

JSPでデータベース

パーマリンク 2008/09/18 19:36:38 著者: kumaold メール
カテゴリ: 仕事, プログラミング, Javascript/Java

ここ数日間、苦労してJSPでデータベース操作はできないものかと調べてました。

なかなかネット上に新しい有効な方法が少なくて苦労しましたが、やっと簡単にDBに接続する方法を見つけました。


以前からJSPタグライブラリを使っているのでそれを前提として書きます。
(普通に書くと多分もう少し面倒になりそう)


まず、PostgreSQL用のJDBCドライバをダウンロード。

こちらのページの「JDBC4 Postgresql Driver, Version 8.3-603

これをJSTLなどと同様のディレクトリ(webapps/jsp/WEB-INF/lib)に置く。
ついでに「postgresql.jar」などとリネーム(しなくてもいい)

で、Tomcatを再起動。

service tomcat restart


これで下準備は完了。

肝心の処理内容のソースコードはこちら。

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
    <title>JSPデータベース@タグライブラリ</title>
</head>
<body>

<%-- PostgreSQLデータベースに接続 --%>
<sql:setDataSource
    var="db"
    url="jdbc:postgresql://localhost/DBname"
    user="user"
    password="pass"
    driver="org.postgresql.Driver"
/>

<%-- SQLクエリを発行 --%>
<sql:query var="bbs" dataSource="${db}">
    SELECT * FROM bbs;
</sql:query>

<table border="1" cellspacing="0">
    <tr>
        <th>投稿ID</th><th>投稿者</th><th>投稿内容</th>
    </tr>
<c:forEach var="log" items="${bbs.rows}">
    <tr>
        <td>${log['id']}</td>
        <td>${log['name']}</td>
        <td>${log['post']}</td>
    </tr>
</c:forEach>
</table>

</body>
</html>


ここで全体の流れについて簡単な解説をしときます。
素のPHPでDBアクセスするときの流れにかなり近い感じです。


通常のcoreライブラリに加え、sqlタグライブラリをインクルード

<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>


初期設定をし、取得したデータソースをdbオブジェクトに格納する。
url には、「jdbc:postgresql://localhost/」に続けてデータベース名と入力。

<sql:setDataSource
    var="db"
    url="jdbc:postgresql://localhost/DBname"
    user="user"
    password="pass"
    driver="org.postgresql.Driver"
/>


SQL文を実行し、結果をbbsオブジェクトに返す。
sql="SQL文"として<sql:query />タグ内に書いても良い。

<sql:query var="bbs" dataSource="${db}">
    SELECT * FROM bbs;
</sql:query>


オブジェクトbbsのrowsを参照することで、1レコードを取り出すことができる。

あとはデータが連想配列になっているので、PHP同様にデータが取り出せる。

<c:forEach var="log" items="${bbs.rows}">
・・・
</c:forEach>

CakePHP 1.2でGROUP BY

パーマリンク 2008/09/16 19:53:48 著者: kumaold メール
カテゴリ: プログラミング, PHP, CakePHP

昨日無理矢理書いたアクセス解析集計ページのfind()の条件指定をもう少しスマートに書けないかと調べてみました。

まず、1.1との互換性の関係で古い書き方も許されていたため中途半端なfind()の条件指定になってしまったので、ここでひとつ統一したいと思います。


'fields'には、必要なフィールドを配列で区切って渡します。
'order'も同様、連想配列で分けて渡します。


今まで直接書けなかったGROUP BYですが、1.2 RC1(?)あたりから'group'という項目が追加されたようです。

そのおかげで'conditions'に無理に書いていたのが直接書くことができました。
 
 

$conds = array(
    'fields' = 'Host.org, COUNT(*) AS "Count__org"',
    'conditions' => 'GROUP BY Host.org',
    'order' => 'Count__org DESC'
);

これを新CakePHP 1.2流の書き方に直してみたのがこちら。

$conds = array(
    'fields' => array('Host.org', 'COUNT(*) AS "Count__org"'),
    'group' => 'Host.org',
    'order' => array('Count__org' => 'DESC')
);

訂正: groupに配列で値を入れるとエラーになります

断片的にSQL文の一部が隠れていたものが、スマートになりました。

知っていると得することも結構ありますね。
新リリース(次はRC3?)が出たら一通りの変更点を調べておくといいです。



CakePHP ポケットリファレンス (Pocket Reference)CakePHP ポケットリファレンス (Pocket Reference)
株式会社ブルーオーシャン 岡田 佳典

技術評論社 2008-06-18
売り上げランキング : 27145
おすすめ平均

Amazonで詳しく見る
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

開発合宿3日目

パーマリンク 2008/09/15 23:00:00 著者: kumaold メール
カテゴリ: 勉強会など, PHP

今日は二度寝する間もなく気づいたら8時半で、眠い中起きました。


合宿最終日、ということで今日こそそれなりに仕上げないといけません。

まずは持ち越し課題のデータ取得を、一覧ページを開いた時点でDBにデータが無かったら取得してくるようにし、自然に解析が出来るようにしました。


しかし解析データ追加ページでSQLエラーが出てしまいます。
データ追加自体はできているのでいいんですが、エラーが出ているというのはあまり気持ちのいいものではありません。


エラーを見ていると『duplicate key value violates unique constraint "ips_pkey"』と出て、何故か2重にINSERTが実行されてしまっている状況です。

一瞬出て消えるもう1つのエラーで存在しない「nextval(ips_id_seq)」とか実行されていることをみると、主キーがデフォルトのidでないのが原因のようでした。


そこでモデル内に主キーを設定する一文を追加し、解決しました。

var $primaryKey = 'ip';


最後に、解析・統計ができないと意味がないのでとりあえず実装してみました。


出力結果的にはこんなことがやりたかったわけですが、CakePHPには残念ながらそれが一発でできる関数がないんですよ。

アクセス元ホストアクセス数集計
OCN119
Yahoo! BB49
DION46


find('all')一覧出力+find('count')合計出力でfind('countAll')とか欲しいのに。

要はSQL文で GROUP BY の COUNT(*) すればいいだけなので、find('all')の条件式に無理矢理埋め込んでみました。

$conds = array(
    'fields' => 'Host.org, COUNT(*) AS "Count__org"',
    'conditions' => 'GROUP BY Host.org',
    'order' => 'Count__org DESC'
);


SQL文を直接叩いた方が綺麗な気がするが、まあ動くので良しとしよう。



改訂新版 SQLポケットリファレンス (Pocket reference)改訂新版 SQLポケットリファレンス (Pocket reference)
朝井 淳

技術評論社 2003-06-10
売り上げランキング : 37949
おすすめ平均

Amazonで詳しく見る
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

<< 1 ... 6 7 8 9 10 11 12 13 14 15 16 >>

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年3月
 << <   > >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

検索

XMLフィード

16ブログ     powered by b2evolution free blog software