ようこそゲストさん

CPA-LABテクニカル

2008/01/17(木) CakePHPとSQLite(&MySQL)

はてブ情報 はてブに登録 はてブ数 cakephpspok
(追記)この記事には続きがあります。cakephpとSQLiteの続き(2008/2/2)
(追記の追記)もっと効率的な修正方法があります。CakePHP1.2bとSQLite不具合のもっと簡単な直し方
(追記の追記の追記)CakePHP1.2をSQLite3で動かしてみた。&ダウンロード

なぜかサンプル程度つまづく。CakeでSQLiteを使っているのは少数派なのか、情報が少ない。

データベースのidフィールドが integer primary key なのに、cakephpで作られるSQL文が '' の入力になってたものだから、 datatype errorがでて困っていた。SQLiteはデータ型はルーズだけど、こんなエラーはだすのだなっと。

英語圏でも困っている人がいるようだが、Englishなのは私はダメなのである。http://groups.google.co.jp/group/cake-php/browse_thread/thread/d0160763dece38b0/6b9b7246a72945e2?lnk=gst&q=datatype+mismatch#6b9b7246a72945e2

こんな感じ
Warning: sqlite_query() [function.sqlite-query]: datatype mismatch in C:\www\Cake\cake\libs\model\dbo\dbo_sqlite.php on line 115

Query: INSERT INTO "dbs" ("id","name") VALUES ('','abc') 
Warning: SQL Error: 20: datatype mismatch in C:\www\Cake\cake\libs\model\datasources\dbo_source.php on line 440

で、ソースをよくみると。。。原因はわかったが、どこを直すべきか難しい。とりあえずこうした。
/cake/libs/dbo/dbo_sqlite.php
	function value ($data, $column = null, $safe = false) {
		$parent = parent::value($data, $column, $safe);

		if ($parent != null) {
			return $parent;
		}

		if ($data === null) {
			return 'NULL';
		}

		if ($data === '') {
			return  "''";
		}
を探しだし
		if ($data === null) {
			return 'NULL';
		}

		if ($data === null || $data === '' && $column=='integer') {
			return 'NULL';
		}
に変更。

cakephp1.19でのお話 うーん、1.2にしようかな。

(追記)

実はMySQLでも同じ現象が発生した。...もう一度よく考えると、

cake/libs/mode/dbo/dbo_mysql.phpの
    • function value($data, $column = null, $safe = false)
if ($data === '') {
  return  "''";
}

if ($data === '') {
//spok_added
    if($column=='integer'){return 'null';}
//spok_end
    return  "''";
}
とすればうまくいった。
おそらくsqliteも、最初の修正をしなくても、dbo_sqlite.phpの同じ箇所を直せばこれで通るでしょう。

しかし、こういうのみんなクリアーしてるのかね。
全然cakephp楽じゃないよ。これだけでえらい時間食ったよ。

こちらも参考になりました。http://papuh.s3.zmx.jp/2008/01/15/cakephp%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%80%801206311-beta/

MySQL5.0.45 でのお話

名前:  非公開コメント   

  • TB-URL  http://cpa-lab.com/tech/017/tb/
  • [PHP]CakePHPをAN HTTPD+SQLiteで動かす genms’ blog
    この環境で、CakePHPのScaffoldingを一通り動作させることができました。 ただその際、環境特有と思われる設定や変更が発生したので、メモ。 環境 AN HTTPD 1.42n PHP 5.1.4 SQLite 2 【AN HTTPD関係】 m...
  • Cakephpでsqliteの続き。editとdeleteの修正 CPA-LABテクニカル spok
    以前にSQliteでのnew時(insert)の不具合を修正したのだけれど、今度は、editとdeleteでも不具合があることがわかった。しばらくMySQLのお勉強をしていたので、sqliteはほっておいたんだけど、やっぱりsqliteが恋しいので戻ってき...
  • CakePHP1.2bとSQLite不具合のもっと簡単な直し方 CPA-LABテクニカル spok
    私、nightlyって知りませんでした。ソフト開発の世界では、nightly buildとは、開発途上版ということなのですね。で、CakePHPでは、そのnightly buildが公開されていると。だからそれを使えばいいだぞ、と。こちらCakePHPでは...