[PHP]dbase_get_record_with_names関数の完全解説 – フィールド名付きレコード取得方法

PHP

こんにちは!今回は、PHPでdBASEファイルからフィールド名付きでレコードを取得するdbase_get_record_with_names関数について、詳しく解説していきます。

目次

  1. dbase_get_record_with_names関数とは
  2. 基本的な使い方
  3. 実践的な実装例
  4. エラーハンドリング
  5. ベストプラクティス

1. dbase_get_record_with_names関数とは

array dbase_get_record_with_names ( resource $dbase_identifier , int $record_number )

この関数は、指定されたレコードをフィールド名をキーとする連想配列として返します。

2. 基本的な使い方

2.1 シンプルな使用例

<?php
// データベースを開く
$db = dbase_open('customers.dbf', 0); // 読み取り専用モード

if ($db) {
    // レコード番号3のデータを取得
    $record = dbase_get_record_with_names($db, 3);

    if ($record) {
        echo "名前: " . $record['NAME'] . "\n";
        echo "年齢: " . $record['AGE'] . "\n";
        echo "メール: " . $record['EMAIL'] . "\n";
    }

    dbase_close($db);
}

3. 実践的な実装例

3.1 レコード取得クラス

<?php
class NamedRecordFetcher {
    private $db;

    public function __construct($filename) {
        $this->db = dbase_open($filename, 0);
        if (!$this->db) {
            throw new Exception("データベースを開けません");
        }
    }

    public function getRecord($record_number) {
        $record = dbase_get_record_with_names($this->db, $record_number);
        if (!$record) {
            return null;
        }

        // 値のトリミングと整形
        return array_map(function($value) {
            return is_string($value) ? trim($value) : $value;
        }, $record);
    }

    public function __destruct() {
        if ($this->db) {
            dbase_close($this->db);
        }
    }
}

3.2 データ変換機能付きの実装

<?php
class RecordConverter {
    private $db;
    private $converters;

    public function __construct($filename) {
        $this->db = dbase_open($filename, 0);
        $this->setConverters();
    }

    private function setConverters() {
        $this->converters = [
            'DATE' => function($value) {
                return date('Y-m-d', strtotime($value));
            },
            'PRICE' => function($value) {
                return number_format((float)$value, 2);
            },
            'ACTIVE' => function($value) {
                return $value === 'T' ? true : false;
            }
        ];
    }

    public function getConvertedRecord($record_number) {
        $record = dbase_get_record_with_names($this->db, $record_number);

        if (!$record) {
            return null;
        }

        foreach ($record as $field => $value) {
            if (isset($this->converters[$field])) {
                $record[$field] = $this->converters[$field]($value);
            }
        }

        return $record;
    }
}

3.3 JSON変換機能付き実装

<?php
class JsonRecordFetcher {
    private $db;

    public function getRecordAsJson($record_number) {
        $record = dbase_get_record_with_names($this->db, $record_number);

        if (!$record) {
            return json_encode([
                'error' => 'Record not found'
            ]);
        }

        // 特殊文字の処理とUTF-8変換
        $processed = array_map(function($value) {
            if (is_string($value)) {
                return mb_convert_encoding(trim($value), 'UTF-8', 'ASCII');
            }
            return $value;
        }, $record);

        return json_encode($processed, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    }
}

4. エラーハンドリング

4.1 包括的なエラーチェック

<?php
function safeGetNamedRecord($db, $record_number) {
    // データベースハンドルの確認
    if (!is_resource($db)) {
        throw new InvalidArgumentException("無効なデータベースハンドル");
    }

    // レコード番号の検証
    $max_records = dbase_numrecords($db);
    if ($record_number < 1 || $record_number > $max_records) {
        throw new RangeException("無効なレコード番号: {$record_number}");
    }

    // レコード取得
    $record = dbase_get_record_with_names($db, $record_number);
    if ($record === false) {
        throw new RuntimeException("レコード取得エラー");
    }

    return $record;
}

4.2 詳細なエラーログ付き実装

<?php
class LoggedNamedRecordFetcher {
    private $logger;
    private $db;

    public function __construct($logger, $filename) {
        $this->logger = $logger;

        try {
            $this->db = dbase_open($filename, 0);
            if (!$this->db) {
                throw new Exception("データベースオープンエラー");
            }
        } catch (Exception $e) {
            $this->logger->error("DB接続エラー: " . $e->getMessage());
            throw $e;
        }
    }

    public function getRecord($record_number) {
        $this->logger->info("レコード取得開始: #{$record_number}");

        try {
            $record = dbase_get_record_with_names($this->db, $record_number);

            if ($record) {
                $this->logger->info("レコード取得成功");
                return $record;
            } else {
                $this->logger->warning("レコードが見つかりません");
                return null;
            }
        } catch (Exception $e) {
            $this->logger->error("レコード取得エラー: " . $e->getMessage());
            throw $e;
        }
    }
}

5. ベストプラクティス

5.1 キャッシュシステム

<?php
class CachedNamedRecordFetcher {
    private $db;
    private $cache = [];
    private $cacheLifetime = 300; // 5分

    public function getRecord($record_number) {
        $cacheKey = "record_{$record_number}";

        if ($this->isCached($cacheKey)) {
            return $this->getFromCache($cacheKey);
        }

        $record = dbase_get_record_with_names($this->db, $record_number);
        if ($record) {
            $this->setToCache($cacheKey, $record);
        }

        return $record;
    }

    private function isCached($key) {
        return isset($this->cache[$key]) && 
               (time() - $this->cache[$key]['time'] < $this->cacheLifetime);
    }
}

まとめ

dbase_get_record_with_names関数使用時の重要ポイント:

  1. フィールド名は大文字で返される
  2. 適切なエラーハンドリングが必要
  3. 文字列値のトリミングを考慮
  4. パフォーマンス最適化を検討

注意点

  • メモリ使用量の管理
  • 文字コードの適切な処理
  • キャッシュ戦略の検討
  • エラーログの重要性

この記事が皆様のdBASEファイル操作の参考になれば幸いです!

タイトルとURLをコピーしました