Skip to content
← Back to Snippets
Code

Prepared Statement to Prevent SQL Injection (mysqli)

Runs a procedural mysqli prepared statement with explicit bind, execute, result handling, and no string-concatenated user input in SQL.

Purpose

Runs a procedural mysqli prepared statement with explicit bind, execute, result handling, and no string-concatenated user input in SQL.

Snippet details

ContextDatabaseLevelProductionCopy-and-paste statusMarked safe after review.

Categories

  • Database Integrity

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.
 */

/**
 * Prepared Statement to Prevent SQL Injection (mysqli).
 *
 * Purpose:
 * Searches records with a procedural mysqli prepared statement so user input
 * never becomes concatenated SQL.
 *
 * @param mysqli $connection Open procedural mysqli connection.
 * @param string $search_term User-supplied search text.
 * @return array Matching rows and a safe public status message.
 */
function ogSnippetPreparedStatementMysqli(mysqli $connection, string $search_term): array {
	$search_term = trim($search_term);

	if ($search_term === '') {
		return array('success' => false, 'rows' => array(), 'message' => 'Search term is required.');
	}

	$like_term = '%'.$search_term.'%';
	$sql = 'SELECT id, title, slug FROM items WHERE title LIKE ? AND is_published = 1 ORDER BY title ASC LIMIT 25';
	$statement = mysqli_prepare($connection, $sql);

	if ($statement === false) {
		return array('success' => false, 'rows' => array(), 'message' => 'Search preparation failed.');
	}

	mysqli_stmt_bind_param($statement, 's', $like_term);
	$executed = mysqli_stmt_execute($statement);

	if ($executed === false) {
		mysqli_stmt_close($statement);
		return array('success' => false, 'rows' => array(), 'message' => 'Search execution failed.');
	}

	mysqli_stmt_bind_result($statement, $id, $title, $slug);

	$rows = array();
	while (mysqli_stmt_fetch($statement)) {
		$rows[] = array(
			'id' => (int) $id,
			'title' => $title,
			'slug' => $slug
		);
	}

	mysqli_stmt_close($statement);

	return array(
		'success' => true,
		'rows' => $rows,
		'message' => 'Prepared search completed.'
	);
}

/*
$result = ogSnippetPreparedStatementMysqli($connection, 'stargate');
print_r($result['rows']);
*/