初心者で申し訳ございません。
PDOの扱いなのか、PHPのスコープが理解できていないのかもわかっていない状態です。
お答えいただくと助かります。
###前提・実現したいこと
処理のオブジェクト指向化進めているのですが、PDO,SQLを投げるマッパークラス,メインと
処理を分けようとしています。
PDOの接続(DBクラス)はマッパークラスのインスタンスを生成時(Singletonパターン適用)に
メンバに保持しています。
SELECTメソッド(マッパークラス)からDBクラスのSELECTメソッドを呼び出して実行。
結果ステートメントを返り値として呼び出し元(メイン)で使用したいと考えています。
メインの1行目の処理でSELECTの結果が変数に入れたいのですが、入ってくれません。
###発生している問題・エラーメッセージ
メインに結果ステートメントが返ってきた時点で結果が入っていません。
###該当のソースコード
//------------- メイン ---------------------------------------
//データが存在していればテンポラリからデータを反映させる
$stmt = $this->tradingsMapper->getDistinctData( array( 'deal_day' ) );
//print_r( $stmt );
$cnt = 0;
//今から書き込もうとしているデータを一旦削除する(最新のデータを正とする)
try
{
while ( $row = $stmt->fetch( PDO::FETCH_OBJ ) )
{
print_r( $row );
echo $row->deal_day . 'データを削除します。' . "\n";
$result = $this->tradingsMapper->deleteTradings( array( $row->deal_day ) );
if ( $result[1] != 0 )
{
throw new Exception( $result[2] );
}
print( $row->deal_day . "のデータを" . $this->dbh->getProcCnt() . "件削除しまた。\n");
$cnt++;
}
}
catch( Exception $e )
{
throw new Exception( $e );
print('削除に失敗しました。' . $e->getMessage());
}
//------------- マッパークラス ---------------------------------------
class tradingsMapper extends _dataMapper
{
private $TABLE_NAME = 'tradings';
private static $instance;
private $dbh;
private function __construct() { $this->dbh = databaseHandler::getInstance(); }
public static function getInstance()
{
if ( !isset( self::$instance) )
{
self::$instance = new self();
}
return self::$instance;
}
・
・
・
public function getDistinctData( $column_name )
{
$qty = count( $column_name );
$sql = '';
$sql .= 'SELECT DISTINCT ';
for ( $cnt=0; $cnt<$qty; $cnt++ )
{
echo $cnt . "\n";
$sql .= ($cnt === 0) ? ' ? ' : ', ? ';
}
$sql .= 'FROM ? ';
try { $bind = $column_name; $cnt = array_push( $bind , $this->TABLE_NAME );
print_r( $bind );
print( $sql . "\n" );
$stmt = $this->dbh->getData( $sql , $bind );
}
catch( Exception $e )
{
$stmt = NULL;
}
print_r( $stmt );
return $stmt;
}
・
・
・
}
//------------- DBクラス ---------------------------------------
class databaseHandler
{
private $pdo;
private static $instance;
private function __construct() { $this->connectDatabase(); } public static function getInstance() { if ( !isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } ・ ・ ・ private function connectDatabase() { try { $this->pdo = new PDO( DBTYPE . ":dbname=" . DBNAME . ";host=" . DBHOST , DBUSER , DBPASS ); $this->pdo->query( "SET NAMES " . DBCHARSET ); $this->pdo->beginTransaction(); } catch( PDOException $e ) { print('データベースに接続できませんでした。' . $e->getMessage()); die(); } } public function getData( $sql , $data = null ) {
print_r( $data );
$stmt = $this->pdo->prepare( $sql );
if ( $data !== null )
{
$stmt->execute( $data );
}
else
{
$stmt->execute();
}
print_r( $stmt );
$this->cnt = $stmt->rowCount();
return $stmt->fetch(); } ・ ・ ・
}
###試したこと
元々、分離せず作っていたので元に戻してメイン内で実行して結果が返ってくることを確認しました。
SQLの生成部分を汎用化したので、生成されるSQLの構文チェックを行っています。
###補足情報(言語/FW/ツール等のバージョンなど)
PHP5.6,PDOでの開発で、
環境はCentOS7,Apache2.4.6,MariaDB5.5.47です。
メインの1行目
$stmt = $this->tradingsMapper->getDistinctData( array( 'deal_day' ) );
でステートメントにSELECT結果が取得されません。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/16 15:09