Zend Framework Part4
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2010/02/09(火) 22:21:24ID:???http://framework.zend.com/
マニュアル
http://framework.zend.com/manual/ja/
翻訳状況
http://mikaelkael.dyndns.org/checker/language/details/lang/ja
http://framework.zend.com/wiki/display/ZFDEV/Japanese+(Nihongo)
バグ報告
http://framework.zend.com/issues/secure/Dashboard.jspa
API
http://framework.zend.com/apidoc/core/
前のスレッド Zend Framework Part3
http://pc11.2ch.net/test/read.cgi/php/1239320100/
0262nobodyさん
2010/04/17(土) 20:24:51ID:T3UCpDKa0263nobodyさん
2010/04/21(水) 18:21:04ID:mfVJoQpIアクセスURLが /mだったらレイアウトをmobile.phtmlにするって
application.iniでは記述できませんよね?ディスパッチャを拡張するとか?
しょうがないので今はコントローラの中で
$this->view->layout()->setLayout('mobile');
とやってるんですが、そんなもんでしょうか?
0264263
2010/04/22(木) 13:23:51ID:???$this->_helper->layout->setLayout('mobile');
注入したい場合はどうやらこんな感じ。ブートストラップにて
protected function _initLayout()
{
$this->bootstrap('FrontController');
$f = $this->getResource('FrontController');
$l = Zend_Layout::startMvc();
$l->setLayoutPath(APPLICATION_PATH."/layouts/scripts");
:
$l->setLayout("mobile");
:
return $l;
}
0265nobodyさん
2010/04/22(木) 17:52:05ID:doAUeW+3if(!empty($params['key'])){
$associate_key = $this->_config->afferiate->_ASSOCIATE_KEY;
$query = new Zend_Service_Amazon($access_key, 'JP', $secret_key);
$results = $query->itemSearch(
array(
'SearchIndex' =>'Books',
'Keywords' =>'PHP',
'ResponseGroup' =>'Large'
)
);
}
上記のようにして、検索を実行した時に限ってdispachエラーが出るようなんです。
[Thu Apr 22 01:40:01 2010] [error] [client 192.168.0.8] PHP Fatal error:
Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message
'Invalid controller specified (error)' in /usr/lib/php/Zend/Controller/Dispatcher/Standard.php:241
$params['key']がカラで検索しないときは、同じ画面でもエラーしません。
どんな原因が考えられるでしょうか? バージョンは1.8.1です。
また、上のZend_Service_Amazon()の使い方は間違ってますか?
0266nobodyさん
2010/04/22(木) 23:09:32ID:???1.10とか
0267nobodyさん
2010/04/22(木) 23:55:56ID:doAUeW+3どうもありがとうございます
バージョンが古いのが問題かと思って新しくしたんですが、まだエラーが出ます。
PHP Fatal error: Class 'DOMDocument' not found in /usr/lib/php/Zend/Service/Amazon.php on line 128
何が問題なんでしょうか。
調べたらzendfwよりphp自体の問題に思えて来たのでphpスレに移動します。
ありがとうございました
0268nobodyさん
2010/04/23(金) 00:33:42ID:???http://www.google.co.jp/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=Class%20%27DOMDocument%27%20not%20found&num=50
0269nobodyさん
2010/04/23(金) 00:37:54ID:???どうもです。
しかし、そこに書いてあることやったんですけどエラー解消しないんですよね
php質問スレに詳細書いたので、気が向いたらお願いします。ありがとうございました
0270nobodyさん
2010/04/23(金) 04:13:25ID:QeXW5bBg$query = new Zend_Service_Amazon($access_key, 'JP', $secret_key);
//$results = $query->itemLookup('B001DNF6V6');
$results = $query->itemSearch(
array(
'SearchIndex' =>'Music',
'Keywords' =>$params['key']
)
);
値が取得できず、以下の結果になります。(エラーは出力されません)
object(Zend_Service_Amazon_ResultSet)#295 (4) { ["_results:protected"]=> object(DOMNodeList)#307 (0) { }
["_dom:protected"]=> object(DOMDocument)#293 (0) { } ["_xpath:protected"]=> object(DOMXPath)#296 (0) { }
["_currentIndex:protected"]=> int(0) }
コメントアウトしている $results = $query->itemLookup('B001DNF6V6'); でなら目当ての商品情報を取得できるので
コンポーネントの設定や動作条件は満たしてるのではと思うんですが…
0271nobodyさん
2010/04/23(金) 10:07:38ID:yrV1Z6KOこのフロントエンドはバックエンドのオプションとしてmaster_fileを設定するのだと思います
実際上記のマニュアルにも「唯一しなければいけないのは・・・」と書かれています
しかし、上記のマニュアルにはmaster_fileは非推奨と書かれています。
これはどういうことなのでしょうか?
master_fileではなく、master_filesを使えということなのでしょうか?
それともそもそもマスタファイルへのフルパスを指定することがいけないということで非推奨なのでしょうか?
となるとファイルが更新されたタイミングでキャッシュがリフレッシュされるという事が無くなり、そもそもこのフロントエンドの意味が無くなり、このフロントエンド自体が非推奨になってしまうと思うのですが・・・
0272nobodyさん
2010/04/23(金) 12:26:10ID:???質問なげえよ。master_files使えって意味だよ。
同じ役割だから、小さい方は廃止予定なんだよ。よくあること
0273nobodyさん
2010/04/24(土) 04:32:30ID:6V3fZIphいまだに原因わからずで… 勝手言ってすみません、気が向いたらお願いします
0274nobodyさん
2010/04/24(土) 05:40:42ID:???$results を foreach してみたら?イテレーターみたいだから。
参考
http://d.hatena.ne.jp/boto/20070923/1190482142
0275273
2010/04/24(土) 16:15:43ID:???ありがとうございます!
そのページも見てたんですけど、var_dumpで確認すれば万能って思ってました
イテレータって物自体知らなかった… 本当にありがとう!
0276nobodyさん
2010/05/01(土) 10:59:43ID:???低学歴は本買えってことか・・・
0277nobodyさん
2010/05/01(土) 11:03:13ID:???0278sage
2010/05/02(日) 10:44:31ID:KVSpskbJ「誰かが翻訳しておいてくれる」のが当たり前のことだと思っているのですね。
去年の「Zend_Application まだ翻訳されていない、どうなっているんだ」や
「公式運営者はもっと頑張るべきだ」発言者のように
0279nobodyさん
2010/05/02(日) 10:54:01ID:???翻訳してやってますよ感を出す意味が分からない。
0280nobodyさん
2010/05/02(日) 11:45:58ID:???0281sage
2010/05/02(日) 12:19:45ID:Y8fRDT502行目が分かりません
0282nobodyさん
2010/05/02(日) 23:04:41ID:???自分に理解出来ないことは、理解しようという姿勢すら示さないのも低学歴の特徴。
0283nobodyさん
2010/05/02(日) 23:49:44ID:???0284nobodyさん
2010/05/03(月) 00:58:35ID:???お前、海賊版のソフトを平気な顔して使って
「ボッタクリ価格なのが悪い!」
「もともと買う気は無いからメーカーに損は無い!」
「むしろ俺が使う事で知名度が上がるだろ!」
とか言うタイプだろw
翻訳してやってますよとは思わないが、対価も支払う気が無い輩の言うことでは無いわなw
人それぞれで結論づけるならチラシの裏にでも書いてろよw
0285nobodyさん
2010/05/03(月) 02:13:23ID:???0286nobodyさん
2010/05/03(月) 02:35:26ID:???お前、海賊版のソフトを平気な顔して使って
「ボッタクリ価格なのが悪い!」
「もともと買う気は無いからメーカーに損は無い!」
「むしろ俺が使う事で知名度が上がるだろ!」
とか言うタイプだろ
翻訳してやってますよとは思わないが、対価も支払う気が無い輩の言うことでは無いわな
人それぞれで結論づけるならチラシの裏にでも書いてろよ
0287nobodyさん
2010/05/03(月) 03:11:31ID:???API Docの英語くらい理解できる程度に勉強しておけば良かったな
0288nobodyさん
2010/05/03(月) 08:26:50ID:???別に英語だけでも困らないけど、やっぱり日本語の方がありがたい。
0289nobodyさん
2010/05/03(月) 18:41:49ID:7alvR5zVsendmail?postfix?qmail?
zendFWのサービスていうかzend_mailを使うにあたって、3つのうちで特に相性がいいものってあるのかな?
zend_mailの利用に関して注意点とかトラブルとかあった?
あったら教えてください。お願いします。
0290nobodyさん
2010/05/03(月) 20:36:44ID:???0291sage
2010/05/05(水) 00:26:42ID:/pDwsnJ7290を補足すると、 Zend_Mail_Transport_Smtp 及び Zend_Mail_Transport_Sendmail が
sendmail を前提にしており、他のMTAをカバーするためのクラスは、まだ用意できていなかったはずです
0292nobodyさん
2010/05/06(木) 00:26:10ID:j7c7uMQSありがとうございます
っていうか、マジで?sendmailしか対応できないの?
Sendmailってセキュリティ設定が難しくて敬遠されがちらしいし、
扱いやすいpostfixにMTAを切り替えてたんだけど、無駄なことしたのかな…orz
やっとインスコ成功したのに…
調べてみます、ありがとう
0293292
2010/05/06(木) 00:45:43ID:j7c7uMQSzend以前の問題かもしれないですが、ttp://blog.enjoitech.jp/article/201 を見ると、
自前のサーバ上のMTAを使わず、gmailを使ってメール送信できるそうですが、
・自前でMTAを利用する
・gmailで送信する
この二つのメリット/デメリットは何でしょうか?
思いつくのはgmailのダウン時の巻き添えくらいしかないのですがほかに何かありますか?
0294nobodyさん
2010/05/06(木) 00:58:07ID:???>>っていうか、マジで?sendmailしか対応できないの?
SMTP経由すればMTA関係無いんじゃないか?
>>293
・自前でMTAを利用する
自由に弄れる反面、コストもかかるし維持も面倒。
・gmailで送信する
制限はあるが、コストはかからない。
作るサービス次第だと思うよ。
0295nobodyさん
2010/05/06(木) 01:10:04ID:???sendmailつっても、この場合sendmailコマンドじゃなかったけ。
うちはpostfix使っているけど特に問題なく使えているよ。
0296nobodyさん
2010/05/06(木) 16:26:28ID:???0297nobodyさん
2010/05/08(土) 04:09:56ID:???ZF 1.10.3を使っていて
public function sitemapAction(){
$this->_helper->layout->disableLayout();
echo $this->view->navigation()->sitemap();
}
としたところ
Fatal error: Zend_View_Exception: Encountered an invalid URL for Sitemap XML: "http://xn--********.jp/" in C:\xampplite\htdocs\xn--********.jp\library\Zend\View\Helper\Navigation\HelperAbstract.php on line 522
というエラーが発生してしまいます。
ドメインは日本語ドメインを利用しています。
上記エラーはwindows上ですがcoreserverや自宅のlinux環境でも同様のエラーが発生します。
$container = new Zend_Navigation(array($navi));
$navigation = $this->view->navigation();
$navigation->setContainer($container);
$this->view->assign( 'crumbs',$navigation->breadcrumbs()->setLinkLast(true)->setMinDepth(0));
$this->view->assign( 'menu' ,$navigation->menu());
は動作してるのでZend_Navigationの使い方は間違ってないと思うのですが
解決のヒントや、そもそもsitemapは日本語では動かない等あきらめたほうが良い等
アドバイスをいただけないでしょうか?
0298nobodyさん
2010/05/09(日) 17:05:23ID:???オリジナルのRoute作ってるんだけど
assemble()ってどういうときに呼ばれるんだろうか?
今のところ何も実装しなくても希望の動作になってるから良いのだが。。
ちょっと調べた感じ、Redirectのときに使われるっぽい?
RouterでRedirect?よくわからん。。。
0299nobodyさん
2010/05/10(月) 11:25:43ID:???配列→パス が assemble() で
パス→配列 が match()
心臓部分なので実装しなければ(空実装?)使いもにならんはずだが。
0300nobodyさん
2010/05/10(月) 13:39:42ID:???個人的によく使うのはurlヘルパーかな
0301nobodyさん
2010/05/10(月) 20:26:01ID:???>>300
なるほどthx
Router_Route_Hostnameの正規表現版みたいなのを
作ってルーティングしてるんだけど、今のところ
assemble(){ exit('hoge');}
って書いてても全然呼ばれないのだが。。。
urlヘルパーを使ってないから?
もともとJava-Spring使ってて最近PHP-Zendに移ってきたんだけど
Route_AbstractのgetVersion()をオーバーライドすると
match()のパラメータ型が変わったりするし、なんだかややこしいな。
ていうかRoute_Interfaceの全メソッドにコメントがないし…
インタフェースにコメントないAPIとか初めて見たよ。。
でも逆に勉強になるな。
0302nobodyさん
2010/05/15(土) 16:46:48ID:???あと、Zend_mailで送信サーバをGoogleにして使うとき、送信者アドレスが
Gmailのアドレスになるのはどうしようもない?
0303nobodyさん
2010/05/15(土) 16:47:51ID:9enG3To70304nobodyさん
2010/05/15(土) 16:51:16ID:9enG3To7○ Zend_mailで送信サーバをGmailサーバ指定して使うとき
の間違いでした、ごめん
0305nobodyさん
2010/05/15(土) 16:56:30ID:???私がPHPのシステムを構築するときは、管理画面とフロント画面があるシステムを作ることが多く、
モジュールの仕組みを自分なりに使って以下の様に実現しています。
■管理画面
http://localhost/webmaster/hoge/huga
=> webmasterモジュールのhogeコントローラのhugaアクション呼び出し
■フロント画面
http://localhost/hoge/huga
=> defaultモジュールのhogeコントローラのhugaアクション呼び出し
ディレクトリ構造は以下(抜粋)
application
|-modules
|--default
| |-controllers
| |-models
| |-views
| --webmaster
|-controllers
|-models
|-views
これだと、モデルがそれぞれのモジュール内に配置されることになり、よい面もあると思うのですが、
ほとんどのシステムで管理画面とフロント画面で同一のモデルを使うことが多いので、
webmasterモジュールの方にはmodelを実装しないで、defaultモジュールの方のmodelsにinclude_pathを通し、どのモジュールからもdefaultモジュールのmodelを呼び出すようにしています。
ただ、このやり方がどうしてもしっくりこないので、もう少しスマートなやり方を模索しているのですが、なかなかいい案が浮かびません。
みなさんは管理画面とフロント画面があるようなシステムを構築するときは、どんなやり方でやっていますか?
0306nobodyさん
2010/05/16(日) 00:33:05ID:9d3ZuTykズバリそのやり方してる、俺もなんだかなぁって感じ。
違和感拭えないよね
0307nobodyさん
2010/05/16(日) 00:41:06ID:/nPzlLMdapplication の直下(modules と同階層)に models を置いている。
共通のはそこに置く感じ。
Zend_Application 使ってれば application/models は autoload 対象になるしね。
0308305
2010/05/16(日) 12:51:20ID:???>>307
ありがとうございました。
参考になりました。
Zend_Applicationは確かモジュール毎のiniファイルの記述方法がよくわからなくて、挫折した記憶があります。
もっとよく見てみようと思います。
0309nobodyさん
2010/05/18(火) 10:33:48ID:f5A4YuVy307じゃないけど、Zend_Applicationに関係なく、
アプリケーション全体で共有する可能性のあるものは、
applicationの下に置くよ。
静的なリソースは別ね。
0310nobodyさん
2010/05/26(水) 16:04:27ID:???例えばgrep()でeval()やpreg_replace(eを使用)してユーザリクエストが混ざっているとか、$_FILESを組み込んだアップロード時に脆弱性が無いかとか、ヌルバイト&Dir遡り攻撃に対処しているかとかです
基本的なXSS、ScriptInsersion、SQLインジェクション、セッションハイジャック対策が全体的なコード中に施行されているのか知りたいです
ZFで構築後、また一から各セキュリティホールの確認とか大変だなぁ、と思いまして
FWの作者がZendなので最新バージョンはそういうのにほぼ対策をしているとは思うのですが、こういう攻撃には弱いというのがあったら教えていただきたいです
0311nobodyさん
2010/05/26(水) 16:30:03ID:???でも、個々のアプリケーションでもケアは必要。
ユーザリクエストにコマンドが混ざるとかはアプリケーションの仕様であってFWは感知すべきじゃない、
セッションハイジャックを防ぐための支援機能はあってもそれを使うかどうかはプロジェクト次第
セキュリティホールってのは開発者が責任を持って対処するべきなんじゃないの?
「大変だなぁ」って思うんなら、FWじゃなくて既存のプロダクトをカスタマイズして使う方がいいよ
FWに任せて自分は対処しないって風になると、いくらでも穴は開くからね
0312nobodyさん
2010/05/27(木) 00:28:31ID:???0313nobodyさん
2010/05/27(木) 00:52:04ID:???0314nobodyさん
2010/05/28(金) 09:04:18ID:???セキュリティ対策をFWに頼っているわけではないんだが、例えば(まぁないとは思うが)どこかのコンポーネント内でhtmlspecialcharsとかが入っていない為セキュリティホールになったりしないかということ
そういう場合わざわざソース見て自分で書き直しとかめんどくさいんで
最低限のクォート処理とかそういう事です
0315nobodyさん
2010/05/28(金) 13:53:13ID:???DB系であれば必要な箇所では適切にエスケープされるし、エスケープ方式も設定出来る。
htmlspecialcharsのように場合によっては不要なエスケープは強制されないので、
自分で適切に処理する必要がある。
0316nobodyさん
2010/05/28(金) 20:32:15ID:???まぁ、言いたいことはわからないでもない。
残念ながら、"現段階では"ソースのチェックが必要な気がする。
HTML関連のViewヘルパーでのエスケープはされてるけど、
たとえば、文字コードの指定はロケールを見てるかどうかとか
Viewでエスケーパを指定できるようだけどオプションは?とか。
タグを自動育成するタイプのコンポーネントで穴がないかとか
その辺はやっぱり使うときにソースを確認した方がいいと思う。
0317nobodyさん
2010/05/29(土) 03:27:50ID:???プレースフォルダ使っててもDBI/DBDに問題があったら…
今のとこであったことないけどHTML::FillInFormに問題があったら…
DBI,DBDの仕組みも大儀でいえばFWなのでそういった面では
FWにセキュリティホール対策は任せたい/任せてる部分てあるよね?
とここのところの流れを見てておもいました。
0318nobodyさん
2010/05/30(日) 19:32:08ID:???ソースを確認しても信頼性の評価なんてできないから
自分が作るよりはましと考えて信じて使うしかない
0319nobodyさん
2010/05/31(月) 13:36:10ID:iVMHao47>Apache1.3で%7Fが使えなくて困った
ZFと無関係な話ですが、どういう意味ですか?
昔作ったシステムが今もApache1.3で動いてるんで非常に心配です。
とりあえずurlencodeは使ってますが、それでも問題が起きることがあるんでしょうか?
知ってる人、教えてもらえないでしょうか?
0320nobodyさん
2010/05/31(月) 15:28:20ID:???0321nobodyさん
2010/06/01(火) 10:23:47ID:???0322319
2010/06/02(水) 13:22:49ID:NqHn07VJありがとうございました。
調べたところ問題なさそうでした。
0323nobodyさん
2010/06/04(金) 15:51:23ID:???/index = IntexController->indexAction();
/hoge = IndexController->hogeAction();
とルートしたい場合、独自Routerを書かないと駄目でしょうか?
設定で対応出来るものでしょうか?
0324nobodyさん
2010/06/04(金) 16:27:09ID:???0325sage
2010/06/06(日) 10:36:36ID:???0326nobodyさん
2010/06/09(水) 16:15:06ID:zdg5Ro52Zend_Session::rememberMe()
をログイン画面でログイン成功時に使用しています。
引数には1800秒を指定しているのですが、
この場合、ログイン成功してから1800秒間
セッションが有効になるのでしょうか?
ログイン後の次の画面で
Zend_Session::start();
を呼んで、ログインに成功しているかどうかを判断しているのですが、
Zend_Session::start();をコールしただけでは
セッションの生存期間はリセットされないのでしょうか?
0327nobodyさん
2010/06/11(金) 12:51:52ID:1eqyNkqt0328nobodyさん
2010/06/13(日) 04:57:57ID:???0329nobodyさん
2010/06/13(日) 05:25:30ID:???0330nobodyさん
2010/06/13(日) 07:21:39ID:???0331nobodyさん
2010/06/13(日) 07:57:06ID:???ローカル環境にPHPいれてZF最新版いれて・・・ってやる程恩恵あるのかなと疑問に思ったんだけど、
覚えなくてもいい感じかね。
0332nobodyさん
2010/06/14(月) 20:34:32ID:sDoDPQ6e恥ずかしいんだけど簡単に教えて欲しい、
$query = new Zend_Service_Amazon($access_key, 'JP', $secret_key);
$results = $query->itemSearch(
array(
'SearchIndex' =>'Music',
'Keywords' =>$params['key']
)
);
この$queryと$resultsに対してどうしたら良いのか。。
Amazon/Item.phpの
public function __construct(DOMElement $dom)
をどう解釈したら良いのかわからない…
誰かアドバイス頼みます
0333nobodyさん
2010/06/14(月) 22:17:48ID:+e+bNGnA$results を foreach で回す。
foreach ($result as $k => $v) {
var_dump($v);
}
0334nobodyさん
2010/06/15(火) 10:40:13ID:???どうもありがとう、自己解決したよ
searchのオプションで'ResponseGroup' => 'Medium',指定しないと必要な情報が
そもそも取れないのを気づかなかった
アドバイスもサンキュー
0335nobodyさん
2010/06/16(水) 16:18:46ID:N9yq5s20この返り値$objは $num = $obj -> rowCount(); でアップデートの対象件数を
調べられるってことだけど、これについて教えて欲しい。
具体的に言うと、 アップデートする既存データ(カラム情報)と上書きするデータが
全く変化がないとき、$num=0を返すんだけど、これってこれで正しいの?
まるで変更前のカラム情報と変更後のカラム情報を比較して、実際のupdateするしないを決めてるみたいな挙動だけど
純粋にWhere以下の条件をクリアしてるアップデート対象の件数を返すと思って
更新のエラー判別や件数判定しようと思ってたので困ってます。
ZendFWは1.10、DBはMysqlです。
0336326
2010/06/16(水) 16:42:17ID:XZSSnjmGどなたかご存知の方はいらっしゃらないでしょうか。
0337nobodyさん
2010/06/16(水) 16:44:39ID:???0338326
2010/06/17(木) 11:07:21ID:???色々と試行錯誤しながらも
皆様からのご意見をお待ちしておりました。
現状まだ解決しておりませんので
ご意見いただけると幸いです。
0339nobodyさん
2010/06/17(木) 12:45:38ID:???0341326
2010/06/18(金) 00:18:45ID:???ご回答ありがとうございます。
できれば、一度ログインして
タイムアウトもしくはログアウトをするまでは
同じセッションIDを使用したいと考えています。
rememberMeを呼ぶとセッションIDが書き換わるようなので
ちょっと困っています。
同じセッション間でユーザがどのように
ページを遷移していったかログをとりたいのですが、
その時に識別するキーにセッションIDを使用しています。
セッションIDを使うのではなく、別の一意のIDを用意するべきでしょうか?
0342nobodyさん
2010/06/18(金) 01:06:33ID:???0344nobodyさん
2010/06/18(金) 06:24:53ID:???という神の啓示セヨ
0345326
2010/06/19(土) 12:24:02ID:???ありがとうございます。
それではセッションID以外の一意のキーを用意するようにします。
rememberMeもあまり多用すると、パフォーマンスに影響するという
情報もありましたので、要所要所で使用していきたいと思います。
0346nobodyさん
2010/06/19(土) 12:46:56ID:???0347nobodyさん
2010/06/19(土) 16:33:15ID:MplSKe7WDBがMysqlのとき、トランザクションでcommit()メソッドを使って処理が成功した場合
$db->query($q1);
$db->query($q2);
$rs = $db->commit();
の返り値$rsをvar_dump($rs)したら、object(Zend_Db_Adapter_Pdo_Mysql)なんだけど、
このオブジェクトからエラーコードや処理した行数を取得するメソッドってないのかな?
エラーだけならtry~catchの分岐で捕まえられるけど、行数を取得するにはどうしたらいいの?
非トランザクション処理で返ってくるZend_Db_Statement_Mysqliオブジェクトの場合、
rowCount()とかerrorCode()とかのメソッドを利用してクエリ結果を簡単に確認出来るけど
トランザクション時の方はわからない。
どなたかアドバイスお願いします。
0348nobodyさん
2010/06/19(土) 22:51:45ID:???トランザクションの時も同じだよ。
commit()はあくまで処理を確定する為のメソッド、
実際に処理が行われるのはquery()メソッドなので、
その戻り値(Zend_Db_Statement_Mysqli)で処理結果を取得すればいい。
0349nobodyさん
2010/06/20(日) 00:19:42ID:???おお、レスありがとう。じゃあ、トランザクション処理としてfor文で
クエリ($rs=$db->query($hoge))を10回繰り返すとしたら、
$n = $rs->rowCount(); とか $rs->errorCode();とかの処理も
10回for文の中で繰り返さなきゃいけないわけだよね
しょうがないけど、効率悪いような… ともかくありがとう
0350nobodyさん
2010/06/20(日) 00:38:46ID:???それはZendじゃなくてSQLの仕様だよ
10回クエリを投げるなら、10回期待した結果が得られたかどうかキチンと判定しないと、
commitもしくはrollbackが出来ないだろうさ
0351nobodyさん
2010/06/20(日) 01:13:52ID:???たとえば5回目でinsertするカラムの数と値の数があわなかったらエラーで
rollbackされるわけだよね?
逆に言えば複数回のクエリ(トランザクション利用)の「全体としての成功/失敗」程度しか
確認が必要じゃない時は
commitできたときはtrueをreturn、rollbackのときはfalseなりエラーメッセージをreturnで
検証完了と割り切っちゃって良いのかな
0352nobodyさん
2010/06/20(日) 02:11:43ID:???>commitしたってことは各回のクエリに失敗は無かったってことでしょ?
>たとえば5回目でinsertするカラムの数と値の数があわなかったらエラーで
>rollbackされるわけだよね?
これは逆じゃない?
commitする前にクエリが正常に完了したかどうかを自前で判断して、
OKであればcommit、NGであればrollbackを行うべきかと・・・
SQLクエリ自体が通ってしまえば、commitは出来てしまうので、
commitが出来た=全体として成功って判断は危険だと思うよ。
0353nobodyさん
2010/06/20(日) 02:22:43ID:???トランザクションの認識自体がオカシイ、Zend以前の問題ぽいですね
ttp://pluto-blog.blog.so-net.ne.jp/2007-01-15
こんなサイト見つけて、この考え方で良いのかなって思ったんだけど…
0354nobodyさん
2010/06/20(日) 03:14:42ID:???そのサイトの超絶簡単サンプル1だね。
サンプルでは「SQLクエリにエラーがなかった場合、処理は成功」としているけど、
例えば「行を削除するが、テーブルの行が5件未満になってはいけない」みたいな条件がある場合、
単にSQLクエリが成功したかどうかで判断するのは難しいよね。
例)DELETE句自体に問題は無いのでcommit()出来てしまう。
$db->beginTransaction();
try {
$db->query("DELETE FROM tableName");
$db->commit();
} catch (Exception $e) {
$db->rollBack();
}
これではマズイのでcommit()を行う前に、
自前でDELETE後の行数を確認する必要があるわけだ。
0355nobodyさん
2010/06/20(日) 18:48:10ID:???空港でチケット止めたり、ICカードシステムが止まるような仕様だよそれ。
普段はうまく行ってるけど、実はバグってて見えないだけ、を隠蔽してる。
0356351
2010/06/20(日) 23:49:48ID:???どうもありがとう。正直すんなり理解出来ないんですよね、トランザクション勉強し直しかなこりゃ。。
>「行を削除するが、テーブルの行が5件未満になってはいけない」みたいな条件がある場合
…というような条件は無いんだけど、ループするクエリ処理をその都度検証すべしってことは
try{
$success = 0;
for($i=0;$i<$loop;$i++){
$rs = $db->query(insert 〜);
//以下で登録クエリの成功を確認
$chk1 = $rs->rowCount();
$chk2 = $rs->errorCode();
if($chk1==1 && $chk2=="00000")$success++;
}
if($success ==$loop){
$db->commit();
}else{
//ループのどこかで失敗してる
$db->rollBack();
}
} catch (Exception $e) {
$db->rollBack();
}
こんな感じでいいんですかね?
5件以下になってはいけない云々みたいな条件が無い時でもこういう処理が必要なら
トランザクションの説明全部にそう書いてて欲しかったなぁ… ずっと誤解してたよ
0357nobodyさん
2010/06/21(月) 00:03:17ID:???途中でエラーが出た場合、ループを抜けないと無駄なクエリを発行する事になってしまうので、
ループ部分はこんな感じでもいいと思う。
for($i=0;$i<$loop;$i++){
if($db->query(insert 〜)->rowCount() != 1)
throw new Exception('クエリの結果がおかしいです><');
}
>トランザクション
簡易カートシステムを設計してみると理解し易いかもよ。
1回の処理で、在庫確認、発注処理、決済処理が発生して、
1つでも失敗した場合はrollbackを行う。みたいな。
0358nobodyさん
2010/06/21(月) 00:14:33ID:???その不可分なクエリをまとめるのがトランザクションで、
含まれるクエリ全部が成功するか、あるいは何もしなかったことにするか、
どっちかの結果しかない。(中途半端な成功はデータの不整合になる)
特に指定しなければ、1つのクエリが1つのトランザクションという扱いになってる。
というのがオイラの理解。
0359351
2010/06/21(月) 00:14:59ID:???おお、素早いレスありがとう。
その例だとわかりやすいし、よく銀行の出金〜入金を例にしてるけど
そういうサンプルでも出勤処理と入金処理それぞれのクエリ文2つ並べてるだけで、
それぞれの結果をチェックしてるのみたことないよ
だからcommit処理ってエラーチェック自体したうえでcommitしてるものだと思ってた
まあZendFWと関係ないレベルで申し訳ないです。
勉強になりました。ありがとう。
0361nobodyさん
2010/06/22(火) 16:44:11ID:???いや、つーか惜しかったんだよ。
commitが成功するか、否かじゃなくて例えば100件個別にインサートするのに
100回実行した後で、インサート件数が100件じゃなかったらrollbackする、
つうまとめてチェックなら一般的に用いられてる。それでも失敗した件数
(出来ればとれが失敗したか)をユーザに知らせる親切設計にするんだけどね。
まぁTwo phase commit とかsave point経験すると、この辺は呼吸するみたいに
当然の仕様になるんだが、、、金融系だと1円のミスでも塵積で賠償問題に
なっちゃうからね。
■ このスレッドは過去ログ倉庫に格納されています