[Codeigniter-users] updateがうまくいかない?( CIで構築したサイトでコンペ受賞しました)

Back to archive index

ariari.jp ariar****@gmail*****
2008年 3月 20日 (木) 00:23:13 JST


加畑さん


はじめまして。ariariです。

下記の件ですが、とりあえず、SQLログを出力してみてはいかがでしょうか。

問題のレコードが書き込まれる前後に、どのような操作がされていたのかがわか
れば、解決の手助けにはなるかと思います。


CI1.5.4で構築した手元のアプリケーション(RDBMSはMySQL5、CIのDBドライバは
mysqlを使用)で確認してみたところ、

system/database/drivers/mysql/mysql_driver.phpの_prep_queryメソッド内の
returnの直前に、

log_message('debug', $sql);

を挿入することで、実行直前のSQLがログ出力されることを確認しました。


log_messageの第1引数は、出力したいレベルに応じて、適宜書き換えてください。

system/application/config/config.phpのlog_thresholdの設定に依存すると思
うので、

SQLログのみ出力したい場合は、log_thresholdを1にして、errorにしてしまった
ほうがいいかもしれません。

2以上になるとログの量が増えますので。。


いろいろ書いてみましたが、CIのライブラリ部分を書き換えることになるので、

まずは開発環境で確認してみてはいかがでしょうか。


以上です。

kabayan さんは書きました:
> 加畑です。
>
> はずかしーー!レポートありがとうございます。
> 記事のせいか、なんかどんどんいろいろな人が使い始めているようで、DBの書き込み
> 速度が
> 間に合わず、妙なデータが書き込まれてしまっていました。
> とりあえずパッチをあてて修正しましたが、、、
>
> ※※※※※
> コードの書き方(と設計)が悪いかもしれませんが、DBに書き込んだデータがコミッ
> トされる
> タイミングが不安定?です。activerecordの使い方に問題があるのでしょうか?
> 具体的には下記のコードで-9999が検出されます。しかし毎回ではなく、タイミン
> グ、発生条件
> の再現性はありません。
> アドバイス等いただけるととても助かります!
> ------------
> Tabel sl_memoryにはautoinclimentの列、idがあるとします。
>
> ある連続したデータがsl_memoryに書き込まれるのですが、同時に複数が書き込むた
>> Owner_Nameで区別しています。
>
> //新しいデータが来たら、まず、同じOwner_Nameのデータの最後(最新)のstartid列
>> 取得しようとします。
> 		$this->db->where('Owner_Name', $req['Owner_Name']);
> 	//idが一番大きな行のstartidを探す。すなわち最後にinsertされた行を探
> しています。
> 			$this->db->orderby('id','desc');
> 			$res = $this->db_get('sl_memory',1,0);
> 			$row = $res->row();
> 			$startid = $row->startid;
> // ここで0ということはtableのデフォルト値のまま。すなわち後半のupdate(※1)
> が動作していない?判別用に-9999をセット
> 			if ($startid == 0) $startid = -9999;
> //最後のレコードidを保存
> 			$id = $row->id;
> //最新レコードを追加
> 			$this->db->insert('sl_memory', $req);
> //追加レコードしたレコードを検索してidを得る。複数のスレッドでinsertの可能性
> があるので、再検索しないとidが
> 正しくない。条件はstartid==0、すなわちinsertされた後、startidがセットされて
> いないものになる。
> 			$this->db->where('Owner_Name', $req['Owner_Name']);
> 			$this->db->where('startid',0);
> 			$res = $this->db_get('sl_memory',1,0);
> 			$row = $res->row();
> //追加したレコードのidを保存
> 			$nextid = $row->id;
>
> //一回前のレコードから現レコードヘのポインタを更新
> 			$this->db->set('nextid', $nextid);
> 			$this->db->where('id',$id);
> 			$this->db->update('sl_memory');
>
> //追加したレコードのstartidを更新
> //正しく更新できていればstartidに0が入る可能性はない。※1
> 			$this->db->set('startid', $startid);
> 			$this->db->where('id',$nextid);
> 			$this->db->update('sl_memory');
>
>
>   
>> -----Original Message-----
>> From: codei****@lists*****
>> [mailto:codei****@lists*****] On
>> Behalf Of 木下 敏夫
>> Sent: Wednesday, March 19, 2008 1:08 AM
>> To: codei****@lists*****
>> Subject: Re: [Codeigniter-users] CIで構築したサイトでコンペ受賞しました
>>
>> 木下です。
>>
>> http://mementa.net/mementa/contact/
>> もちょっとおかしい見たいです。
>>
>> レスポンスは凄く良いですね。
>>
>>
>> Kenichi Ando さんは書きました:
>>     
>>> 安藤です。
>>>
>>> 加畑さん、こんにちは。
>>> 受賞おめでとうございます。すばらしいサイトですね!
>>> 事例掲載の許可を頂きたいです。
>>>
>>> さっそくサイトに接続したところ、
>>> http://mementa.net
>>> エラーが出ているようです。(2008/0319 0:59現在)
>>>
>>> ご報告までに。
>>>
>>>
>>> 08/03/17 に kabayan<kabay****@adlib*****> さんは書きました:
>>>       
>>>> 加畑@adlibです。
>>>>
>>>>  先日行われた日経アーキテクチャ主催のデザインコンペで
>>>>  佳作を受賞しました。
>>>>
>>>>
>>>>         
>> http://trendy.nikkeibp.co.jp/article/special/20080313/1008076/?ST=as_
>>     
>>>> slis
>>>>  (次週にはもちっと詳しい解説が載るはずです)
>>>>
>>>>  応募したのはセカンドライフの人(アバター)の動きをリアルタイムで記録
>>>>         
> し、それ
>   
>>>>  を再生する
>>>>  ことができるメメンタというサービスを使ったものです。
>>>>  http://mementa.net
>>>>  このサイトはCIでデザインとセカンドライフ内のスクリプトを除き、約1週間
>>>>         
> で製作
>   
>>>>  しました。
>>>>  (デザインは結構苦労したんですけど^o^;)
>>>>
>>>>  私は元々はASP(.net)とかがメインだったので、PHP系で1から作るのは初めて
>>>>         
> だった
>   
>>>>  のですが
>>>>  CIのおかげでなんとかものになりました。
>>>>
>>>>  どなたにお礼すべきかわかりませんが、もし事例の隅が空いていてフィラーに
>>>>         
> でも
>   
>>>>  使っていただければ
>>>>  ちょっと恩返しになるかなと思います。
>>>>
>>>>  今後も改造していくつもり&わかる範囲でノウハウだしをするつもりなのでよ
>>>>         
> ろしく
>   
>>>>  お願いします。
>>>>
>>>>  _______________________________________________
>>>>  Codeigniter-users mailing list
>>>>  Codei****@lists*****
>>>>  http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
>>>>
>>>>         
>>> _______________________________________________
>>> Codeigniter-users mailing list
>>> Codei****@lists*****
>>> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
>>>
>>>
>>>       
>> --
>> 木下敏夫
>> mailto:kino****@tktoo*****
>> http://www.tktools.jp/
>> http://okusama-shop.com/
>> http://www.oidc.jp/bmb/index.php?topic=-m-D14
>> --------------------------------------------------------------
>> -----------
>> ビジネスマッチングブログ・キックオフセミナーにパネリストとして参加します。
>> http://www.oidc.jp/bmb/article.php/20080207143305526
>> --------------------------------------------------------------
>> -----------
>>
>> _______________________________________________
>> Codeigniter-users mailing list
>> Codei****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
>>
>>     
>
> _______________________________________________
> Codeigniter-users mailing list
> Codei****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users
>   




Codeigniter-users メーリングリストの案内
Back to archive index