トップページphp
983コメント418KB

Pear

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。 NGNG
ってどうよ。
0897nobodyさん2005/05/20(金) 00:01:48ID:wjKv+x9s
>>896
なるほど、そんな使い方もできたんですね。

ちなみにPAERのエラー処理って、PEARライブラリ製作者用のクラス
であって、PHP4のエラー処理として推奨されているわけではないのかな?

今すごく迷っているんですけど、
PHP4のエラー処理で最も適しているのは以下のどれになりますか?
識者のご意見お聞かせ下さい。

1、メソッドの戻り値で判断する
2、標準のエラー処理用関数郡を使う
3、PEAR基底クラスのエラー処理を使う
0898nobodyさん2005/05/20(金) 15:49:22ID:???
>>897
俺はPEAR_ErrorStack使ってる。
マニュアル以外で解説見たこと無いが、個人的にはPEAR_Errorより好き。
ttp://pear.php.net/manual/en/core.pear.pear-errorstack.intro.php
ここ読めば大体の使い方は分かるので、一度読んでみて。
0899nobodyさん2005/05/21(土) 18:41:50ID:???
>>895
もう 2 年くらいソレでがんがん使ってる。問題ない。っつーか快適。
デバッグ時は backtrace させて (昔は Xdebug とか PEAR::VarDump 無かった)、運用時は小山氏@雑誌連載式にログったりメール飛ばしたり。

>>897
ケースバイケースで組み合わせ。
> 例外処理が無いのでエラー処理が非常に面倒
とか見ると Java の人?と思っちゃう。
PHP の世界に入ってきたのなら、PHP の流儀を意識した方が幸せになれると思う。

ErrorStack いいらしいですね。
最近勉強してないな…
0900nobodyさん2005/05/22(日) 21:41:19ID:???
>899
例外処理なんてJava以前から余裕であるわけだが。
0901nobodyさん2005/05/23(月) 01:17:27ID:???
例外処理が無いと極端にやり難い、という人には、今まで Java やってましたというパターンが多い、
という話。
0902nobodyさん2005/05/23(月) 02:07:06ID:???
PEAR::DBでSQLiteのユーザー定義関数を作る場合、
sqlite_create_functionは使えませんか?
「Warning: sqlite_create_function() expects parameter 1 to be resource

というエラーが出るんですけど。

ソースはこんな感じです。
$db = DB::connect($dsn);
sqlite_create_function($db, 'NOW', 'time', 0);
0903nobodyさん2005/05/23(月) 02:12:39ID:???
var_dump($db);
したらnull?
0904nobodyさん2005/05/23(月) 03:53:41ID:???
>>903
Nullではないです。
サンプルではsqlite_create_functionを使う場合は
sqlite_open関数を使っているので、PEAR::DBでは
エラーになってしまうのかと思ったのですが。
0905nobodyさん2005/05/23(月) 10:34:57ID:???
> Nullではないです。

PEAR なら、エラーオブジェクトという事もある。
0906nobodyさん2005/05/23(月) 13:06:09ID:???
>>902
DB::connect() の戻り値はSQLiteのリソースハンドルじゃなくて
DB_sqliteオブジェクトなので、そのままsqlite_xxx関数には渡せないよ。

どうしても使いたいなら
sqlite_create_function($db->connection, 'NOW', 'time', 0);
のようにDB_sqliteから接続ハンドルを取り出さないと。
0907nobodyさん2005/05/23(月) 23:53:02ID:???
>>906
おっちゃん〜。できたよー!
ありがとう。助かったよー。
0908nobodyさん2005/05/29(日) 00:33:18ID:3agdROOk
PearのPHP5対応状況ってどこでわかりますか?
0909nobodyさん2005/05/29(日) 00:59:27ID:???
たいていのPEARパッケージはPHP5でも動作します。
というか、動かなかったらおそらくバグなので
bugs.php.netに報告よろ
09109092005/05/29(日) 01:09:41ID:???
あ、バグレポート先がうそだった。
PEARパッケージのバグは、各パッケージのページ

http://pear.php.net/package/パッケージ名

のBugsタブから。
0911nobodyさん2005/05/29(日) 07:39:53ID:oziLOzHH
>>909
ありがとうございます。PHP5対応は考慮されているんですね。
それでは逆に、PHP4の互換保持は考慮されているものでしょうか?
09129022005/05/29(日) 16:33:06ID:???
以前、PEAR::DBでSQLiteのユーザー定義関数を作る方法で
お世話になった者です。
PEAR::DBを継承させたmyDBクラスを作ってSQLiteで色々な
関数を使えるようにしてみました。
これで他のDBからSQLiteへの移行が比較的楽にできるのではないかと
思うのですがどうでしょうか?
ソースは次レスで。
09139022005/05/29(日) 16:34:16ID:???
myDBクラス(myDB.php)

<?php
require_once("DB.php");// DB
require_once("sqlite_func.php");// SQLite用ユーザー定義関数

class myDB extends DB {
function connect($dsn) {
$db =& parent::connect($dsn);

// SQLiteのユーザー定義関数
sqlite_create_function($db->connection, 'NOW', 'time', 0);
sqlite_create_function($db->connection, 'DATE_FORMAT', 'date_format', 2);

return $db;
}
}
?>

ユーザー定義関数(sqlite_func.php)

<?php
function date_format($timestamp, $format) {
return strftime($format, $timestamp);
}
?>
09149022005/05/29(日) 16:34:48ID:???
使い方

<?php
require_once("myDB.php");// DB

// DBオブジェクトの生成と接続
$db =& myDB::connect(DSN);

// エラーチェック
if (PEAR::isError($db)) {
$this->error($db->getMessage());
}

// データ取得
$sql = "SELECT"
. " DATE_FORMAT(NOW(), '%Y/%m/%d %H:%M:%S') AS today,"
. " FROM t_hoge"
;

$res = $db->getAll($sql, DB_FETCHMODE_ASSOC);

// エラーチェック
if (PEAR::isError($res)){
$this->error($res->getMessage());
}

// DB切断
$db->disconnect();
?>
09159022005/05/29(日) 16:38:00ID:???
以上スレ汚し失礼しました。
0916nobodyさん2005/05/29(日) 16:48:45ID:???
何がやりたいのかよく分からないが。
抽象化したいなら、抽象化度の高い MDB2、DB/MDB_QueryTool のようなクエリビルダや Propel、DBDO といった ORM 使ってみ。
0917nobodyさん2005/05/29(日) 18:47:10ID:???
>916
DBDOって判りづらいだろう。DB_DataObjectのことね。
あと、速度重視するならADODBとPDOも選択肢に追加。
0918nobodyさん2005/05/30(月) 19:32:29ID:RWhNHsSf
QuickFormでフォームを作成できるのは便利なんだけど、
フォーム中にJavaScriptを埋め込む事って可能?
例えば、select1の選択内容によって、select2の内容を変更するって感じのものを作りたいんだけど、
selectタグの属性に「onChange="hoge()"」って感じに属性を記述することは可能?
0919nobodyさん2005/05/30(月) 19:36:03ID:???
>>918
可能
0920nobodyさん2005/05/30(月) 21:17:34ID:???
>>919
ついでにその方法教えてくれるとうれしい
教えて君でスマソ
0921nobodyさん2005/05/30(月) 21:41:19ID:???
>>920
お願いだからマニュアルくらいは読んでくれ
09229192005/05/30(月) 21:48:31ID:???
>>921
同意なんだけど

>>920
array('onchange'=>'hoge()')

0923nobodyさん2005/05/31(火) 12:11:30ID:???
addElement('hierselect', 'hoge', 'hoge:');
0924nobodyさん2005/06/01(水) 19:08:06ID:???
HTML_QuickFormのvalidateだけを使いたいんだが。
なんでvalideteだけを独立して使うことはできんの?
0925nobodyさん2005/06/01(水) 20:12:55ID:???
なんでも何も、そういう風に作られてなけりゃ無理だろ
0926nobodyさん2005/06/02(木) 02:12:22ID:???
無理だったか?
ルールの複数定義を嫌って無理矢理使ったような記憶があるが…
0927nobodyさん2005/06/02(木) 07:11:22ID:???
普通に addElement() して addRule() すれば validate() の結果を取れるが……?
単に display() とかを使わなければいいだけでは.

addElement() したくない,ってことなら,
おとなしく PEAR の Validate を使ってひとつひとつ自分でチェックすべし.
0928nobodyさん2005/06/02(木) 22:14:43ID:???
>>892

checkboxの値をupdateAttributesで更新しても、freeze()したときに、
hiddenの値が、1にならないか??
よくよくしらべていると、freeze時にhiddenを生成するときに、
getValueを呼び出してるんだが、
checkboxクラスのgetValueは、getCheckecの戻り値を返すようになってるから、
結局セットされる値が1になってしまう。。。

解決方法ある??
ガイシュツだったらスマソ
0929nobodyさん2005/06/02(木) 22:25:06ID:???
単に問題のメソッドをオーバーライドしたクラスを書けばいいだけじゃないか。
0930nobodyさん2005/06/02(木) 22:38:46ID:???
なるほど、がんばります。
0931nobodyさん2005/06/02(木) 22:54:55ID:???
>>929
PHP4ではメソッドのオーバーライドはできませんよ?
0932nobodyさん2005/06/02(木) 23:12:50ID:5Bd9W1e0
>>929,930

ありがとう、できました。
0933nobodyさん2005/06/03(金) 12:33:32ID:???
>>931
オーバーロード?
0934nobodyさん2005/06/04(土) 17:49:54ID:???
PHPって標準関数のオーバーライドもできるの?
0935nobodyさん2005/06/04(土) 18:59:06ID:???
peclの話題だろ
0936nobodyさん2005/06/18(土) 04:12:26ID:???
がいしゅつかも知れんけど、
DB_common::escapeってpregつかってるから、
もしかしてexecuteにEUC-JPな文字列突っ込んでうまくいってるのって
たまたまだったのか?

orz
0937nobodyさん2005/06/18(土) 04:19:01ID:???
>>936
Shift-JISなら問題出るかもしれないけど、EUC-JPやUTF-8なら大丈夫だろ。
基本的に被らないし。
0938nobodyさん2005/06/18(土) 06:43:29ID:???
ああ、たしかにそうでした。

自作アンテナなんだけど、たまに止まるからなんでかなーとおもってたんだが、
よく見たら^Mが入ってた。同じURLで改行コード混在してるページが原因。
それとったら動いたよ。

あとpregがあるのはescapeじゃなかったけど、まあいいや。

ありがとう。
0939 ◆f.lightAf6 2005/06/19(日) 18:10:18ID:???
....
0940nobodyさん2005/06/24(金) 19:13:08ID:pYTM6kF2
QUICKFORMの
<form action="..." method="...">のname="..."の部分を消すことはできないんでしょうか?
0941nobodyさん2005/06/25(土) 23:56:31ID:???
PEAR::Configの使い方が良く分からないんですけど。
誰か実際に使ってる人いたら解説キボンヌ!
0942nobodyさん2005/06/26(日) 00:04:52ID:???
なにが分からんの?
0943nobodyさん2005/06/26(日) 10:23:37ID:???
>>940
<?php
$qf->removeAttribute('name');
?>
しかし色々とマトモに動かなくなるので実質は消すことは不可能と考えた方が.
なんで消したいのかを提示してみては? 何か別の解決策があるかもしれない.
0944nobodyさん2005/06/26(日) 15:15:17ID:???
>>943
XHTML1.0 strictは<form>にnameつけちゃだめっていうルールがあるらしくてそのためにと思ったんですが
0945nobodyさん2005/06/26(日) 15:46:45ID:???
>>944
それは,廃止予定だから使用「すべきでない」であって,使用「してはならない」ではないのでは……?
XHTML1.1 では name 属性が廃止されているけど,その場合でも,
適合ユーザエージェントは処理できない属性を無視「しなければならない」ので,問題はおきない.
そこをきちんと処理できない Validator の類ではエラーが出るかもしれないけど.

……と自分は理解しているんだけど,間違ってたら指摘おねがいよー
0946nobodyさん2005/06/27(月) 13:53:32ID:???
HTMLのパーサってPEARにあります?
あったら教えて下さい。
0947nobodyさん2005/06/27(月) 18:17:49ID:???
>>947
XML_HTMLSax
ttp://pear.php.net/package/XML_HTMLSax

XMLカテゴリにあるから見つけにくいんだよな。
0948nobodyさん2005/06/27(月) 18:18:25ID:???
アンカーミス
>>946
0949nobodyさん2005/06/27(月) 22:46:11ID:???
DB_DataObject が MDB 対応だそうですよもまいら
次は pdo 対応ですかね…… 5 だと DBDO に行っちゃうのかな?
0950nobodyさん2005/06/27(月) 23:00:15ID:???
今さらMDBよりMDB2に対応して欲しいと思う今日この頃。
PHP5なら
$MDB2->setFetchMode(MDB2_FETCHMODE_OBJECT, "someClass");
して、さらに
$result = $MDB2->query($SQL, null, true, "MDB2_Iterator");
foreach($result as $row) {
/* あれこれ */
}
これ最強。
0951nobodyさん2005/06/28(火) 20:25:15ID:???
>>950
なぁ。それのどこがPEAR::DBと違うの?
大して変わらんやん。
0952nobodyさん2005/07/05(火) 23:29:52ID:BWLWbomG
Spreadsheet_Excel_Writerで format を使用して書式を変更するのは分かったのですが、

// これだと単一のセルになります
$WorkSheet->write( 1, 0, "1列目", $Format1 );

シートもしくはブック全体に共通の書式を初期設定する方法がわかりません。
教えてください!

0953nobodyさん2005/07/05(火) 23:38:09ID:???
後で見た人が誤解するといかんので補足

>>950
> 今さらMDBよりMDB2に対応して欲しいと思う今日この頃。

DB_DataObject の MDB 対応は MDB2 だわ.
ていうか MDB1 は対応してないのかな.
MDB といえば当たり前のように 2 を指してるかのように書いてある.
0954nobodyさん2005/07/06(水) 22:39:04ID:???
pearサイトDB落ちてますYO!
0955nobodyさん2005/07/11(月) 01:02:19ID:???
XML_RPCがPHP4.3以降対応になってて
pear upgrade-allができない…orz
0956nobodyさん2005/07/12(火) 10:50:02ID:???
quickformにて、例えば電話番号を三つのinputフォームを用意し、
三つのフォームのうち一つしか記入されていなかったら
JavaScriptでエラーを出したいんだけど、方法はありますか?

三つのフォームにすべて入力されている場合と、
三つのフォームすべてが入力されていない場合は
エラーを出さないようにしたいのです。
09579562005/07/12(火) 14:06:19ID:???
解決。
一応載せておきます

$areaCode = $form->createElement('text', '', null, array('size' => 4, 'maxlength' => 3));
$phoneNo1 = $form->createElement('text', '', null, array('size' => 4, 'maxlength' => 3));
$phoneNo2 = $form->createElement('text', '', null, array('size' => 5, 'maxlength' => 4));
$form->addGroup(array($areaCode, $phoneNo1, $phoneNo2), 'phoneNo', 'Telephone:', '-');

$form->addGroupRule('phoneNo', 'Please fill all phone fields', 'required', null, 3, 'client');
$form->addGroupRule('phoneNo', 'Values must be numeric', 'numeric', null, 3, 'client');
09589562005/07/12(火) 14:28:32ID:???
あ、ダメだ、すべてのフォームへの入力が必須だ・・・
0959nobodyさん2005/07/12(火) 15:20:27ID:???
addFormRuleじゃあかんのん?
http://pear.php.net/manual/en/package.html.html-quickform.html-quickform.addformrule.php
0960nobodyさん2005/07/12(火) 15:23:14ID:???
って、JavaScriptで出したいのか。
それは、自前で書くしかないんじゃないかなぁ?
09619562005/07/12(火) 15:24:17ID:???
>>959
addFormRule()ってJavaScriptでクライアント側にもチェック機能
付けられましたっけ?
09629562005/07/12(火) 15:32:52ID:???
>>960
やっぱりそうですか。
自前で書くのも考えましたが、quickformが吐き出すjavascriptに
書き加えるのは単純には行かないですよねぇ・・・
0963nobodyさん2005/07/14(木) 12:06:23ID:eHIEjUS2
PEAR::MDB + MySQL でSQLのインジェクション対策ってどうやってますか?
DBのときはescapeSimple()関数使ってたんですが・・・。
0964nobodyさん2005/07/15(金) 22:10:16ID:???
>>889で書いた問題が解決されましたよもまいら

ttp://cvs.php.net/diff.php/pear/HTML_QuickForm/QuickForm.php?r1=1.156&r2=1.157&ty=u

あまりにも長い間放置されてたんで何かポリシーあるのかと思ったが,
やっぱし単にバグだったのか……
開発者たちは Freeze() って使ってないんだろーか?
0965nobodyさん2005/07/18(月) 15:34:03ID:qAc2zP8J
PHP5+QuickForm3.2.4pl1+Smartyでradioボタンだけ表示されないんだけどどういうこと??
09669652005/07/18(月) 15:46:54ID:???
自己解決しました

$radio[] = &HTML_QuickForm::createElement('radio', null, null, 'hoge1', 0);
$radio[] = &HTML_QuickForm::createElement('radio', null, null, 'hoge2', 1);
$form->addGroup($radio, 'hegohego', 'blah');

$form->addElement('radio','','','','')だけじゃ表示されないのね。。

0967nobodyさん2005/07/20(水) 21:28:44ID:Qqvr7Dca
PEAR::DBで質問です。

nextId()でシリアル値を生成し、INSERTしているのですが、
INSERTされたシリアル値を取得することはできるのでしょうか。

SQLiteを使っています。
Postgresの場合、oidからselectして取得できるのですが、
せっかくPEARを使っているので、特定DBに依存しないやり方が知りたいです。

よろしくお願いします。
0968nobodyさん2005/07/22(金) 01:08:44ID:???
PEAR::DBについて質問させて下さい。
PEAR::DBのquery()または、execute()で実行されたSQL文をログに出力したいと考えています。

現在は、下記のようにquery()またはexecute()を実行する直前でログに出力しています。
$sql = "select * from table";
$logger->debug($sql); // ここでログに出力
$db->query($sql);

しかし、このような場合は実行されたSQL文を出力できません。
$sql = "insert into table (col1, col2) values(?, ?)";
$params = array(
'val1',
'val2'
);
$sth = $db->prepare($sql);
$logger->debug($sql);
$db->execute($sth, $params);

この場合は、"insert into table (col1, col2) values(?, ?)"がログに出力されますが、
実際に実行されたSQL文(?が実際の値に置換された状態)をログに出力できません。

プレースホルダを使用した場合に、プレースホルダが置換された状態のSQLを取得するには
どうすればいいでしょうか。

[環境]
PostgresSQL 8.0
PHP 4.3.11
Apache 2.0.52
Windows2000 SP4

よろしくお願いします。
0969nobodyさん2005/07/22(金) 01:20:46ID:IizYuRm3
>>967

マニュアルによると、
$id = $db->nextId('mySequence');
という使い方をしているから、既に取得できていると思われるのだけど?
ttp://www.1x1.jp/php/manual_pear/html/package.database.db.intro-sequences.html
0970nobodyさん2005/07/22(金) 16:29:41ID:???
>>968
PEAR::DBでは発行されたSQLをログに残す機能はないので、
PostgreSQL側でログに取るほうが楽だと思う。

どうしてもPHP側でやりたければ、DB_pgsql::simpleQuery あたりに
ログを吐くコードを埋め込むのがいいんじゃない?

既存のPEAR::DBのコードを変更したくない場合は、DB_pgsqlを継承したクラスを
つくって、それをDB::connectの返値からうまく生成すればできると思う。
0971nobodyさん2005/07/22(金) 17:24:28ID:???
>>968
接続時に、オプションでdebug levelを上げれば、どっかでとれそうな気がする。
気がするだけなんだけど。

$db =& DB::connect($dsn, array( 'debug' => 2));
とか
0972nobodyさん2005/07/22(金) 19:48:46ID:???
>>971
> 接続時に、オプションでdebug levelを上げれば、どっかでとれそうな気がする。

それではとれない。
ソース読めば分かるけど、PEAR::DBではdebug levelはあまり使われておらず

2以上を指定したときに、各DBドライバのロード時のエラーが表示される

という目的にしか使えない。つまり役に立たない。
09739682005/07/23(土) 00:11:48ID:???
>>970

できれば、PEAR::DBのコードを修正せずにやりたいので、
DB_pgsqlを継承する方法を試そうとしましたが、
DB::connectの返値からDB_pgsqlを継承したクラスをうまく生成する方法が
思いつきませんでした。

今のところ、PostgreSQL側でログを取るという方法が現実的のようです。

ありがとうございました。
0974nobodyさん2005/07/24(日) 22:40:09ID:???
>>968
> プレースホルダが置換された状態のSQLを取得するには

今回は pgsql だけの話でいいのかもしれないけど,
そもそもプレースホルダの機能ってのは,
単純に文字列として ? を何かに置き換えるって話だけじゃない機能なので,
「置換された状態のSQL」なんてものは存在しない RDBMS もある.
つまり,発想自体が誤りなので,その機能を DB に要求するのは無理があると思う.

ところでそろそろ次スレの季節かな?
>>990あたりが作ればいいのかな.
0975nobodyさん2005/07/27(水) 05:36:52ID:3RtjRt/f
HTML_QucikFormで、Filterが最後でしか効かないんですけど、
これを入力エラーで修正中や、freezeして確認する時などにも、
随時効かすようにできないですかねぇ。
0976nobodyさん2005/07/27(水) 11:48:51ID:???
getSubmitValueを使う方法しか思いつかない
0977nobodyさん2005/07/27(水) 22:47:41ID:???
exportValues() した値を最後に setConstants() とか……
ふと思いついただけだがそんな糞コードを書いてはいけないヨ?
0978nobodyさん2005/07/28(木) 12:05:29ID:???
Net_UserAgent_Mobile 0.24.0 up
0979nobodyさん2005/07/28(木) 23:18:56ID:???
PEAR::Spreadsheet_Excel_Writer使ってみたけどまだまだですな。
縦方向のalignが設定できない(アクセサが無いだけ?)のと、
マージしたセルにフォーマットを適用できないのが致命的。
これならEXCELで作った雛形ファイルをXML形式で保存して、
テキスト置換で編集した方がまし(OfficeXP以降しか読めないけど)。
早くベータ版から正式版にならんかな。
09809752005/07/29(金) 02:58:42ID:???
変な小細工するくらいなら、最初からHTML_QuickFormを使わないほうがいいかもしれませんね。
ユーザは、自分がpostした値が、どのようにフィルタされて受け取られるかを
確認できた方がいいんだけどなぁ。
なんだかHTML_QuickForm、便利は便利なんだけど、ぼみょー感を感じます・・。
0981nobodyさん2005/07/29(金) 06:19:14ID:???
>マージしたセルにフォーマットを適用できないのが致命的。

出来るだろ。
0982nobodyさん2005/07/29(金) 08:32:35ID:???
>>981
え、そうなの?!
古いマニュアル見てたのかな・・・
見直してみる。サンクス。
0983nobodyさん2005/07/29(金) 11:50:23ID:???
>>978
教えてくれてトンクス!
レス数が950を超えています。1000を超えると書き込みができなくなります。