こんにちは!今回は、PHPでdBASEファイルからレコードを削除するためのdbase_delete_record
関数について、初心者にも分かりやすく解説していきます。
目次
- dbase_delete_record関数とは
- 基本的な使い方
- 実践的な実装例
- 注意点とエラー処理
- ベストプラクティス
1. dbase_delete_record関数とは
bool dbase_delete_record ( resource $dbase_identifier, int $record_number )
この関数は、指定されたレコード番号のレコードを削除マークします(実際には物理的な削除は行われません)。
2. 基本的な使い方
2.1 シンプルな使用例
<?php
// データベースを開く
$db = dbase_open('customers.dbf', 2); // 書き込みモード
if ($db) {
// レコード番号3を削除
if (dbase_delete_record($db, 3)) {
echo "レコードを削除しました";
} else {
echo "削除に失敗しました";
}
dbase_close($db);
}
3. 実践的な実装例
3.1 クラスを使用した実装
<?php
class DatabaseManager {
private $db;
public function __construct($filename) {
$this->db = dbase_open($filename, 2);
if (!$this->db) {
throw new Exception("データベースを開けません");
}
}
public function deleteRecord($record_number) {
if (!dbase_delete_record($this->db, $record_number)) {
throw new Exception("レコードの削除に失敗しました");
}
return true;
}
public function __destruct() {
if ($this->db) {
dbase_close($this->db);
}
}
}
// 使用例
try {
$manager = new DatabaseManager('customers.dbf');
$manager->deleteRecord(5);
echo "削除成功";
} catch (Exception $e) {
echo "エラー: " . $e->getMessage();
}
3.2 条件付き削除の実装
<?php
class CustomerDatabase {
private $db;
public function deleteCustomerByName($name) {
$record_count = dbase_numrecords($this->db);
$deleted = false;
for ($i = 1; $i <= $record_count; $i++) {
$record = dbase_get_record($this->db, $i);
if ($record && trim($record[0]) === $name) {
if (dbase_delete_record($this->db, $i)) {
$deleted = true;
}
}
}
return $deleted;
}
}
4. 注意点とエラー処理
4.1 基本的なエラーチェック
<?php
function safeDeleteRecord($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("無効なレコード番号");
}
// 削除実行
if (!dbase_delete_record($db, $record_number)) {
throw new RuntimeException("削除処理に失敗");
}
return true;
}
4.2 一括削除の実装
<?php
function batchDelete($db, array $record_numbers) {
$success_count = 0;
$errors = [];
foreach ($record_numbers as $number) {
try {
if (dbase_delete_record($db, $number)) {
$success_count++;
}
} catch (Exception $e) {
$errors[] = "レコード $number: " . $e->getMessage();
}
}
return [
'success_count' => $success_count,
'errors' => $errors
];
}
5. ベストプラクティス
5.1 トランザクション的な処理
<?php
class SafeDeleteManager {
private $db;
private $backup = [];
public function startDelete($record_number) {
// 削除前にレコードをバックアップ
$this->backup[$record_number] = dbase_get_record($this->db, $record_number);
}
public function commitDelete($record_number) {
unset($this->backup[$record_number]);
}
public function rollbackDelete($record_number) {
if (isset($this->backup[$record_number])) {
// バックアップから復元するロジック
}
}
}
5.2 ログ機能付き削除処理
<?php
class LoggedDeleteManager {
private $logger;
public function __construct($logger) {
$this->logger = $logger;
}
public function deleteRecord($db, $record_number) {
$this->logger->info("削除開始: レコード番号 $record_number");
try {
$result = dbase_delete_record($db, $record_number);
if ($result) {
$this->logger->info("削除成功");
} else {
$this->logger->error("削除失敗");
}
return $result;
} catch (Exception $e) {
$this->logger->error("エラー発生: " . $e->getMessage());
throw $e;
}
}
}
まとめ
dbase_delete_record使用時の重要ポイント:
- 適切なエラーハンドリング
- レコード番号の妥当性チェック
- 削除前のバックアップ検討
- ログ記録の実装
注意点
- 物理的な削除ではなく、削除マークが付くだけ
- レコード番号は1から始まる
- データベースは書き込みモードで開く必要がある
この記事が皆様のdBASEファイル操作の参考になれば幸いです!