Поиск телефона в базе данных MySQL

Такой вопрос часто возникает т.к. в базе данных телефон может хранится в ненормализованном виде да и сама строка поиска может быть введена в любом формате, поэтому простой поиск методом LIKE ни чего не найдет. Далее приведены примеры решения данной проблемы.

В первом варианте происходит нормализация номера +7 (926) 123-45-67 к виду 89261234567 в строке поиска:

$phone = '+7 (926) 123-45-67';

$srch = preg_replace('/[\s]/', '', $phone);
$srch = str_replace('+7', '8', $srch);
$srch = preg_replace('/[^0-9]/', '', $srch);
if (mb_strlen($srch) == 11) {
	$srch = substr_replace($srch, '8', 0, 1);
}

echo $srch; // 89261234567
PHP

И в полях базы данных.

// Подключение к БД.
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

$sth = $dbh->prepare("
	SELECT 
		* 
	FROM 
		`orders`  
	WHERE
		REPLACE(
			REPLACE(
				REPLACE(
					REPLACE(
						REPLACE(
							REPLACE(
								`phone`, ' ', ''
							), '(', ''
						), ')', ''
					), '-', ''
				), '+7', '8'
			), '+', ''
		) LIKE '%{$srch}%'
	ORDER BY 
		`name`
");

$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($array);
PHP

Так поиск будет работать с номерами, начинающимися с +7 или 8, также будут результаты если в поиске будет указана только часть телефона.

Второй вариант

Основан на методе REGEXP, который будет искать нужные записи по сформированному регулярному выражению из указанного номера телефона:

$phone = '+7 (926) 123-45-67';

$srch = preg_replace('/[^0-9]/', '', $phone);
if (mb_strlen($srch) == 11) {
	$srch = substr($srch, 1);
}
$srch = str_split($srch);
$srch = '[7|8][^0-9]*' . implode('[^0-9]*', $srch);


echo $srch; // [7|8][^0-9]*9[^0-9]*2[^0-9]*6[^0-9]*1[^0-9]*2[^0-9]*3[^0-9]*4[^0-9]*5[^0-9]*6[^0-9]*7
PHP

Далее его подставляем в SQL запрос:

// Подключение к БД.
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');

$sth = $dbh->prepare("
	SELECT 
		* 
	FROM 
		`orders`  
	WHERE
		`phone` REGEXP '{$srch}'
	ORDER BY 
		`name`
");

$sth->execute();
$array = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($array);
PHP

Поиск по такому методу будет работать только по полному номеру телефона.

12.11.2020, обновлено 18.11.2020
Следующая запись Поиск файлов в PHP

Комментарии

, чтобы добавить комментарий.

Другие публикации

Сборник регулярных выражений с примерами на PHP для проверки данных из полей форм.
3984
+1
Применение масок ввода у полей форм значительно упрощает их использование, уменьшает количество ошибок и приводит...
39295
0
Для предотвращения XSS, SQL-инъекций и других атак, данные полученные из форм нужно чистить. Простое экранирования кавычек не достаточно, нужен комплексный подход по типу данных.
2486
+5
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
9913
+6
Для примера возьмем статейный сайт, на нём нужно сделать счетчик просмотров статей, с выводом результатов за день,...
3936
+9
Класс значительно упрощает работу с PDO, сокращает код. Реализован на статических классах и не требует создание экземпляра класса.
10057
+6