こんにちは!今回は、PHPでdBASEファイルから特定のレコードを取得するdbase_get_record
関数について、詳しく解説していきます。
目次
- dbase_get_record関数とは
- 基本的な使い方
- 実践的な実装例
- エラーハンドリング
- ベストプラクティス
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から始まる
- 削除されたレコードにも注意
- メモリ使用量の考慮
- 文字コードの扱い
この記事が皆様のdBASEファイル操作の参考になれば幸いです!