トップページphp
1001コメント368KB

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:T3UCpDKa
>>261 Thanksです
0263nobodyさん2010/04/21(水) 18:21:04ID:mfVJoQpI
quickstartとほぼ同じ構成なんですけど、
アクセスURLが /mだったらレイアウトをmobile.phtmlにするって
application.iniでは記述できませんよね?ディスパッチャを拡張するとか?

しょうがないので今はコントローラの中で
$this->view->layout()->setLayout('mobile');
とやってるんですが、そんなもんでしょうか?
02642632010/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+3
Service_Amazonを使いたいんですが問題が発生します。

if(!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
>>266
どうもありがとうございます
バージョンが古いのが問題かと思って新しくしたんですが、まだエラーが出ます。
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:???
ggrks
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:???
>>268
どうもです。
しかし、そこに書いてあることやったんですけどエラー解消しないんですよね
php質問スレに詳細書いたので、気が向いたらお願いします。ありがとうございました
0270nobodyさん2010/04/23(金) 04:13:25ID:QeXW5bBg
すみません、zendFW1.10.3を利用してるんですが、Zend_Service_Amazonの使い方、以下で間違ってますか?

$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
Zend_Cache_Frontend_File(http://framework.zend.com/manual/ja/zend.cache.frontends.html)について分からないことがあります

このフロントエンドはバックエンドのオプションとしてmaster_fileを設定するのだと思います
実際上記のマニュアルにも「唯一しなければいけないのは・・・」と書かれています
しかし、上記のマニュアルにはmaster_fileは非推奨と書かれています。
これはどういうことなのでしょうか?

master_fileではなく、master_filesを使えということなのでしょうか?

それともそもそもマスタファイルへのフルパスを指定することがいけないということで非推奨なのでしょうか?
となるとファイルが更新されたタイミングでキャッシュがリフレッシュされるという事が無くなり、そもそもこのフロントエンドの意味が無くなり、このフロントエンド自体が非推奨になってしまうと思うのですが・・・
0272nobodyさん2010/04/23(金) 12:26:10ID:???
>>271
質問なげえよ。master_files使えって意味だよ。
同じ役割だから、小さい方は廃止予定なんだよ。よくあること
0273nobodyさん2010/04/24(土) 04:32:30ID:6V3fZIph
すみません、誰か>>270の質問に意見お願いします。
いまだに原因わからずで… 勝手言ってすみません、気が向いたらお願いします
0274nobodyさん2010/04/24(土) 05:40:42ID:???
>>273
$results を foreach してみたら?イテレーターみたいだから。

参考
http://d.hatena.ne.jp/boto/20070923/1190482142
02752732010/04/24(土) 16:15:43ID:???
>>274
ありがとうございます!
そのページも見てたんですけど、var_dumpで確認すれば万能って思ってました
イテレータって物自体知らなかった… 本当にありがとう!
0276nobodyさん2010/05/01(土) 10:59:43ID:???
フレームワーク初挑戦とおもってクイックスタート読もうとしたら英語か・・・目次だけ日本語とかパケ詐欺からよ;;
低学歴は本買えってことか・・・
0277nobodyさん2010/05/01(土) 11:03:13ID:???
低学歴はPGやるな
0278sage2010/05/02(日) 10:44:31ID:KVSpskbJ
>>276
「誰かが翻訳しておいてくれる」のが当たり前のことだと思っているのですね。
去年の「Zend_Application まだ翻訳されていない、どうなっているんだ」や
「公式運営者はもっと頑張るべきだ」発言者のように
0279nobodyさん2010/05/02(日) 10:54:01ID:???
そういう考えの人もいるし、考え方は人それぞれ。
翻訳してやってますよ感を出す意味が分からない。
0280nobodyさん2010/05/02(日) 11:45:58ID:???
てか去年の話を蒸し返すとかどんだけ
0281sage2010/05/02(日) 12:19:45ID:Y8fRDT50
>>279
2行目が分かりません
0282nobodyさん2010/05/02(日) 23:04:41ID:???
同意を得ようと意見を放つも、否定されると「人それぞれだろ」と逆ギレするのはゆとり低学歴の特徴。
自分に理解出来ないことは、理解しようという姿勢すら示さないのも低学歴の特徴。
0283nobodyさん2010/05/02(日) 23:49:44ID:???
なんというブーメラン
0284nobodyさん2010/05/03(月) 00:58:35ID:???
>>279
お前、海賊版のソフトを平気な顔して使って
「ボッタクリ価格なのが悪い!」
「もともと買う気は無いからメーカーに損は無い!」
「むしろ俺が使う事で知名度が上がるだろ!」
とか言うタイプだろw

翻訳してやってますよとは思わないが、対価も支払う気が無い輩の言うことでは無いわなw
人それぞれで結論づけるならチラシの裏にでも書いてろよw
0285nobodyさん2010/05/03(月) 02:13:23ID:???
草の生えた文章は読む気にならん
0286nobodyさん2010/05/03(月) 02:35:26ID:???
>>285
お前、海賊版のソフトを平気な顔して使って
「ボッタクリ価格なのが悪い!」
「もともと買う気は無いからメーカーに損は無い!」
「むしろ俺が使う事で知名度が上がるだろ!」
とか言うタイプだろ

翻訳してやってますよとは思わないが、対価も支払う気が無い輩の言うことでは無いわな
人それぞれで結論づけるならチラシの裏にでも書いてろよ
0287nobodyさん2010/05/03(月) 03:11:31ID:???
痛い>>276 >>279がいると聞いてやってきました。
API Docの英語くらい理解できる程度に勉強しておけば良かったな
0288nobodyさん2010/05/03(月) 08:26:50ID:???
目次以外にも訳されてるところけっこうあるよね。
別に英語だけでも困らないけど、やっぱり日本語の方がありがたい。
0289nobodyさん2010/05/03(月) 18:41:49ID:7alvR5zV
質問なんだけど、みんなサーバのメールソフト,MTAは何使ってる?
sendmail?postfix?qmail?
zendFWのサービスていうかzend_mailを使うにあたって、3つのうちで特に相性がいいものってあるのかな?
zend_mailの利用に関して注意点とかトラブルとかあった?
あったら教えてください。お願いします。
0290nobodyさん2010/05/03(月) 20:36:44ID:???
互換性気にするなら、sendmailしかないでしょ。
0291sage2010/05/05(水) 00:26:42ID:/pDwsnJ7
>>289 , 290
290を補足すると、 Zend_Mail_Transport_Smtp 及び Zend_Mail_Transport_Sendmail が
sendmail を前提にしており、他のMTAをカバーするためのクラスは、まだ用意できていなかったはずです
0292nobodyさん2010/05/06(木) 00:26:10ID:j7c7uMQS
>>290,291
ありがとうございます

っていうか、マジで?sendmailしか対応できないの?
Sendmailってセキュリティ設定が難しくて敬遠されがちらしいし、
扱いやすいpostfixにMTAを切り替えてたんだけど、無駄なことしたのかな…orz
やっとインスコ成功したのに…
調べてみます、ありがとう
02932922010/05/06(木) 00:45:43ID:j7c7uMQS
一人で何度も聞いて申し訳ないのですが、zend_mailについてもう一つ質問です。

zend以前の問題かもしれないですが、ttp://blog.enjoitech.jp/article/201 を見ると、
自前のサーバ上のMTAを使わず、gmailを使ってメール送信できるそうですが、
・自前でMTAを利用する
・gmailで送信する
この二つのメリット/デメリットは何でしょうか?

思いつくのはgmailのダウン時の巻き添えくらいしかないのですがほかに何かありますか?
0294nobodyさん2010/05/06(木) 00:58:07ID:???
>>292
>>っていうか、マジで?sendmailしか対応できないの?
SMTP経由すればMTA関係無いんじゃないか?

>>293
・自前でMTAを利用する
 自由に弄れる反面、コストもかかるし維持も面倒。

・gmailで送信する
 制限はあるが、コストはかからない。

作るサービス次第だと思うよ。
0295nobodyさん2010/05/06(木) 01:10:04ID:???
>>290-292
sendmailつっても、この場合sendmailコマンドじゃなかったけ。
うちはpostfix使っているけど特に問題なく使えているよ。
0296nobodyさん2010/05/06(木) 16:26:28ID:???
qmail も sendmail ラッパーあるみたいだし大丈夫だろ
0297nobodyさん2010/05/08(土) 04:09:56ID:???
php自体勉強をはじめてまもない為他に何を伝えればいいのか良くわかっていないのですが

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:???
Zend_Controller_Router_Route_Interfaceを実装して
オリジナルのRoute作ってるんだけど
assemble()ってどういうときに呼ばれるんだろうか?
今のところ何も実装しなくても希望の動作になってるから良いのだが。。

ちょっと調べた感じ、Redirectのときに使われるっぽい?
RouterでRedirect?よくわからん。。。
0299nobodyさん2010/05/10(月) 11:25:43ID:???
Apache1.3で%7Fが使えなくて困ったときに使ったことあるな。
 配列→パス が assemble() で
 パス→配列 が match()
心臓部分なので実装しなければ(空実装?)使いもにならんはずだが。
0300nobodyさん2010/05/10(月) 13:39:42ID:???
grep -r '>assemble' Zend/Controller/
個人的によく使うのはurlヘルパーかな
0301nobodyさん2010/05/10(月) 20:26:01ID:???
>>299
>>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の文字化け対策はQdmailと併用するのがベストなの?
あと、Zend_mailで送信サーバをGoogleにして使うとき、送信者アドレスが
Gmailのアドレスになるのはどうしようもない?
0303nobodyさん2010/05/15(土) 16:47:51ID:9enG3To7
あ、さげちゃった。 age
0304nobodyさん2010/05/15(土) 16:51:16ID:9enG3To7
× Zend_mailで送信サーバをGoogleにして使うとき
○ 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
>>305
ズバリそのやり方してる、俺もなんだかなぁって感じ。
違和感拭えないよね
0307nobodyさん2010/05/16(日) 00:41:06ID:/nPzlLMd
>>305
application の直下(modules と同階層)に models を置いている。
共通のはそこに置く感じ。
Zend_Application 使ってれば application/models は autoload 対象になるしね。
03083052010/05/16(日) 12:51:20ID:???
>>306
>>307
ありがとうございました。
参考になりました。

Zend_Applicationは確かモジュール毎のiniファイルの記述方法がよくわからなくて、挫折した記憶があります。
もっとよく見てみようと思います。
0309nobodyさん2010/05/18(火) 10:33:48ID:f5A4YuVy
>>308
307じゃないけど、Zend_Applicationに関係なく、
アプリケーション全体で共有する可能性のあるものは、
applicationの下に置くよ。
静的なリソースは別ね。
0310nobodyさん2010/05/26(水) 16:04:27ID:???
ZendFrameworkってセキュリティはどうですか?
例えばgrep()でeval()やpreg_replace(eを使用)してユーザリクエストが混ざっているとか、$_FILESを組み込んだアップロード時に脆弱性が無いかとか、ヌルバイト&Dir遡り攻撃に対処しているかとかです
基本的なXSS、ScriptInsersion、SQLインジェクション、セッションハイジャック対策が全体的なコード中に施行されているのか知りたいです

ZFで構築後、また一から各セキュリティホールの確認とか大変だなぁ、と思いまして
FWの作者がZendなので最新バージョンはそういうのにほぼ対策をしているとは思うのですが、こういう攻撃には弱いというのがあったら教えていただきたいです
0311nobodyさん2010/05/26(水) 16:30:03ID:???
FWレイヤーで対処すべきコードは基本的に対処されてる。
でも、個々のアプリケーションでもケアは必要。
ユーザリクエストにコマンドが混ざるとかはアプリケーションの仕様であってFWは感知すべきじゃない、
セッションハイジャックを防ぐための支援機能はあってもそれを使うかどうかはプロジェクト次第

セキュリティホールってのは開発者が責任を持って対処するべきなんじゃないの?
「大変だなぁ」って思うんなら、FWじゃなくて既存のプロダクトをカスタマイズして使う方がいいよ
FWに任せて自分は対処しないって風になると、いくらでも穴は開くからね
0312nobodyさん2010/05/27(木) 00:28:31ID:???
セキュリティ対策をframeworkに頼ってる奴とか最悪すぎる
0313nobodyさん2010/05/27(木) 00:52:04ID:???
ASP使いには多いけどなw
0314nobodyさん2010/05/28(金) 09:04:18ID:???
>>312
セキュリティ対策をFWに頼っているわけではないんだが、例えば(まぁないとは思うが)どこかのコンポーネント内でhtmlspecialcharsとかが入っていない為セキュリティホールになったりしないかということ
そういう場合わざわざソース見て自分で書き直しとかめんどくさいんで
最低限のクォート処理とかそういう事です
0315nobodyさん2010/05/28(金) 13:53:13ID:???
>>314
DB系であれば必要な箇所では適切にエスケープされるし、エスケープ方式も設定出来る。

htmlspecialcharsのように場合によっては不要なエスケープは強制されないので、
自分で適切に処理する必要がある。
0316nobodyさん2010/05/28(金) 20:32:15ID:???
>>314
まぁ、言いたいことはわからないでもない。
残念ながら、"現段階では"ソースのチェックが必要な気がする。

HTML関連のViewヘルパーでのエスケープはされてるけど、
たとえば、文字コードの指定はロケールを見てるかどうかとか

Viewでエスケーパを指定できるようだけどオプションは?とか。

タグを自動育成するタイプのコンポーネントで穴がないかとか
その辺はやっぱり使うときにソースを確認した方がいいと思う。
0317nobodyさん2010/05/29(土) 03:27:50ID:???
perlなんかだと、プログラマーが気を使っても
プレースフォルダ使っててもDBI/DBDに問題があったら…
今のとこであったことないけどHTML::FillInFormに問題があったら…

DBI,DBDの仕組みも大儀でいえばFWなのでそういった面では
FWにセキュリティホール対策は任せたい/任せてる部分てあるよね?

とここのところの流れを見てておもいました。
0318nobodyさん2010/05/30(日) 19:32:08ID:???
へたれプログラマだと
ソースを確認しても信頼性の評価なんてできないから
自分が作るよりはましと考えて信じて使うしかない
0319nobodyさん2010/05/31(月) 13:36:10ID:iVMHao47
>>299

>Apache1.3で%7Fが使えなくて困った

ZFと無関係な話ですが、どういう意味ですか?
昔作ったシステムが今もApache1.3で動いてるんで非常に心配です。
とりあえずurlencodeは使ってますが、それでも問題が起きることがあるんでしょうか?
知ってる人、教えてもらえないでしょうか?
0320nobodyさん2010/05/31(月) 15:28:20ID:???
試せばいいのでは
0321nobodyさん2010/06/01(火) 10:23:47ID:???
AllowEncodedSlashesでググレ
03223192010/06/02(水) 13:22:49ID:NqHn07VJ
>>321
ありがとうございました。
調べたところ問題なさそうでした。
0323nobodyさん2010/06/04(金) 15:51:23ID:???

/index = IntexController->indexAction();
/hoge = IndexController->hogeAction();

とルートしたい場合、独自Routerを書かないと駄目でしょうか?
設定で対応出来るものでしょうか?
0324nobodyさん2010/06/04(金) 16:27:09ID:???
staticでもregexでもrouteでもいける
0325sage2010/06/06(日) 10:36:36ID:???
奈良県人と高野豆腐が大嫌い
0326nobodyさん2010/06/09(水) 16:15:06ID:zdg5Ro52
お世話になります。

Zend_Session::rememberMe()
をログイン画面でログイン成功時に使用しています。

引数には1800秒を指定しているのですが、
この場合、ログイン成功してから1800秒間
セッションが有効になるのでしょうか?

ログイン後の次の画面で
Zend_Session::start();
を呼んで、ログインに成功しているかどうかを判断しているのですが、
Zend_Session::start();をコールしただけでは
セッションの生存期間はリセットされないのでしょうか?

0327nobodyさん2010/06/11(金) 12:51:52ID:1eqyNkqt
過疎ってる?
0328nobodyさん2010/06/13(日) 04:57:57ID:???
zfコマンドて皆使ってる?
0329nobodyさん2010/06/13(日) 05:25:30ID:???
一番最初にディレクトリ構造作るときしか使ったことない。
0330nobodyさん2010/06/13(日) 07:21:39ID:???
delete がないから使いづらい
0331nobodyさん2010/06/13(日) 07:57:06ID:???
自分も最初にディレクトリ構造作っったものをコピペで済ましてるわ。

ローカル環境にPHPいれてZF最新版いれて・・・ってやる程恩恵あるのかなと疑問に思ったんだけど、
覚えなくてもいい感じかね。
0332nobodyさん2010/06/14(月) 20:34:32ID:sDoDPQ6e
Zend_Service_Amazon_Itemってどう使ったら良いの?
恥ずかしいんだけど簡単に教えて欲しい、

$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
>>332
$results を foreach で回す。

foreach ($result as $k => $v) {
var_dump($v);
}
0334nobodyさん2010/06/15(火) 10:40:13ID:???
>>333
どうもありがとう、自己解決したよ
searchのオプションで'ResponseGroup' => 'Medium',指定しないと必要な情報が
そもそも取れないのを気づかなかった
アドバイスもサンキュー
0335nobodyさん2010/06/16(水) 16:18:46ID:N9yq5s20
Zend_Dbのqueryメソッドでupdateしたときの返り値Zend_Db_Statementオブジェクトについて知りたい。
この返り値$objは $num = $obj -> rowCount(); でアップデートの対象件数を
調べられるってことだけど、これについて教えて欲しい。

具体的に言うと、 アップデートする既存データ(カラム情報)と上書きするデータが
全く変化がないとき、$num=0を返すんだけど、これってこれで正しいの?

まるで変更前のカラム情報と変更後のカラム情報を比較して、実際のupdateするしないを決めてるみたいな挙動だけど
純粋にWhere以下の条件をクリアしてるアップデート対象の件数を返すと思って
更新のエラー判別や件数判定しようと思ってたので困ってます。

ZendFWは1.10、DBはMysqlです。
03363262010/06/16(水) 16:42:17ID:XZSSnjmG
前回の質問で回答をいただけなかったのですが、
どなたかご存知の方はいらっしゃらないでしょうか。
0337nobodyさん2010/06/16(水) 16:44:39ID:???
まさかこの一週間ずっと待ってたのか
03383262010/06/17(木) 11:07:21ID:???
>>337

色々と試行錯誤しながらも
皆様からのご意見をお待ちしておりました。

現状まだ解決しておりませんので
ご意見いただけると幸いです。
0339nobodyさん2010/06/17(木) 12:45:38ID:???
ワロタww
0340nobodyさん2010/06/17(木) 14:18:36ID:???
>>338
セッションの生存期間を延長したければ、もういちどrememberMeをコールしたほうがいいよ。
03413262010/06/18(金) 00:18:45ID:???
>>340

ご回答ありがとうございます。

できれば、一度ログインして
タイムアウトもしくはログアウトをするまでは
同じセッションIDを使用したいと考えています。

rememberMeを呼ぶとセッションIDが書き換わるようなので
ちょっと困っています。

同じセッション間でユーザがどのように
ページを遷移していったかログをとりたいのですが、
その時に識別するキーにセッションIDを使用しています。

セッションIDを使うのではなく、別の一意のIDを用意するべきでしょうか?
0342nobodyさん2010/06/18(金) 01:06:33ID:???
なんで小出しにしたの
0343nobodyさん2010/06/18(金) 05:58:12ID:???
>>341

> セッションIDを使うのではなく、別の一意のIDを用意するべきでしょうか?

はい
0344nobodyさん2010/06/18(金) 06:24:53ID:???
セッションハイジャックも考えて内部で別の値で保持せよ
という神の啓示セヨ
03453262010/06/19(土) 12:24:02ID:???
>>343 344

ありがとうございます。

それではセッションID以外の一意のキーを用意するようにします。

rememberMeもあまり多用すると、パフォーマンスに影響するという
情報もありましたので、要所要所で使用していきたいと思います。
0346nobodyさん2010/06/19(土) 12:46:56ID:???
rememberMe()ってクッキーの有効期限を操作するものだと思ってた。
0347nobodyさん2010/06/19(土) 16:33:15ID:MplSKe7W
Zend_dbのトランザクション処理について質問。
DBが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:???
>>347
トランザクションの時も同じだよ。

commit()はあくまで処理を確定する為のメソッド、
実際に処理が行われるのはquery()メソッドなので、
その戻り値(Zend_Db_Statement_Mysqli)で処理結果を取得すればいい。
0349nobodyさん2010/06/20(日) 00:19:42ID:???
>>348
おお、レスありがとう。じゃあ、トランザクション処理としてfor文で
クエリ($rs=$db->query($hoge))を10回繰り返すとしたら、
$n = $rs->rowCount(); とか $rs->errorCode();とかの処理も
10回for文の中で繰り返さなきゃいけないわけだよね
しょうがないけど、効率悪いような… ともかくありがとう
0350nobodyさん2010/06/20(日) 00:38:46ID:???
>>349
それはZendじゃなくてSQLの仕様だよ
10回クエリを投げるなら、10回期待した結果が得られたかどうかキチンと判定しないと、
commitもしくはrollbackが出来ないだろうさ
0351nobodyさん2010/06/20(日) 01:13:52ID:???
commitしたってことは各回のクエリに失敗は無かったってことでしょ?
たとえば5回目でinsertするカラムの数と値の数があわなかったらエラーで
rollbackされるわけだよね?
逆に言えば複数回のクエリ(トランザクション利用)の「全体としての成功/失敗」程度しか
確認が必要じゃない時は
commitできたときはtrueをreturn、rollbackのときはfalseなりエラーメッセージをreturnで
検証完了と割り切っちゃって良いのかな
0352nobodyさん2010/06/20(日) 02:11:43ID:???
>>351
>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:???
>>353
そのサイトの超絶簡単サンプル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:???
>>351
空港でチケット止めたり、ICカードシステムが止まるような仕様だよそれ。
普段はうまく行ってるけど、実はバグってて見えないだけ、を隠蔽してる。
03563512010/06/20(日) 23:49:48ID:???
>>354,355
どうもありがとう。正直すんなり理解出来ないんですよね、トランザクション勉強し直しかなこりゃ。。
>「行を削除するが、テーブルの行が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:???
>356
途中でエラーが出た場合、ループを抜けないと無駄なクエリを発行する事になってしまうので、
ループ部分はこんな感じでもいいと思う。
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つのトランザクションという扱いになってる。

というのがオイラの理解。
03593512010/06/21(月) 00:14:59ID:???
>>357
おお、素早いレスありがとう。
その例だとわかりやすいし、よく銀行の出金〜入金を例にしてるけど
そういうサンプルでも出勤処理と入金処理それぞれのクエリ文2つ並べてるだけで、
それぞれの結果をチェックしてるのみたことないよ
だからcommit処理ってエラーチェック自体したうえでcommitしてるものだと思ってた

まあZendFWと関係ないレベルで申し訳ないです。
勉強になりました。ありがとう。
03603512010/06/21(月) 00:16:48ID:???
>>358
こちらもありがとう。
もう少しトランザクション調べるよ。ほんとにありがとう。
0361nobodyさん2010/06/22(火) 16:44:11ID:???
>>359
いや、つーか惜しかったんだよ。
commitが成功するか、否かじゃなくて例えば100件個別にインサートするのに
100回実行した後で、インサート件数が100件じゃなかったらrollbackする、
つうまとめてチェックなら一般的に用いられてる。それでも失敗した件数
(出来ればとれが失敗したか)をユーザに知らせる親切設計にするんだけどね。

まぁTwo phase commit とかsave point経験すると、この辺は呼吸するみたいに
当然の仕様になるんだが、、、金融系だと1円のミスでも塵積で賠償問題に
なっちゃうからね。
■ このスレッドは過去ログ倉庫に格納されています