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

Поиск телефона в базе данных 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);
}
if (mb_strlen($srch) == 10) {
	$srch = '8' . $srch;
}

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, обновлено 24.02.2022
8705
Следующая запись Поиск файлов в PHP

Комментарии

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

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

Проверка данных регулярными выражениями
Сборник регулярных выражений с примерами на PHP для проверки данных из полей форм.
19006
+7
Маски ввода для текстовых полей
Применение масок ввода у полей форм значительно упрощает их использование, уменьшает количество ошибок и приводит...
102730
+6
Очистка данных из форм в PHP
Для предотвращения XSS, SQL-инъекций и других атак, данные полученные из форм нужно чистить. Простое экранирования кавычек не достаточно, нужен комплексный подход по типу данных.
11748
+6
Поиск похожих текстов в базе данных MySQL + PHP
Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.
7277
+6
Постраничный вывод и базы данных
В SQL запросах, для ограничения количества строк в результате используется инструкция LIMIT, например следующий вернёт...
17149
0
Генерация случайных буквенно-цифровых кодов в PHP
Несколько примеров, как сгенерировать случайные последовательности численных и буквенных строк заданной длины и...
11568
+4