QA@IT

PHP Fatal error: Call to undefined function sqlite_open()

4217 PV

--追記1

2013/10/06 11:32

flied_onionさん、ご回答ありがとうございます。
開発環境についてですが、localhost/MAMPに記載されているものを転載すれば良いと思っていたのですが、内容に誤りがありました。
実際の開発環境は
PHP Version 5.4.10
mysql Version 5.5.29
SQLite3 Module Version 0.7
です。

phpinfoでsqlite3とpdo_sqliteをそれぞれ確認しました。

sqlite3

SQLite3 support => enabled
SQLite3 module version => 0.7-dev
SQLite Library => 3.7.7.1

Directive => Local Value => Master Value
sqlite3.extension_dir => no value => no value
pdo_sqlite

PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.7.7.1

PHP5.2.17に切り替えてみたところ、エラーは表示されなくなりましたが、そのかわり1本の横線しか表示されなくなりました。
PHP5.4.10を使いながら、SQLite (2.0-dev)を使う方法はないでしょうか?

--追記ここまで。

こんにちは、PHP+MySQL+SQLiteでシステム開発をしています。
早速ですが、

sqlite_open()

を実行できません。
「PHP Fatal error: Call to undefined function sqlite_open()」というエラーが出ます。
このエラーについてはいくつかのページで様々な解決方法が示されていますが、その多くがwindows環境のもので解決にいたりませんでした。
このエラーの解決方法をご存知の方、いらっしゃったらご教授願います。
よろしくお願いします。

開発環境は以下の通りです。

==================
OS:MacOSX10.8.3
SQLite:3.7.7.1
MAMP
├Apache 2.0.64
├MySQL 5.5.9
├PHP 5.2.17 & 5.3.5
├APC 3.1.7
├eAccelerator 0.9.6.1
├XCache 1.2.2 & 1.3.1
├phpMyAdmin 3.3.9.2
├Zend Optimizer 3.3.9
├SQLiteManager 1.2.4
├Freetype 2.4.4
├t1lib 5.1.2
├curl 7.21.3
├jpeg 8c
├libpng-1.5.0
├gd 2.0.34
├libxml 2.7.6
├libxslt 1.1.26
├gettext 0.18.1.1
├libidn 1.17
├iconv 1.13
├mcrypt 2.5.8
└YAZ 4.0.1 & PHP/YAZ 1.0.14
==================

回答

PHP5.4.10を使いながら、SQLite (2.0-dev)を使う方法はないでしょうか?

peclから試して出たエラー調べてて気付きましたが無理そうですね。
結論から言えば以下が Won't Fix となっています。

Bug #64686 PECL SQLite2 support for PHP 5.4
https://bugs.php.net/bug.php?id=64686

 [2013-04-26 18:06 UTC] sixd@php.net
-Status: Open
+Status: Wont fix
 [2013-04-26 18:06 UTC] sixd@php.net
SQLite 2 support was removed from PHP 5.4.  Refer to the UPGRADING file:

   - ext/sqlite is no longer part of the base distribution and has been moved
     to PECL. Use sqlite3 or PDO_SQLITE instead.

どう対応するかは規模次第でしょうね。

どうしてもsqlite2を使いたいなら phpのバージョン下げて使うしかなさそうです。
sqlite3でラッパーを自作するにも sqlite_num_rows が曲者かもしれません。
下手に迂回させるよりエラーでつまづかせながら直していく方が早くて正確な場合も。

なお、sqlite2とsqlite3はDBファイルに互換性がないので変換が必要です。
変換は簡単ですが、変換後は念のため中身確認した方がいいですよ。
(昔 .dumpのやり方が悪かったのか varcharの頭ゼロとれたことが・・・。その時はデータ少なかったので修正処理作っちゃいました。)


以下は試したこと

MAMP_componentsの php5.4.4 を使って、
(includeに配置して ./configure とかしてますが割愛

$ /Applications/MAMP/bin/php/php5.4.4/bin/pecl install sqlite
-略-
running: phpize
Cannot find config.m4.
-略-
ERROR: `phpize' failed

-> 失敗

http://pecl.php.net/package/SQLite
からSQLiteソース(1.0.3)を取得して、
autoconfもインストールして

$ /Applications/MAMP/bin/php/php5.4.4/bin/phpize
$ ./configure 
$ make 
$ sudo make install

エラー

-略-
/Applications/MAMP/bin/php/php5.4.4/include/php/ext/sqlite/sqlite.c:56:45: error:
      use of undeclared identifier 'BYREF_NONE'
static unsigned char arg3_force_ref[] = {3, BYREF_NONE, ...
-略-
10 warnings and 6 errors generated.
make: *** [sqlite.lo] Error 1

上記の BYREF_NONE 未定義エラー調べて、won't fix にあたりました。

編集 履歴 (1)
  • いろいろ試していただきありがとうございます。
    sqlite2は辞めてsqlite3を使おうと思います。ありがとうございました!
    -

追記

以下を見るとMAMP2.1には含まれているようですね。
http://documentation.mamp.info/en/mamp/faq/which-php-modules-are-included

自分のMAMPのphp.ini見てみましたが、追記前の回答に書いた extension=の話は一旦忘れてください。

まずはサーバーを起動してみてMAMPのスタートページからphpinfo を開いてsqlite やpdo_sqliteの状態を見てみてください。
またサーバーの環境設定でPHP5.2.17を選択すれば動くかもしれません(うちでは動きました)。

追記ここまで。


php 5.2と記載がありますので ひょっとするとphp.iniの

extension=php_sqlite.dll

がコメントアウトされているだけかもしれません( php_sqlite3.dll ではありません )。
頭にセミコロンがついていたら削除してみてください。


sqlite_openはphpバージョン5.2ぐらいまで標準でついてましたが、sqlite2向けのものであり
現在はpdoやsqlite3を利用した方が良いとされています。
一応 ソースからコンパイルすればできるようですが、それよりはpdo版やsqlite3を利用した方がいいでしょう(すでに大規模なソースがあって修正が困難でもない限り)。

ちなみに pdoだと以下の様になります。

$pdo = new PDO('sqlite:./yourdbfilename');
$results = $pdo->query("select * from xxx");
foreach($results as $result){
   print_r($result);
}
$pdo = null;
編集 履歴 (3)
ウォッチ

この質問への回答やコメントをメールでお知らせします。