Как стать автором
Обновить

Комментарии 32

Мне кажется, что использование CURL смогло бы значительно ускорить работу скрипта.
Может, быть. Но с курлом больше возни, да и стоит он не у всех. Хотя есть хостинги, у которых и file_get_contents() забанена :-)
Во первых, разрешите пожать вам руку, вы — маньяк. ))
«В мире существует 2 667 417 городов и 257 стран», говорит кто-то в интернете. А что такое «4000+ зон»?
www.phpinfo.su/articles/additionally/baza_stran_i_gorodov_mira.html
classifiers.ru/clas/info/1
habrahabr.ru/post/146597/ (там же ссылка на сравнение скорости алгоритмов поиска)

Поползайте по хабру habrahabr.ru/search/?q=geoip
Это все очень здорово, НО! Задача не в том, чтобы добавить на сайт гигасписок, а обработать существующий с минимальными потерями. Не переделывать структуру базы, не создавать новую, а сохранить все, что есть. Например, у опенкарта страны в одном месте, зоны — в другом. У тех и у других есть свои идентификаторы. И те, и другие могут по идентификаторам использоваться различными расширениями. Так вот вышеописанное решение позволяет всю эту хрупкую структуру сохранить.
Я ж не спорю. Речь о том, что есть где взять много ± валидных данных кроме вики, или собрать временную таблицу пересекающихся данных и посчитать расходящиеся значения (вам же удобней будет).
Нет, если вы исключительно про парсинг данных с вики рассказывали — не имею возражений, но для решения вашей реальной задачи — можно посмотреть ссылки с уже готовыми словарями ключ→значение.
Ну да, мысль сделать совсем полный список стран, регионов и городов у меня всегда в голове вертится, а на том же РНР Info есть решение. Я б вообще самим разработчикам опенкарта подкинул мысль вшить всю базу в движок, но они не станут заморачиваться однозначно.
Скрипт просто запрашивает Википедию, подставляя в ссылку английское название, парсит страницу

Используйте API
О, спасибо. Буду знать на будущее. Как-то я периодически забываю, что сейчас везде есть апи :-)
Спасибо, как раз пригодилось (перевод на несколько распростарненных языков географических названий, названий футбольных команд и другой информации). Процент переводенных понятий оставляет желать лучшего (около 60%), но намного лучше и быстрее, чем руками ))). Очень вовремя ваш пост…
У меня 70% получилось — где-то 1000 названий осталось без перевода, но это уже в основном всякие острова Святой Жопы или типа того. Банально нет русских страниц. У вас та же причина, я думаю.
Не знаток php и mysql. Появилось два вопроса.
1) Зачем второй update?
2) Зачем делать инъекцию? Такая склейка строк, как минимум, упадет на каком-нибудь Кот-д’Ивуаре, а как максимум дропнет базу.
1. Мне нужен был. У меня по-разному записываются в базу данные. Если не нужно, то убрать можно, конечно.
2. Ничего не упало ни на одной стране, а со всякими дефисами там было полно у одной только Кореи.
Проблема не в дефисе, а в апострофе. Вроде как строка закроется. В mysql нет параметров?
Тьфу, опечатался — с апострофами. Их там было и по одному, и по 2 на название. В общем, в строке могло быть 1-4 апострофов.
В крайнем случае, в РНР есть функции для экранирования спецсимволов. Совсем несложно добавить одну функцию, если что-то не так пойдет.
UPDATE zone SET name = '".$row['name']."'
где по-другому?
А это что?

name = '".$row['name']."::".urldecode(str_replace("_", " ", $matches[1]))."'
второй update что делает по-другому? заменяет имя самого на себя? Пишите, что не нашлось ~30%. То есть производительность можно увеличить на 30%. Странный код.
Если вы не знаток РНР, то какой смысл спорить и тем более рассуждать о странностях?

В первом случае английское название записывается ВМЕСТЕ с русским через разделитель "::", во втором — БЕЗ. По коду это видно четко.

И причем тут не нашлось 30% и пропорциональное увеличение производительности? Не нашлось, потому что не совпали названия или нет русской страницы. Чтобы это узнать, нужно сделать запрос. Производительность кода — это вообще иное.
изначально названия были на английском? в первом случае вы обновляете на английское:: русское, во втором на английское?
Именно. Дальше у меня уже парсер стоит, который по разделителю пилит и выводит, как нужно.
зачем обновлять английское название на английское название?
Обновляется не английское название, а запись в поле. Английское название остается то же.
последний вопрос. В каком поле?
В поле таблицы соответственно.
а как оно называется?
В моем случае — name, но можно писать туда, куда нужно — хоть в файл.
Пришли к тому с чего и начинали UPDATE zone SET name = name
И?
Действительно. Удивительно, что вы еще к строчке $db = mysql_connect('localhost', 'username', 'password'); не придрались — по ней же в базу не зайти! О ужас!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории