[PHP]dbase_get_record関数の使い方 – dBASEファイルからのレコード取得方法

PHP

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

目次

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

1. dbase_get_record関数とは

array dbase_get_record ( resource $dbase_identifier , int $record_number [, bool $associate = false ] )

この関数は、指定されたレコード番号のデータを配列として返します。

2. 基本的な使い方

2.1 シンプルな使用例

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

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

    if ($record) {
        print_r($record);
    }

    dbase_close($db);
}

2.2 連想配列として取得

<?php
$record = dbase_get_record($db, 1, true);
if ($record) {
    echo "名前: " . $record['name'] . "\n";
    echo "年齢: " . $record['age'] . "\n";
}

3. 実践的な実装例

3.1 レコード取得クラス

<?php
class RecordFetcher {
    private $db;
    private $headers;

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

    public function getRecord($record_number, $formatted = true) {
        $record = dbase_get_record($this->db, $record_number, true);

        if (!$record) {
            return null;
        }

        if ($formatted) {
            return $this->formatRecord($record);
        }

        return $record;
    }

    private function formatRecord($record) {
        $formatted = [];
        foreach ($this->headers as $index => $field) {
            $value = $record[$field['name']];

            switch ($field['type']) {
                case 'D': // 日付
                    $formatted[$field['name']] = $this->formatDate($value);
                    break;
                case 'N': // 数値
                    $formatted[$field['name']] = $this->formatNumber($value, $field['precision']);
                    break;
                default:
                    $formatted[$field['name']] = trim($value);
            }
        }
        return $formatted;
    }

    private function formatDate($value) {
        if (empty($value)) return null;
        return date('Y-m-d', strtotime($value));
    }

    private function formatNumber($value, $precision) {
        if ($precision > 0) {
            return round(floatval($value), $precision);
        }
        return intval($value);
    }

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

3.2 データ検証付きの実装

<?php
class ValidatedRecordFetcher {
    private $db;
    private $validators;

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

    private function setValidators() {
        $this->validators = [
            'email' => function($value) {
                return filter_var(trim($value), FILTER_VALIDATE_EMAIL);
            },
            'age' => function($value) {
                return is_numeric($value) && $value >= 0 && $value <= 150;
            }
        ];
    }

    public function getValidatedRecord($record_number) {
        $record = dbase_get_record($this->db, $record_number, true);

        if (!$record) {
            return null;
        }

        $errors = [];
        foreach ($this->validators as $field => $validator) {
            if (isset($record[$field]) && !$validator($record[$field])) {
                $errors[$field] = "無効な値です";
            }
        }

        return [
            'data' => $record,
            'errors' => $errors,
            'is_valid' => empty($errors)
        ];
    }
}

4. エラーハンドリング

4.1 基本的なエラーチェック

<?php
function safeGetRecord($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 = dbase_get_record($db, $record_number);
    if ($record === false) {
        throw new RuntimeException("レコード取得に失敗");
    }

    return $record;
}

4.2 エラーログ付きの実装

<?php
class LoggedRecordFetcher {
    private $logger;

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

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

            $record = dbase_get_record($db, $record_number);

            if ($record) {
                $this->logger->info("レコード取得成功");
            } else {
                $this->logger->warning("レコードが見つかりません");
            }

            return $record;

        } catch (Exception $e) {
            $this->logger->error("エラー発生: " . $e->getMessage());
            throw $e;
        }
    }
}

5. ベストプラクティス

5.1 キャッシュを活用した実装

<?php
class CachedRecordFetcher {
    private $db;
    private $cache = [];

    public function getRecord($record_number) {
        if (isset($this->cache[$record_number])) {
            return $this->cache[$record_number];
        }

        $record = dbase_get_record($this->db, $record_number, true);
        if ($record) {
            $this->cache[$record_number] = $record;
        }

        return $record;
    }

    public function clearCache() {
        $this->cache = [];
    }
}

まとめ

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

  1. 適切なエラーハンドリング
  2. レコード番号の妥当性確認
  3. 取得したデータの検証
  4. パフォーマンス最適化の検討

注意点

  • レコード番号は1から始まる
  • 削除されたレコードにも注意
  • メモリ使用量の考慮
  • 文字コードの扱い

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

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