Такой вопрос часто возникает т.к. в базе данных телефон может хранится в ненормализованном виде да и сама строка поиска может быть введена в любом формате, поэтому простой поиск методом 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
И в полях базы данных.
// Подключение к БД.
$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);
Так поиск будет работать с номерами, начинающимися с +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
Далее его подставляем в 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);
Поиск по такому методу будет работать только по полному номеру телефона.