BANSYSTEMSBLOG

Load of the ○○○○PHP!?

お疲れ様です。
VCでSQLServerに接続する方法がMSDNにかいてありますので
それを予習したほうがいいかもしません。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/howtosql/ht_6_odbcht_1g1g.asp

またVCのヘルプは英語が多いので英語も読まなければならなくなります。
がんばってください。

多くの情報がデータベースのレコードを配列に格納してからダウンロード処理にするという方法であった。しかしどうにも、おかしい。ヘッダーで出力するのであれば、ページに表示するだけでいいと思った。
なぜわざわざ配列に格納する必要があるのか?
結構なメモリを消費してしまってるように思う。
しかも私が行おうとしていることは5万件以上のCSVエクスポート。
わざわざ配列に格納していては埒があかない。
なので調査した結果やはりそうであった。
単純に、echoとしてDBの結果を表示するだけでOKなのだ。
phpPgAdminのソースコードを読んでみても特に
CSVを配列に格納している記述は無かったので、そこからわかったのだが、うーん。
配列に格納することを当たり前の処理のように紹介しているページはちょっとどうかと思う。
下記のコードはあくまで参考。
クラスを使っているところがあるが、そのまま貼付けただけなので。

/*
echoするだけでCSV出力可能です。
**/
function csv_export() {
// ダウンロードするファイル名
$down_file = date(’Ymd’) . ‘.csv’;
// CSVの出力
header (”Content-Type: application/download”);
header (”Content-Disposition: attachment; filename=” . $down_file);
if (!isset($this->view) ||$this->view == “meisai”) {
$sql = $this->sql_contents();
} else {
$sql = $this->sql_accesslog_count();
}
$res = $this->postgres->doQuery($sql);
$f = $this->postgres->num_fields($res);
while($row = $this->postgres->fetch_array($res)) {
for ($i=0; $i<$f; $i++) {
echo mb_convert_encoding($row[$i],'SJIS', 'EUC-JP').",";
}
echo "?n";
}
$this->postgres->freeResult($res);
}

以下のページのやり方が最適だと思う。

データベースをCSV形式でダウンロード

DBのString型の列から数値のみにして数値として変換し使用したいときは多々あります。
以下は文字列を抜き出し数値のみにし、intへ変換し抽出するSQL文です。

select cast(translate(content_id,’movie’,”) as int) as content_id from accesslog
where strpos(content_id,’movie’) = 1;

列の値が
movie000001


movie999999
とあったときに1?100などの指定ができて便利です。
列の値を変更すれば?
と思うかもしれませんが、クライアントにデータの指定などをされているときはこちらで勝手にテーブル定義は変更できませんのであるデータを変換して使用する事が必要になります。
範囲を抽出するには

select content_id as content_id from accesslog
where cast(translate(content_id,’movie’,”) as int) between 1 and 100

とすると、movie000001から000100までのレコードが抽出されます。

本日、O氏がPHP4.3.10のインストールしていましたが、なかなかインストールできませんでした。途中までは自分は他の仕事をしていたので全く見ていませんでしたが、どうにも気になったので、自分もやってみると、makeの途中でエラーが…。
2、3回やっても出ます。
もしかしてにいさん、何時間もの間、これ繰り返してたのかな?
ま、しょうがないけど。
でもため息付きすぎ。
とりあえず、PHP4.3.9で試してみる事に。
今度はmakeは成功。complete!
ま、でもそんなもんですよ。
めげずにがんばりましょう。
PHPのコンパイルオプション

./configure –with-apxs=/usr/local/apache/bin/apxs ?
–with-pgsql=/usr/local/pgsql ?
–with-config-file-path=/usr/local/apache/conf/php ?
–enable-mbstring –enable-mbstr-enc-trans –enable-mbregex

ファイルのダウンロード作成方法。
結局マニュアルが一番わかりやすいし、便利。

aarondunlap.com
28-Dec-2004 05:17

今後のすぐに貼付けられるようにここに書いておく。

/*
EUC-JPをSJISへ変換しCSV(カンマ区切り)でファイルを作成する。
**/
function csv_export() {
$file_name = “dump.csv”;
@$file = fopen($file_name, “a”) or die(”ファイルオープンエラー”);
flock($file, LOCK_EX);
$row = $this->doQuery();
$cnt = count($row);
for ($i=0; $i<$cnt; $i++) {
while (list($key,$val) = each($row[$i])) {
fputs($file,mb_convert_encoding($val.",","SJIS","EUC-JP"));
}
fputs($file,"?n");
}
flock($file, LOCK_UN);
fclose($file);
$this->http_header_output($file_name);
}

ファイルのダウンロード

/*
作成したCSVファイルをHTTPヘッダー出力する。
**/
function http_header_output($file_name) {
//echo $file_name;
//exit;
$len = filesize($file_name);
header(”Content-type: application/force-download”);
header(”Content-Disposition: attachment ; filename=$file_name”);
header(”Content-Length: “. $len) ;
//ファイル出力(文字コード変換含む)
$kanji_code=mb_internal_encoding(); // 現在の内部文字コードをキープ
mb_http_output(”SJIS”); // HTTP文字コードをSJISに明示的に設定
readfile($file_name); // ファイルを読み込んでHTTP出力
mb_internal_encoding($kanji_code); // 内部文字コードを元に戻す
//テンポラリファイルを削除
unlink($file_name);
}

eclipse001.jpg
MacOSXでの日本語化の設定をずっとやっていましたが、
なかなかできませんでした。
ほとんどの情報が

eclipse2.1.2.1-SDK-linux-gtk-LanguagePackFeature.zip

をダウンロードして上書きするような事がかいてありましたが、
最後にたどり着いたページでやっと解決しました。
以下のようにやる事で日本語化が可能でした。

Eclipse(v3.0)は対応するプラットフォームごとにバイナリが用意されているので、以下に示す手順に従いインストール作業を進めてほしい。なお、日本語化パッチをMergeDocプロジェクトのWebサイトから入手し、バイナリ(eclipse-SDK-3.0-macosx-carbon.tar.gz)と同じディレクトリに保存した状態から作業を開始すること。

なおかつ解凍やコピーはターミナル上で処理する事。
ドラッグ&ドロップではうまくできません。

$ curl -O ftp://ftp.ring.gr.jp/pub/misc/eclipse/downloads/drops/R-3.0-200406251208/eclipse-SDK-3.0-macosx-carbon.tar.gz
$ tar xzf eclipse-SDK-3.0-macosx-carbon.tar.gz
$ rm -rf ./eclipse/configuration/
$ cd eclipse
$ unzip ../eclipse3.0-JapanesePatch.zip

MacOSXの情報は少ないので探すのに非常に時間かかります。

簡単に抽出できます。

select * from A where F1 not in ( select F1 from B)

文字コードと改行コードと戦う。
クライアント先のサーバーにはPostgreSQLが入っているが、
それをphpPgAdminで管理するために設定していたのであるが、
Windowsはすんなりいく。Macはなかなか難しい。
もちろんWindows限定であるが、自分的にはMacでも動かないと納得いかない。
ましてはSafariでどーにか文字コード認識させたくて格闘していました。
が、しかしその甲斐空しく、、、あきらめました。
一応MacのIEでは文字コードを認識したのでそれで妥協しました。
妥協も大事か。つーかMacの動作求められてないですから!
改行コードもMacで作ったテキストファイルとWindowsで作ったテキストファイルも
同じように読み込まない。内部で処理してしまうのだろうか。
そこまで調べている時間はないのでそこの妥協。
詳しい方に質問したい心境です。
明日クライアント先でデモを行うため、予行練習。
予想外の出来事が起こってもすぐ見せられるための下準備。
いわゆる三分間クッキングみたいなもの。
それで完成したものはこちらです!
ってことですね。
頑張ってテストを繰り返しても突然本番で動かなかったりする時とか
本当困ります。自分だけの問題であれば仕方のないことですが、
そうでない場合もあると想定して、見せられるようにしておく。
見せられればクライアントもま、まあ納得してくれるということですかね。
ま、納期は守らないと大変ですが…。
ということで、納期を守ってください。>O氏。
来年くらいには外注できるくらいになっていれば良いんだけど…。
自分も相手もって事です。
単価の低い仕事を抱えなければならないのは、しがないプログラマだからなんです。
でも、それでコネクション増やせれば一石二鳥だと思っております。
なのでいろいろな方と仕事したいです。
良い外注先(パートナー)が見つかれば自分が沢山仕事とってどんどん流せるのだが…。

うまく動かなくなってしまったので、復習しました。
mdbによって動作が変わってしまうのはなぜ?
もうちょっと確認してみよう。

現在の仕事は、以前のコンテンツの管理画面の作成です。
クライアントとがサービスのコンテンツをアップ、編集する画面の作成
なのですが、こちらはサービスなのであまり凝ったものは作りません。
がしかし、サービスでの付加機能で、
CSVインポート機能、検索、画像のアップロード、
各カテゴリ別アクセスログなどがあります。
管理機能では上のような仕様は当たり前なのですが、
画像のアップロードは作るとしても、
いいじゃ、phpPgAdminで。
そっちの方が絶対いいと思うんだけどなあ。
サービスで作るのがなあ…。
でも今後を考えてやるしかないのであります。
とりあえず、CSVインポート機能は作りました。
作る度にあれもこれもと付け足していき結構サービスで
提供するプログラムじゃないと思いますが…。
とちょっとひっかかったのが、SQL文の文字列中のシングルクォテーションは2つにしてエスケープしなしとエラーになります。
SQL文だけで書いているときはすぐに気づく事なんですけど、最初何でエラーが起きてるか全くわかりませんでした。
メモっときます。

文字定数で指定するならシングルクォーテーション二つです。
  INSERT INTO test VALUES(’ユーザ’’s 持ち物’)