Skip to content
← Back to Functions
Code

Soft Delete Filter Builder

Adds consistent active/deleted filters to read queries.

Function signature

ogBuildSoftDeleteFilter(deleted_column = 'is_deleted', include_deleted = false, options = array())

Categories

  • Database Integrity

Parameters

deleted_columnSoft-delete column name.include_deletedWhether deleted rows should be included.optionsOptional deleted value and active value settings. Recognized keys: `active_value`.

Return value

Public-safe status string returned by the function.

  • success
  • message
  • data

Compatibility

Existing function name, slug, path, and call order preserved; advertised metadata corrected to the actual source behavior.

Minimum PHP version: 7.4

Security notes

Use caller-owned allowlists and procedural mysqli prepared execution where SQL plans are returned; validate file paths, MIME policies, and permissions before file or download workflows.

Code

<?php

/*
 * Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
 * Free for personal and internal use. Paid project use requires visible credit
 * to Jeffery L. Paris. Corporate use requires a paid license fee unless a
 * separate written license states otherwise.
 */

/**
 * Builds a consistent soft-delete filter for database read plans.
 *
 * @param string $deleted_column Soft-delete column name.
 * @param bool $include_deleted Whether deleted rows should be included.
 * @param array $options Optional deleted value and active value settings.
 * @return array Soft-delete filter plan.
 */
function ogBuildSoftDeleteFilter($deleted_column = 'is_deleted', $include_deleted = false, $options = array()) {
	$result = array(
		'success' => false,
		'message' => '',
		'data' => array()
	);

	$deleted_column = trim((string)$deleted_column);
	if (empty($deleted_column) || !preg_match('/^[a-zA-Z0-9_]+$/', $deleted_column)) {
		$result['message'] = 'Invalid soft-delete column.';
		return $result;
	}

	if (!is_array($options)) {
		$options = array();
	}

	$active_value = 0;
	if (isset($options['active_value'])) {
		$active_value = $options['active_value'];
	}

	if ($include_deleted) {
		$result['success'] = true;
		$result['message'] = 'Deleted rows will be included.';
		$result['data'] = array(
			'where' => '',
			'types' => '',
			'params' => array()
		);
		return $result;
	}

	$type = 's';
	if (is_int($active_value)) {
		$type = 'i';
	} elseif (is_float($active_value)) {
		$type = 'd';
	}

	$result['success'] = true;
	$result['message'] = 'Soft-delete filter built.';
	$result['data'] = array(
		'where' => '`' . $deleted_column . '` = ?',
		'types' => $type,
		'params' => array($active_value)
	);

	return $result;
}