Skip to content
← Back to Functions
Code

Form Sticky Value Builder

Builds safe form values after validation errors without reusing unsafe raw input.

Function signature

ogBuildStickyFormValues(submitted = array(), defaults = array(), field_policy = array())

Categories

  • Forms and Validation

Parameters

submittedSubmitted form values to preserve after validation failure.defaultsDefault form values used when submitted values are absent.field_policyField allowlist/exclusion policy for sticky value handling.

Return value

Public-safe status string returned by the function for explicit controller branching or logging.

  • 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 context-specific escaping; validate admin actions, export fields, privacy plans, cache keys, templates, settings, routes, and ecommerce policies before production use.

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 safe sticky form values after validation errors.
 *
 * This function does not perform final HTML escaping. It removes password-like
 * fields and normalizes scalar form values before the render layer escapes them.
 *
 * @param array $submitted Submitted form values.
 * @param array $defaults Default values used when a submitted value is missing.
 * @param array $field_policy Optional include/exclude and max length policy.
 * @return array Sticky form value map and excluded field list.
 */
function ogBuildStickyFormValues($submitted = array(), $defaults = array(), $field_policy = array()) {
	$result = array(
		'success' => false,
		'message' => '',
		'data' => array()
	);

	if (!is_array($submitted)) {
		$result['message'] = 'Submitted values must be an array.';
		return $result;
	}

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

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

	$include_fields = array();
	if (!empty($field_policy['include_fields']) && is_array($field_policy['include_fields'])) {
		$include_fields = $field_policy['include_fields'];
	}

	$exclude_fields = array('password', 'password_confirm', 'current_password', 'new_password', 'csrf_token');
	if (!empty($field_policy['exclude_fields']) && is_array($field_policy['exclude_fields'])) {
		$exclude_fields = array_merge($exclude_fields, $field_policy['exclude_fields']);
	}

	$max_length = 500;
	if (!empty($field_policy['max_length'])) {
		$max_length = (int)$field_policy['max_length'];
	}
	if ($max_length < 20) {
		$max_length = 20;
	}

	$source = array_merge($defaults, $submitted);
	$values = array();
	$excluded = array();

	foreach ($source as $field => $value) {
		$field = (string)$field;
		if (empty($field)) {
			continue;
		}

		if (!empty($include_fields) && !in_array($field, $include_fields, true)) {
			$excluded[] = $field;
			continue;
		}

		if (in_array($field, $exclude_fields, true) || preg_match('/password|token|secret/i', $field)) {
			$excluded[] = $field;
			continue;
		}

		if (is_scalar($value)) {
			$value = trim((string)$value);
			$value = str_replace("\0", '', $value);
			if (strlen($value) > $max_length) {
				$value = substr($value, 0, $max_length);
			}
			$values[$field] = $value;
		} elseif (is_array($value)) {
			$clean_array = array();
			foreach ($value as $array_value) {
				if (is_scalar($array_value)) {
					$clean_array[] = trim((string)$array_value);
				}
			}
			$values[$field] = $clean_array;
		}
	}

	$result['success'] = true;
	$result['message'] = 'Sticky form values built.';
	$result['data'] = array(
		'values' => $values,
		'excluded_fields' => array_values(array_unique($excluded)),
		'escape_on_output' => true
	);

	return $result;
}