phpの勉強をしています。

SQLiteがうまく動かないので悩んでいます。
----------------------------------------------------
phpのバージョンは5.3.6、Apacheは2.2.14です。SQLite Library 2.8.17
----------------------------------------------------
となっています。
php.iniには
extension=php_pdo.dll
extension=php_pdo_sqlite.dllと
[sqlite]セクションで、
pdo.dsn.samples="sqlite:d:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\samples\chap05\samples.sqlite"
と入れています。
doc_rootはd:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\です。
d:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\samples\chap05\samples.sqliteを空ファイルで作り、
d:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\samples\chap05\connect.phpを作りました。
connect.php
----------------------------------
<?php
try{
$db=new PDO('samples');
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
print('データベースへの接続を確立しました。');
}catch(PDOException $e){
die('エラーメッセージ:'.$e->getMessage());
}
?>
です。
http://localhost/samples/chap05/connect.phpを実行すると、
エラーメッセージ:invalid data source nameと出てきます。
SQLiteがうまく扱えません。どなたかアドバイスお願いします。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2011/08/30 12:28:46
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.3

回答回数595ベストアンサー獲得回数351

ポイント60pt

> PDOの項目にpdo_sqliteの部分はありません。PDO drivers sqlite2 とあるだけです。

> SQLite Library 2.8.17は、SQLiteという項目の中にあります。


質問文に『php.iniには extension=php_pdo.dll extension=php_pdo_sqlite.dllと~』とありますが、「extension=php_pdo_sqlite.dll」ではなく「extension=php_sqlite.dll」を有効にしていないでしょうか?

現在、「PDO drivers sqlite2」と表示されているのでしたら、SQLite2のデータベースなら利用できると思います。

「pdo.dsn.samples="sqlite2:D:\~」として確認してみてください。

http://www.php.net/manual/ja/ref.pdo-sqlite.connection.php


またPHP 5.3.0以降は、「php_pdo.dll」が含まれていませんが、公式サイトからダウンロードしたPHPを使っていますか?

PDOでSQLite3のデータベースを扱う場合、「extension=php_pdo_sqlite.dll」だけを有効にすれば大丈夫です。(※phpinfo()で以下のように表示されます。)

f:id:rouge_2008:20110827222254p:image:w490


※「extension=php_pdo_sqlite.dll」と「extension=php_sqlite.dll」の両方を有効にした場合、PDOでSQLite3の他にSQLite2のデータベースを利用できるようになります。


「php_pdo.dll」が含まれていたり、「extension=php_pdo_sqlite.dll」を有効にしても「PDO drivers」に「sqlite」と表示されない場合は、公式サイトから新バージョンの5.3.8をダウンロードして、上書きではなく新規で入れてみてください。


http://windows.php.net/download/



「extension=php_sqlite.dll」で利用できる関数は以下になります。

http://www.php.net/manual/ja/book.sqlite.php

id:inajyun

レスありがとうございます。

「pdo.dsn.samples="sqlite2:D:\~」としても駄目でした。

>「extension=php_pdo_sqlite.dll」と「extension=php_sqlite.dll」の両方を有効

>にした場合、PDOでSQLite3の他にSQLite2のデータベースを利用できるようになりま

>す

今この状態です。phpinfoでは、sqlite2と出てきますが。

どうにも頭が混乱していて分からなくなっています。目をさらにして見ているのですが、誤りがどこにあるのか分かりません。

2011/08/28 12:10:06

その他の回答2件)

id:a-kuma3 No.1

回答回数4971ベストアンサー獲得回数2153

ポイント20pt

[sqlite]セクションで、

pdo.dsn.samples="sqlite:d:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\samples\chap05\samples.sqlite"

これが、違うんじゃね?

alias を使うときは、[PDO] セクションだと思う。

http://php.net/manual/ja/pdo.construct.php


[PDO]
pdo.dsn.samples="sqlite:d:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\samples\chap05\samples.sqlite"

--

(追記)

念のために確認ですが、Apache は D: ドライブにインストールした、ということであってますよね?

id:inajyun

レスありがとうございます。

ですが、残念ながら同じメッセージが出ます。

2011/08/25 15:20:34
id:Jupiter2100 No.2

回答回数444ベストアンサー獲得回数74

ポイント20pt

Windows7(64bit)を使っているのですか?

Apacheの権限では "Program Files (x86)" ディレクトリに書き込めない状況かもしれません。


いずれにしても、 Webアプリで"Program Files (x86)" に書き込むというのは危険です。

書き込み可能なデータディレクトリにsqliteデータベースを作成することをお勧めします。

id:inajyun

レスありがとうございます。そうです。Windows 7 64bitを使っています。

そうなんですか?危険なことをしていたのを知らなかったのですね。教えてくださってありがとうございます。

PHPのXML関数を使ったプログラムを走らせた時に、"Program files (x86)"以下のディレクトリに書き込めました。権限の問題では無いのでは無いかと思います。

いずれにせよ、Apacheを再インストールします。教えていただきありがとうございます。

2011/08/25 19:02:44
id:rouge_2008 No.3

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント60pt

> PDOの項目にpdo_sqliteの部分はありません。PDO drivers sqlite2 とあるだけです。

> SQLite Library 2.8.17は、SQLiteという項目の中にあります。


質問文に『php.iniには extension=php_pdo.dll extension=php_pdo_sqlite.dllと~』とありますが、「extension=php_pdo_sqlite.dll」ではなく「extension=php_sqlite.dll」を有効にしていないでしょうか?

現在、「PDO drivers sqlite2」と表示されているのでしたら、SQLite2のデータベースなら利用できると思います。

「pdo.dsn.samples="sqlite2:D:\~」として確認してみてください。

http://www.php.net/manual/ja/ref.pdo-sqlite.connection.php


またPHP 5.3.0以降は、「php_pdo.dll」が含まれていませんが、公式サイトからダウンロードしたPHPを使っていますか?

PDOでSQLite3のデータベースを扱う場合、「extension=php_pdo_sqlite.dll」だけを有効にすれば大丈夫です。(※phpinfo()で以下のように表示されます。)

f:id:rouge_2008:20110827222254p:image:w490


※「extension=php_pdo_sqlite.dll」と「extension=php_sqlite.dll」の両方を有効にした場合、PDOでSQLite3の他にSQLite2のデータベースを利用できるようになります。


「php_pdo.dll」が含まれていたり、「extension=php_pdo_sqlite.dll」を有効にしても「PDO drivers」に「sqlite」と表示されない場合は、公式サイトから新バージョンの5.3.8をダウンロードして、上書きではなく新規で入れてみてください。


http://windows.php.net/download/



「extension=php_sqlite.dll」で利用できる関数は以下になります。

http://www.php.net/manual/ja/book.sqlite.php

id:inajyun

レスありがとうございます。

「pdo.dsn.samples="sqlite2:D:\~」としても駄目でした。

>「extension=php_pdo_sqlite.dll」と「extension=php_sqlite.dll」の両方を有効

>にした場合、PDOでSQLite3の他にSQLite2のデータベースを利用できるようになりま

>す

今この状態です。phpinfoでは、sqlite2と出てきますが。

どうにも頭が混乱していて分からなくなっています。目をさらにして見ているのですが、誤りがどこにあるのか分かりません。

2011/08/28 12:10:06
  • id:taknt
    data source nameが間違ってますというエラーですね。
  • id:inajyun
    レスありがとうございます。
    それだけでは原因が見当がつきません。よろしくお願いいたします。
  • id:inajyun
    a-kuma3さんへ。D:にインストールしています。
  • id:rouge_2008
    PDOに渡したdsnが無効な時に「invalid data source name」と表示されるようです。
    今回の場合、php.iniで「pdo.dsn.samples」が見つからないのが原因だと思います。
    phpコードでは「$db=new PDO('samples');」としていますが、php.iniで間違いなく「pdo.dsn.samples="sqlite:~"」で設定してあるでしょうか?
    「php.info()」で読み込んでいるphp.iniの場所を確認して、違うphp.iniを変更していないかも確認してみてください。

    ※記述する場所は、[sqlite]と[Pdo]どちらでも大丈夫でした。
  • id:inajyun
    レスありがとうございます。
    php.iniで間違いなく設定してあります。また、php.iniはC:\Windowsにあります。
  • id:rouge_2008
    確認ばかりですみませんが、「phpinofo()」の「PDO」の項目に「sqlite」はありますか?
    その下に「pdo_sqlite」の項目は表示されていますか?(※PDO Driver for SQLite 3.x)
    「SQLite Library 2.8.17」はどの項目に表示されているのでしょうか?
  • id:inajyun
    レスありがとうございます。

    PDOの項目にpdo_sqliteの部分はありません。PDO drivers sqlite2 とあるだけです。

    SQLite Library 2.8.17は、SQLiteという項目の中にあります。

    PECL Module version 2.0-dev $Id: sqlite.c 306939 2011-01-01 02:19:59Z felipe $
    SQLite Library 2.8.17
    SQLite Encoding iso8859

    という感じです。

    よろしくお願いします。

  • id:cx20
    SQLite は使ったことが無いので分かりませんが、
    一般的に Windows でファイルアクセスが権限絡みでエラーになる場合は「Process Monitor」で、調査可能です。

    ■ Process Monitor
    http://technet.microsoft.com/ja-jp/sysinternals/bb896645

    ログに「Access Denied」が存在していれば、アクセス権限の原因が考えられます。
  • id:inajyun
    どうも情報ありがとうございます。
    ただ、このモニタ見方が良く分からず、Apacheの動きを追っても該当するファイルの名前が出てきません。SUCCESSもACCEESS DENIEDとも分からない状態です。
  • id:rouge_2008
    この質問を投稿した時点では、「extension=php_pdo.dll」も有効にしていたのですよね?
    その後、「;extension=php_pdo.dll」のように無効にして確認したでしょうか?
    回答にも書きましたが、PHP 5.3以降からは、「extension=php_pdo_sqlite.dll」だけを有効にすれば、PDOでsqlite(SQLite3)が利用できるようになります。
    「php_pdo.dll」が含まれている事もおかしいので、PHPの公式サイトから新しいバージョンをダウンロードし直して試してみてください。


    どうしてもバージョン5.3.6が必要な場合は、「archives」(※PHP For Windowsの左側下の方にリンク有り)からダウンロード可能です。
    http://windows.php.net/downloads/releases/archives/
  • id:rouge_2008
    Windows XP以降でしたら、PHPの拡張ファイルにマウスオーバーした時に、ツールチップが表示されます。
    「php_pdo_sqlite.dll」および「php_sqlite.dll」のファイルバージョンが、5.3.6と表示されているか確認してみてください。(「php_pdo.dll」に関しては、おそらく5.2.x以前のバージョンの物ではないかと思います。)
    ※拡張ファイルを右クリック→「プロパティ」を実行して、詳細タブで確認する事も可能です。
  • id:cx20
    > Apacheの動きを追っても該当するファイルの名前が出てきません。

    「Process Monitor」で、ファイル名が出てこないということであれば、
    アクセス権以前の問題と思われます。

    エイリアスでなく、DSN を直接した場合はどうでしょうか?

    $db=new PDO('samples');
             ↓
    $db=new PDO('sqlite:~');
  • id:inajyun
    >rouge_2008さん、
    「;extension=php_pdo.dll」のように無効にして確認したでしょうか→しました。
    php_pdo.dllは今はありません。
    php_pdo_sqlite.dllと、php_sqlite.dllはマウスオーバーで、5.3.6でした。

  • id:inajyun
    >ex20さん、
    仰るとおりやったら、エラーメッセージ:could not find a driverと出てきました。
  • id:cx20
    > エラーメッセージ:could not find a driverと出てきました。

    $db=new PDO('sqlite:~');
             ↓
    $db=new PDO('sqlite2:~');

    と、した場合は、どうでしょうか?

    これで動作するようであれば、SQLite2 は使えることになります。

    SQLite3 が使えない理由ですが、もしかして、パスが通っている別の場所に、
    古いバージョンの DLL が存在するとかいうオチではないでしょうか?

    前述の「Process Monitor」にて、php_pdo_sqlite.dllと、php_sqlite.dll を検索してみてください。
    想定と異なるパスを参照しているようであれば、DLL のバージョンを確認してみてください。
  • id:rouge_2008
    「phpinfo()」で確認した場合、「Loaded Configuration File」は「C:\Windows\php.ini」で間違いないですね?
    「extension_dir」には何と表示されていますか?
    「C:\Windows\php.ini」の記述と合っていますか?


    それから、今入れてあるPHP(バージョン5.3.6?)は、どのようにして設置したのでしょうか?
    以前は「php_pdo.dll」があったという事ですので、違うバージョンに上書きしたのではないかと思いますが・・・
    現在も上書き(?)して入れたPHPでしょうか?
  • id:inajyun
    >CX20さん、ありがとうございます。
    SQLite2とした場合、「データベースへの接続を確立しました。」と出ました。ドンピシャです。
    ただ、何故、SQLite3が使えないか分かりません。パスの通ってるDLLはSQLite3です。
    php_pdo_sqlite.dllは想定していたパスを指していました。php_sqlite.dllはどこも指していません。

  • id:inajyun
    rouge_2008さん、レスありがとうございます。
    extension_dirにはc:\windows\php.iniとなっています。
    PHPの設定は、C:\PHPを作ってそこに前にあったPHPのディレクトリ・ファイル類の削除を行って、その上でPHP5.3.6を入れました。上書きではありません。
  • id:rouge_2008
    > extension_dirにはc:\windows\php.iniとなっています。

    CX20さんへの返信でPDO(sqlite2)が利用できたのは分かりますので、
    おそらく記述間違いだと思いますが・・・
    extension_dirに、何と表示されていましたか?
  • id:rouge_2008
    追加の確認ですが、「PDO drivers」には「sqlite2」しか表示されていないのでしょうか?
    「sqlite, sqlite2」と表示されているのでしたら、再度「$db = new PDO('sqlite:d:~)」と直接指定して試してみてください。
    ※ダブルクォーテンションで囲むと「unable to open database file」というエラーが出ますので、シングルクォーテンションで囲んでください。
    (phpスクリプトにWinのパスを記述する際、ダブルクォーテンションで囲む場合は、ディレクトリの区切り文字を「\\」で記述する必要があります。変数に代入する場合も同様です。)


    上記を試しても上手くいかない場合、別の場所にインストールし直した方がいいと思いますが、msiではない最新のApache2.2.19を入れてみませんか?
    なるべくデフォルトの状態で動作するか試してもらいたいので、設定変更は最小限になりますが・・・
    試してみたい場合は、後で設定等をコメントします。
  • id:inajyun
    >rouge_2008さん、

    >extension_dirに、何と表示されていましたか?
    →c:\php\extです。

    >追加の確認ですが、「PDO drivers」には「sqlite2」しか表示されていないのでしょうか?
    →そうです。

    >msiではない最新のApache2.2.19を入れてみませんか?
    msiのApache2.2.14を入れています。
  • id:rouge_2008
    間違いなく「extension=php_pdo_sqlite.dll」を有効にしてあるでしょうか?
    「extension=php_sqlite.dll」だけを有効にした場合でも、PDOでsqlite2が利用できるようになる事は確認済みです。
    もう一度確認してみてください。


    > msiのApache2.2.14を入れています。

    動作確認の為にもう一つ別の環境を用意して試していただければと思い、「msiではない最新のApache2.2.19を入れてみませんか?」と聞いたのですが・・・
    PHPのダウンロードページ(PHP For Windows)左側下に「Do NOT use VC9 version with apache.org binaries」(apache.org(公式)のバイナリでVC9バージョンを使用しないでください。)とあります。
    公式サイトのApacheでVC9でコンパイルされたPHP 5.3.xを利用すると、何らかの不具合が発生するのかもしれません。
    VC6の5.3.5ならarchivesで配布されていますので、一つ前のPHPを試してみてください。

    http://windows.php.net/downloads/releases/archives/


    ※「VC9 versions of Apache can be fetched at Apache Lounge. We use their binaries to build the Apache SAPIs.」ともありますが、ここでリンクされているApache Loungeで配布されているApacheで確認するつもりですが、上記VC6のPHP 5.3.5でも解決しない場合は試してみませんか?
    圧縮ファイルを任意の場所に解凍して、設定するだけで使用できるようになります。
  • id:inajyun
    >rouge_2008さん、レスありがとうございます。明日明後日は、返事ができないと思います。

    >間違いなく「extension=php_pdo_sqlite.dll」を有効にしてある」あります。
    無効にしてもエラーメッセージは変わりません。


    >VC6の5.3.5ならarchivesで配布されていますので、一つ前のPHPを試してみてください。
    VC6のPHP5.3.5にしてやってみましたが、同じエラーメッセージが出ます。

    時間のある時に、Apacheの2.2.19を入れてみようと思います。

    どうもおつきあいしていただいてありがとうございます。
  • id:rouge_2008
    もし「Microsoft 2008 C++ Runtime (x86)」を入れた事がなければ、先にインストールして確認してみてください。
    PHPのダウンロードページ(PHP For Windows)に、以下のように記述されていましたので・・・
    「VC9 Versions are compiled with the Visual Studio 2008 compiler and have improvements in performance and stability. The VC9 versions require you to have the Microsoft 2008 C++ Runtime (x86) or the Microsoft 2008 C++ Runtime (x64) installed」

    http://journal.mycom.co.jp/articles/2010/10/25/w7II/index.html



    以下はApacheの設置に関してです。上記で解決した場合は不要です。
    (Apacheのバージョンが2.2.19から2.2.20にアップしています。)

    1)圧縮ファイルの解凍
    「Apache Lounge」で配布されている物は、デフォルトでそれぞれ以下のようになっていますので、C:ドライブ直下にそのまま解凍すると面倒が少ないと思います。

    ServerRoot "c:/Apache2"

    DocumentRoot "c:/Apache2/htdocs"


    2)httpd.confの編集
    ・「#LoadModule ~」の行の最後に以下を追記します。(php.iniを「C:\Windows」から「C:\php」に戻して置いてください。)

    LoadModule php5_module C:/php/php5apache2_2.dll
    PHPIniDir C:/php/
    <IfModule php5_module>
    AddType application/x-httpd-php-source .phps
    AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml .phpt
    </IfModule>


    ・「#ServerName www.example.com:80」を「ServerName localhost:80」に変更

    ・C:ドライブ直下以外の場所に解凍した場合は、「ServerRoot "c:/Apache2"」「DocumentRoot "c:/Apache2/htdocs"」の他、<Directory>ディレクティブのパス等を、設置した場所に合わせて変更します。


    設定変更箇所は上記だけです。
    新しく追加したApacheをサービスに追加して、Apache Monitorで切り替えて使用します。
    コマンドプロンプトで以下を実行するとサービスに追加されます。(※ユーザーアカウント制御が有効になっている場合は、コマンドプロンプトやApache Monitorは管理者権限で起動する必要があります。)

    "~~~Apache2\bin\httpd.exe" -n "Apache 2.2 Web Serverなど任意のサービス名" -k install

    ※サービス名は公式msiでインストールする「Apache2.2」と重複しないように別の名前にする必要があります。

    サービスの切り替えは、タスクトレイの「Apache Monitor」アイコンをクリックして、起動中のApacheを停止してから、別のApacheをスタートして行います。(※管理者権限が必要な場合は、一旦「Apache Monitor」を終了してから、「管理者として実行」で起動し直します。インストールしたままの状態だと、「Monitor Apache Servers」としてスタートアップに登録されていると思いますので、右クリック→「プロパティ」を実行して、「互換性」タブで「管理者としてこのプログラムを実行する」にチェックを入れて置いてもいいと思います。)

    それでは、時間がある時に試してみてください。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません