質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3201閲覧

【PHP/SQLite3】外部PHPのSQL文実行結果を出力したい

nnahito

総合スコア2004

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/09/05 03:18

質問概要

ユーザがアクセスするindex.phpに、APIっぽくしたsql.phpの出力結果を表示させたい。

イメージ説明

しかし、以下の様なエラーが出て、解決策が見当たらない。

<b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /Users/USERNAME/Sites/database/operation/sql.php:7 Stack trace: #0 /Users/USERNAME/Sites/database/operation/slq.php(7): PDO-&gt;__construct('sqlite:../db/da...') #1 /Users/USERNAME/Sites/database/index.php(20): require_once('/Users/USERNAME...') #2 {main} thrown in <b>/Users/USERNAME/Sites/database/operation/sql.php</b> on line <b>7</b><br />

環境

  • MacOSX Yosemite 10.10.5(14F1912)
  • PHP 5.5.36 (cli) (built: Jun 12 2016 23:47:46)
  • Server version: Apache/2.4.16 (Unix) / Server built: Jul 22 2015 21:03:09
  • Firefox 48.0.1

質問詳細

ユーザがアクセスするページ(index.phpとします)と、
データベースからデータを取得し出力するAPIのようなPHP(sql.phpとします)を作りました。

そして、ユーザがindex.phpにアクセスした際に、
sql.phpから返されたデータベースのデータ(JSON形式)を、
riot.jsを使ってindex.phpに表示させたいと思っております。

イメージ説明

しかし、いざ実行してみると何も出力されておらず、
ブラウザの「ソースコードを見る」から出力ソースを見てみると、以下の様なエラーが表示されておりました。

<b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /Users/USERNAME/Sites/database/operation/sql.php:7 Stack trace: #0 /Users/USERNAME/Sites/database/operation/slq.php(7): PDO-&gt;__construct('sqlite:../db/da...') #1 /Users/USERNAME/Sites/database/index.php(20): require_once('/Users/USERNAME...') #2 {main} thrown in <b>/Users/USERNAME/Sites/database/operation/sql.php</b> on line <b>7</b><br />

エラー文で調べてみると、パーミッションに問題があると書かれているページが多く出てきます。

しかし、データベースファイルのあるフォルダのパーミッションは777、
データベースファイルのパーミッションは666でした。
とりあえず、データベースファイルのパーミッションを777にしてみましたが、エラーは消えません。

これは、どのように解消すればよろしいのでしょうか。
お知恵をお貸しください。

Appendix

index.phpの、sql.phpを読みだす箇所(参考サイト様

lang

1<?php 2ob_start(); 3include('./operation/sql.php'); 4$contents = ob_get_contents(); 5ob_end_clean(); 6 7echo "$contents"; 8?>

sql.php全文(一部省略)
なお、jQueryのajax通信や直接アクセスするとエラーなく出力されます。

lang

1<?php 2// DB操作開始 3$dbh = new PDO('sqlite:data.db'); 4 5// ゲームの評価をユーザの評価数で返す 6$sth = $dbh->prepare("SQL文は省略"); 7$sth->execute(); 8 9// JSON形式に変換し、返していく 10$count = 0; 11$result = "["; 12while( $row = $sth->fetch() ){ 13 $gameData = $dbh->prepare("SQL文は省略"); 14 $gameData->execute( array() ); 15 16 $gd = $gameData->fetch(); 17 18 // 配列をJSONに変換 19 $json = json_encode($gd, JSON_UNESCAPED_UNICODE); 20 21 // JSONをまとめる 22 $result .= $json . ','; 23 24 $count = $count + 1; 25 26 27 if ( $count > 10 ){ 28 break; 29 } 30 31} 32 33// 最後の余分な一文字を削除 34$result = substr($result, 0, -1); 35 36// JSONの終わり 37$result .= "]"; 38 39// 出力 40echo $result; 41 42 43?> 44

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JinwonKim

2016/09/05 03:23

sql.php 単体での動作確認は行いましたか?
nnahito

2016/09/05 03:33

はい、質問文にも記載してあるとおりですが、、jQueryのajax通信や直接アクセスするとエラーなく出力されます。
guest

回答1

0

自己解決

お騒がせしました。
自己解決しました。

結論から言うと、includeの落とし穴に落ちていました。
includeを使うと、index.phpの階層から見て、データベースファイルのパスを指定しないといけないのですね。

sql.phpのPODを

lang

1// DB操作開始 2$dbh = new PDO('sqlite:'.dirname(__FILE__).'/../db/data.db');

のように、指定し直すとエラーが消えました。

投稿2016/09/05 04:12

nnahito

総合スコア2004

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問