[PHP]dbase_delete_record関数の使い方完全解説 – dBASEファイルのレコード削除方法

PHP

こんにちは!今回は、PHPでdBASEファイルからレコードを削除するためのdbase_delete_record関数について、初心者にも分かりやすく解説していきます。

目次

  1. dbase_delete_record関数とは
  2. 基本的な使い方
  3. 実践的な実装例
  4. 注意点とエラー処理
  5. ベストプラクティス

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. 適切なエラーハンドリング
  2. レコード番号の妥当性チェック
  3. 削除前のバックアップ検討
  4. ログ記録の実装

注意点

  • 物理的な削除ではなく、削除マークが付くだけ
  • レコード番号は1から始まる
  • データベースは書き込みモードで開く必要がある

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

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