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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

Q&A

解決済

1回答

762閲覧

composerのautoloadについて

swallowtail

総合スコア60

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

0グッド

1クリップ

投稿2017/10/30 12:41

編集2017/10/30 13:51

composerのautoloadを用いてデータベース接続スクリプトを起動させたいのですが、外部スクリプトに記述すると
何故かエラーが吐き出されます。
まず仕様を書きます。

rootディレクトリ  ├ index.php(接続テスト用ファイル)  ├ config.rb  ├ composer.json  ├ vendor  │ ├ composer  │ ├ ircmaxell  │ └ autoload.php  └ resource    └ Test.php(データベース接続に関するスクリプト)

次に各ファイルの中身を記述します。(必要箇所のみ抜粋)

index.php <!doctype html> <?php require_once __DIR__."/vendor/autoload.php"; use hoge\Test; $call = new Test(); $kensaku = $call->Search(); ?> <html> <head> <title>index</title> </head> <body> <?php var_dump($kensaku); ?> </body> </html>
Test.php <?php namespace hoge; class Test{ // ■ DB情報 ==================================================================== const DEBUG = false; const NAME = 'hoge_db'; const HOST = '127.0.0.1'; const CHAR = 'utf8'; const USER = 'root'; const PASS = 'huga'; // ■ DB接続 ==================================================================== public function Setsuzoku(){ $dsn = 'mysql:dbname='.self::NAME.';host='.self::HOST.';charset='.self::CHAR; $option = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_STRINGIFY_FETCHES => false ); try{ $pdo = new PDO($dsn, self::USER, self::PASS, $option); }catch(PDOException $e){ echo self::DEBUG ? $e->getMessage() : 'データベースエラー'; die; } $stmt = $pdo->query('SET NAMES '.self::CHAR); if(!$stmt){ $info = $pdo->errorInfo(); exit($info[2]); } return $pdo; } // ■ 登録件数の検索 ============================================================= public function Search(){ $sql = 'SELECT * FROM test_table'; $pdoStatement = $this->Setsuzoku()->prepare($sql); $pdoStatement->execute(); $column = array(); while($result = $pdoStatement->fetch(PDO::FETCH_ASSOC)){ $column[] = $result['test_name']; } return $column; } }
composer.json { "repositories": [ { "packagist": false } ], "require": { "ircmaxell/random-lib": "^1.2" }, "autoload": { "psr-4": { "hoge\": "/resource/" } } }

上記記述を全てindex.php内に記述した場合は問題なく期待した動作が得られるのですが、これを上記のような構造で
記述した場合に
Fatal error: Uncaught Error: Class 'hoge\PDO' not found in C:\xampp\htdocs\hoge\resource\Test.php:18 Stack trace: #0 C:\xampp\htdocs\hoge\resource\Test.php(44): hoge\Test->Setsuzoku() #1 C:\xampp\htdocs\hoge\index.php(7): hoge\Test->Search() #2 {main} thrown in C:\xampp\htdocs\hoge\resource\Test.php on line 18
というエラーが吐き出されます。
尚、最も簡単なテストをした際には何の問題もなく動作しました。
(Test.phpにecho文を記述しただけの簡単なオートロードテストです。)
なので、オートロードの名前空間などの問題ではないと思うのですが、何が問題でエラーとなっているかが全く分かりません。
よろしければご教授ください

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

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

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

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

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

guest

回答1

0

ベストアンサー

Class 'hoge\PDO' not found のエラーの感じから、Test.phpで名前空間があるので、PDOの呼出部分を、先頭にバックスラッシュをつけて完全修飾名にすると解決するかと思います。

\PDO::ATTR_ERRMOD $pdo = new \PDO($dsn, self::USER, self::PASS, $option);

参考
PHPマニュアル 名前解決のルール
idiorm.phpのORMクラスをオートロードできない
【PHP超入門】名前空間(namespace・use)について

投稿2017/10/30 15:22

aro10

総合スコア4106

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

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

swallowtail

2017/10/30 17:03

ありがとうございます!無事解決しました! 名前空間の設定をする場合には自作関数や変数以外はグローバルスコープになるのでしょうか? 名前空間を使うこと自体が初めてだったので全く理解できておらず、お恥ずかしい限りです。 ご教授いただけたことを重ねてお礼申し上げます。
aro10

2017/10/30 17:30

名前空間を指定するとディレクトリでいう名前空間からの相対パスのような扱いになるので、PDO等のライブラリは\PDOと完全修飾名を指定するか、もしくはファイル先頭でuse \PDO;としてあげる必要があります。
swallowtail

2017/10/31 03:06

大変わかりやすい説明ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問