Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как массово стандартизировать записи в mysql

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
zapatronen
Отправлено: 26 Июля, 2017 - 21:20:49
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Добрый вечер. Есть таблица с киентами, в ней ячейка " телефон"
При оформлении заказа я не ставил в инпуты стандарт ввода телефона и по этому каждый клиент свой телефон записывал как ему вздумается, а именно в международном формате, либо с си мволами скобочками, либо в городском формате или пробелмы ставят и так далее
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. +375 29 935-03-40
  3. +375 29 935-03-40
  4. 375295304869
  5. +375 29 7169154
  6. 80293443739
  7. 80293443739
  8. 375293685925
  9. +375 33 6821840
  10. 375(29)3210756
  11. 375447250215
  12. 375295304869
  13. 375293210756
  14. 80291616442
  15. 375445642694
  16. 375257281420
  17. +375 29 264 49 24
  18. 375257281420
  19. 375291437891
  20. 2830215
  21. 375447250215



Записей 3000+ руками очень долго менять все это, каким методом проще привести все телефоны к формату +37529XXXXXXX ?

mysql, php либо exel?


C уважением, Павел
 
 Top
Строитель Модератор
Отправлено: 26 Июля, 2017 - 21:25:19
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




zapatronen пишет:
mysql, php либо exel?
Скорее, regex. Написать пример?
 
 Top
zapatronen
Отправлено: 26 Июля, 2017 - 21:35:08
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Строитель пишет:
zapatronen пишет:
mysql, php либо exel?
Скорее, regex. Написать пример?


если не затруднит, то буду признателен
 
 Top
Строитель Модератор
Отправлено: 26 Июля, 2017 - 22:31:48
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




zapatronen, в этом примере из строки удаляются плюсы, пробелы между цифрами, скобки и тире. А так же происходит замена цифр тех номеров, которые начинаются с цифры "8" - замена на +37. Остался только один вопрос - к какому формату приводить короткие номера "2830215"? Или их просто удалять?
Спойлер (Отобразить)
 
 Top
Ch_chov
Отправлено: 27 Июля, 2017 - 05:59:29
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $phones = [
  4.   '+375 29 935-03-40',
  5.   '+375 29 935-03-40',
  6.   '375295304869',
  7.   '+375 29 7169154',
  8.   '80293443739',
  9.   '80293443739',
  10.   '375293685925',
  11.   '+375 33 6821840',
  12.   '375(29)3210756',
  13.   '375447250215',
  14.   '375295304869',
  15.   '375293210756',
  16.   '80291616442',
  17.   '375445642694',
  18.   '375257281420',
  19.   '+375 29 264 49 24',
  20.   '375257281420',
  21.   '375291437891',
  22.   '2830215',
  23.   '375447250215',
  24. ];
  25.  
  26. array_walk($phones, function (&$phone) {
  27.   $phone = '+' . preg_replace('/[^\d]/', '', $phone);
  28. });
  29.  
  30. print_r($phones);


Или прямо в базе обновить через REPLACE.
 
 Top
zapatronen
Отправлено: 27 Июля, 2017 - 18:04:41
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Строитель пишет:
zapatronen, в этом примере из строки удаляются плюсы, пробелы между цифрами, скобки и тире. А так же происходит замена цифр тех номеров, которые начинаются с цифры "8" - замена на +37. Остался только один вопрос - к какому формату приводить короткие номера "2830215"? Или их просто удалять?
Спойлер (Отобразить)

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


Попробовал добавить код
$query="UPDATE orders SET telefon='$string' ";
$data=mysqli_query($dbc, $query) or die('error');

Все телефоны заменились на один и тот же из первой строки, начал делать востановление таблицы, сломал хостинг, терь ошибка 500 выскакивает уже подумываю руками все переделать))))
 
 Top
Строитель Модератор
Отправлено: 27 Июля, 2017 - 18:17:18
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




zapatronen, вручную переписывать не нужно. Я вчера написал пример для строки со списком телефонов, но у вас этот список хранится в массиве же? Если да, то надо обработать этот массив регуляркой, и после этого перезаписать номера телефонов в бд.
 
 Top
zapatronen
Отправлено: 27 Июля, 2017 - 18:36:32
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Строитель пишет:
zapatronen, вручную переписывать не нужно. Я вчера написал пример для строки со списком телефонов, но у вас этот список хранится в массиве же? Если да, то надо обработать этот массив регуляркой, и после этого перезаписать номера телефонов в бд.


да руками глупо и долго, сейчас базу востановлю буду опять пробовать, как получится я выложу сюда код
(Добавление)
Строитель пишет:
zapatronen, вручную переписывать не нужно. Я вчера написал пример для строки со списком телефонов, но у вас этот список хранится в массиве же? Если да, то надо обработать этот массив регуляркой, и после этого перезаписать номера телефонов в бд.

и да в массиве, только что-то пошло не так
(Добавление)
Строитель пишет:
zapatronen, вручную переписывать не нужно. Я вчера написал пример для строки со списком телефонов, но у вас этот список хранится в массиве же? Если да, то надо обработать этот массив регуляркой, и после этого перезаписать номера телефонов в бд.


Пожалуйста проинспектируйт меня, готов нажать на интер)))


PHP:
скопировать код в буфер обмена
  1.  while($row=mysqli_fetch_array($result)){
  2.    
  3.     $string=$row['telefon'];
  4.     $pattern = [
  5.     '~(?:[^\d\s]+|(?<=\d)\s(?=\d))~',
  6.     '~(?<=\b)(?=\d)~',
  7.     '~\b[8](\d+\b)~'
  8. ];
  9. $replace = ['', '+', '37$1'];
  10. $string = preg_replace($pattern, $replace, $string);
  11. $masiv[]=$string;
  12.    }
  13.   foreach ($masiv as &$value){
  14.     $query="UPDATE orders SET telefon='$value'";
  15.     $data=mysqli_query($dbc, $query) or die('error');
  16.   }
  17. ?>


по-моему вроде все должно заработать
 
 Top
MouseZver
Отправлено: 27 Июля, 2017 - 20:03:56
Post Id



Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Июнь 2017  
Откуда: php.ru


Помог: 1 раз(а)




это что за говнокод ?
насиловать Мускуль в цикле обоими
zapatronen пишет:
3000+ руками

(Добавление)
zapatronen пишет:
$masiv[]=$string;

что за бред Киркорова ? Нотис в лицо
(Добавление)
работа с циклом не логический абуз с выполнением в 1 циклический обход, Не оправданное говнокодство
 
 Top
zapatronen
Отправлено: 27 Июля, 2017 - 20:12:47
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




MouseZver пишет:
это что за говнокод ?
насиловать Мускуль в цикле обоими
zapatronen пишет:
3000+ руками

(Добавление)
zapatronen пишет:
$masiv[]=$string;

что за бред Киркорова ? Нотис в лицо
(Добавление)
работа с циклом не логический абуз с выполнением в 1 циклический обход, Не оправданное говнокодство


в плане не заработает?
 
 Top
Строитель Модератор
Отправлено: 27 Июля, 2017 - 20:19:11
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




zapatronen пишет:
готов нажать на интер
Не торопитесь (писал только что много текста, и всё сбросилось... сейчас напишу ещё раз по-короче)
(Добавление)
У вас все номера сейчас лежат в массиве
Спойлер (Отобразить)
Верно? После удаления из массива коротких номеров (2830215) Количество записей в массиве станет меньше количества записей в базе - как вы будете соотносить данные из массива с данными в базе? Вероятно, никак. Вам надо из базы получать ещё и поля id, чтобы результирующий массив имел ассоциативную связь с конкретным номером.

После изменения массива (удаление лишних символов и коротких номеров) вам надо в цикле собрать строку sql-запроса, и потом передать эту строку в функцию mysqli_query(). Т.е., функция mysqli_query() будет вызвана один раз.
 
 Top
zapatronen
Отправлено: 27 Июля, 2017 - 20:39:28
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Строитель пишет:
zapatronen пишет:
готов нажать на интер
Не торопитесь (писал только что много текста, и всё сбросилось... сейчас напишу ещё раз по-короче)
(Добавление)
У вас все номера сейчас лежат в массиве
Спойлер (Отобразить)
Верно? После удаления из массива коротких номеров (2830215) Количество записей в массиве станет меньше количества записей в базе - как вы будете соотносить данные из массива с данными в базе? Вероятно, никак. Вам надо из базы получать ещё и поля id, чтобы результирующий массив имел ассоциативную связь с конкретным номером.

После изменения массива (удаление лишних символов и коротких номеров) вам надо в цикле собрать строку sql-запроса, и потом передать эту строку в функцию mysqli_query(). Т.е., функция mysqli_query() будет вызвана один раз.


примерно понятно, щас попробую это все на практике применить
(Добавление)
Строитель пишет:
zapatronen пишет:
готов нажать на интер
Не торопитесь (писал только что много текста, и всё сбросилось... сейчас напишу ещё раз по-короче)
(Добавление)
У вас все номера сейчас лежат в массиве
Спойлер (Отобразить)
Верно? После удаления из массива коротких номеров (2830215) Количество записей в массиве станет меньше количества записей в базе - как вы будете соотносить данные из массива с данными в базе? Вероятно, никак. Вам надо из базы получать ещё и поля id, чтобы результирующий массив имел ассоциативную связь с конкретным номером.

После изменения массива (удаление лишних символов и коротких номеров) вам надо в цикле собрать строку sql-запроса, и потом передать эту строку в функцию mysqli_query(). Т.е., функция mysqli_query() будет вызвана один раз.



Все верно, только короткие останутся, но суть я уловил, что все сместиться и я так поменяю, чт омама не горюй, все данные сместяться и будет беда
Приступлю тогда к изучениям, отпишу как буду готов
 
 Top
zapatronen
Отправлено: 27 Июля, 2017 - 23:49:14
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Июль 2011  


Помог: 0 раз(а)




Вообщем все меняется все обновляется и по своим полям без удаления коротких номеров, они пускай остаются так как не мешают. Если ассоциировать свой каждый номер к айдишнику - это как я понимаю указывать в sql запросе WHERE user_id=$id

Ничерта не понимаю как mysqli_query из цикла достать чтобы вызывать один раз.
Все перезаписывается по своим местам без проблем, единственное о чем я бы хотел покляньчить - это подкоректировать регулярное выражение, чтобы формат телефона 8029 8033 8044 8025
заменялся на +37529, +37533, +37544,+37525


Сейчас тоже меняет, но остается ноль, например, 80447616539 меняется на +370447616539
я как открыл почитать про синтаксис регулярок, так и понял что это отдельный том программирования

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  while($row=mysqli_fetch_array($result)){
  3.     $user_id=$row['user_id'];
  4.     $string=$row['telefon'];
  5.     $pattern = [
  6.     '~(?:[^\d\s]+|(?<=\d)\s(?=\d))~',
  7.    '~(?<=\b)(?=\d)~',
  8.    '~\b[8](\d+\b)~'
  9. ];
  10. $replace = ['', '+', '37$1'];
  11. $string = preg_replace($pattern, $replace, $string);
  12. $masiv[]=$string;
  13.   }
  14.   foreach($masiv as $tel){
  15.       echo $tel.'<br>';
  16.        $query="UPDATE user SET telefon='$tel'";
  17.        $data=mysqli_query($dbc, $query) or die('asas');
  18.    }
 
 Top
Строитель Модератор
Отправлено: 28 Июля, 2017 - 00:11:46
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




zapatronen, шаблон подправил
Спойлер (Отобразить)
 
 Top
MouseZver
Отправлено: 28 Июля, 2017 - 08:00:58
Post Id



Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Июнь 2017  
Откуда: php.ru


Помог: 1 раз(а)




а теперь пишем

и фиксим код
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB