こんにちは!今回は、PHPでdBASEファイルからフィールド名付きでレコードを取得するdbase_get_record_with_names
関数について、詳しく解説していきます。
目次
- dbase_get_record_with_names関数とは
- 基本的な使い方
- 実践的な実装例
- エラーハンドリング
- ベストプラクティス
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関数使用時の重要ポイント:
- フィールド名は大文字で返される
- 適切なエラーハンドリングが必要
- 文字列値のトリミングを考慮
- パフォーマンス最適化を検討
注意点
- メモリ使用量の管理
- 文字コードの適切な処理
- キャッシュ戦略の検討
- エラーログの重要性
この記事が皆様のdBASEファイル操作の参考になれば幸いです!