Blog. Just Blog

Web-мастеру и не только

Полезные решения для Web-мастеров
Web-мастеру и не только - RSS-канал Web-мастеру и не только - Карта сайта

Обработка недоступных картинок на сайте

30.05.2010 | Категория: Web-мастеру и не только | Автор: ManHunter

Обработка недоступных картинок на сайте

Одно из неприятных явлений в Интернете - это "битые" ссылки, в частности ссылки на картинки. Сайты могут закрываться, переезжать, менять свою структуру, это естественный процесс. Хуже, когда от этого страдает ваш сайт. Если на сайте всего несколько страниц, то "битые" картинки вы сможете легко отследить самостоятельно, а о некоторых могут сообщить ваши посетители. Но если страниц много, то в большинстве случаев "битые" картинки могут висеть незамеченными достаточно долго. На своем хостинге их, в принципе, можно отследить по появлению ссылок в логе ошибок 404 (страница не найдена), а если изображения находятся на другом сервере?

Читать статью целиком »
Просмотров: 9063 | Комментариев: 11

Ошибка MySQL "Got error 28 from storage engine"

20.05.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Прихожу на работу, а у меня уже телефон разрывается от звонков. Рабочий сайт компании лежит с загадочной ошибкой MySQL "Got error 28 from storage engine", причем не весь, а выборочно местами и только на некоторых запросах. В официальной документации по MySQL ничего внятного не нашел, но после небольшого расследования и поиска в разных интернетах выяснилось, что такая ошибка возникает из-за нехватки свободного места на диске. На небольших запросах оставшегося места хватало для работы MySQL и возвращался какой-то результат, а на более ресурсоемких появлялась указанная ошибка. Позвонил админам, добавили места, почистили мусор, проблема сразу же решилась. Вот такая загогулина. Может кому-нибудь пригодится.

Просмотров: 14519 | Комментариев: 12

Определение мобильных браузеров на PHP

30.04.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
С быстрым развитием рынка мобильных устройств становится актуальной тема создания сайтов для них. Это могут быть самостоятельные страницы сайтов, или же просто облегченные версии страниц с минимумом графики, особыми стилями, версткой, чтобы сайт можно было комфортно просматривать на маленьком экранчике мобильного телефона или КПК. И лучше делать это автоматически, не заставляя пользователя искать на основном сайте какие-то дополнительные ссылки. Например, если вы откроете с мобильного телефона любую страницу моего сайта, то вас автоматически переадресует на облегченную версию этой же страницы для мобильных устройств. Определять браузер средствами PHP мы уже умеем, главная сложность - выделить сигнатуры браузеров мобильных устройств. К счастью, это уже сделано на сайте Detect Mobile Browsers. Весь сайт целиком посвящен только одному скрипту для определения мобильных браузеров, но сам скрипт обвешан ненужными наворотами и написан каким-то жутким стилем, так что в исходном виде практически бесполезен. А вот позаимствовать из него сигнатуры и некоторые другие методы определения вполне можно, что и было сделано. Код полностью вычищен и оптимизирован.
  1. //--------------------------------------------------------------------
  2. // Функция проверки принадлежит ли браузер к мобильным устройствам
  3. // Возвращает 0 - браузер стационарный или определить его не удалось
  4. //            1-4 - браузер запущен на мобильном устройстве
  5. //--------------------------------------------------------------------
  6. function is_mobile() {
  7.   $user_agent=strtolower(getenv('HTTP_USER_AGENT'));
  8.   $accept=strtolower(getenv('HTTP_ACCEPT'));
  9.  
  10.   if ((strpos($accept,'text/vnd.wap.wml')!==false) ||
  11.       (strpos($accept,'application/vnd.wap.xhtml+xml')!==false)) {
  12.     return 1// Мобильный браузер обнаружен по HTTP-заголовкам
  13.   }
  14.  
  15.   if (isset($_SERVER['HTTP_X_WAP_PROFILE']) ||
  16.       isset($_SERVER['HTTP_PROFILE'])) {
  17.     return 2// Мобильный браузер обнаружен по установкам сервера
  18.   }
  19.  
  20.   if (preg_match('/(mini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|'.
  21.     'wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|'.
  22.     'lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|'.
  23.     'mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|'.
  24.     'm881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|'.
  25.     'r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|'.
  26.     'i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|'.
  27.     'htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|'.
  28.     'sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|'.
  29.     'p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|'.
  30.     '_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|'.
  31.     's800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|'.
  32.     'd736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |'.
  33.     'sonyericsson|samsung|240x|x320vx10|nokia|sony cmd|motorola|'.
  34.     'up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|'.
  35.     'pocket|kindle|mobile|psp|treo|android|iphone|ipod|webos|wp7|wp8|'.
  36.     'fennec|blackberry|htc_|opera m|windowsphone)/'$user_agent)) {
  37.     return 3// Мобильный браузер обнаружен по сигнатуре User Agent
  38.   }
  39.  
  40.   if (in_array(substr($user_agent,0,4),
  41.     Array("1207""3gso""4thp""501i""502i""503i""504i""505i""506i",
  42.           "6310""6590""770s""802s""a wa""abac""acer""acoo""acs-",
  43.           "aiko""airn""alav""alca""alco""amoi""anex""anny""anyw",
  44.           "aptu""arch""argo""aste""asus""attw""au-m""audi""aur ",
  45.           "aus ""avan""beck""bell""benq""bilb""bird""blac""blaz",
  46.           "brew""brvw""bumb""bw-n""bw-u""c55/""capi""ccwa""cdm-",
  47.           "cell""chtm""cldc""cmd-""cond""craw""dait""dall""dang",
  48.           "dbte""dc-s""devi""dica""dmob""doco""dopo""ds-d""ds12",
  49.           "el49""elai""eml2""emul""eric""erk0""esl8""ez40""ez60",
  50.           "ez70""ezos""ezwa""ezze""fake""fetc""fly-""fly_""g-mo",
  51.           "g1 u""g560""gene""gf-5""go.w""good""grad""grun""haie",
  52.           "hcit""hd-m""hd-p""hd-t""hei-""hiba""hipt""hita""hp i",
  53.           "hpip""hs-c""htc ""htc-""htc_""htca""htcg""htcp""htcs",
  54.           "htct""http""huaw""hutc""i-20""i-go""i-ma""i230""iac",
  55.           "iac-""iac/""ibro""idea""ig01""ikom""im1k""inno""ipaq",
  56.           "iris""jata""java""jbro""jemu""jigs""kddi""keji""kgt",
  57.           "kgt/""klon""kpt ""kwc-""kyoc""kyok""leno""lexi""lg g",
  58.           "lg-a""lg-b""lg-c""lg-d""lg-f""lg-g""lg-k""lg-l""lg-m",
  59.           "lg-o""lg-p""lg-s""lg-t""lg-u""lg-w""lg/k""lg/l""lg/u",
  60.           "lg50""lg54""lge-""lge/""libw""lynx""m-cr""m1-w""m3ga",
  61.           "m50/""mate""maui""maxo""mc01""mc21""mcca""medi""merc",
  62.           "meri""midp""mio8""mioa""mits""mmef""mo01""mo02""mobi",
  63.           "mode""modo""mot ""mot-""moto""motv""mozz""mt50""mtp1",
  64.           "mtv ""mwbp""mywa""n100""n101""n102""n202""n203""n300",
  65.           "n302""n500""n502""n505""n700""n701""n710""nec-""nem-",
  66.           "neon""netf""newg""newt""nok6""noki""nzph""o2 x""o2-x",
  67.           "o2im""opti""opwv""oran""owg1""p800""palm""pana""pand",
  68.           "pant""pdxg""pg-1""pg-2""pg-3""pg-6""pg-8""pg-c""pg13",
  69.           "phil""pire""play""pluc""pn-2""pock""port""pose""prox",
  70.           "psio""pt-g""qa-a""qc-2""qc-3""qc-5""qc-7""qc07""qc12",
  71.           "qc21""qc32""qc60""qci-""qtek""qwap""r380""r600""raks",
  72.           "rim9""rove""rozo""s55/""sage""sama""samm""sams""sany",
  73.           "sava""sc01""sch-""scoo""scp-""sdk/""se47""sec-""sec0",
  74.           "sec1""semc""send""seri""sgh-""shar""sie-""siem""sk-0",
  75.           "sl45""slid""smal""smar""smb3""smit""smt5""soft""sony",
  76.           "sp01""sph-""spv ""spv-""sy01""symb""t-mo""t218""t250",
  77.           "t600""t610""t618""tagt""talk""tcl-""tdg-""teli""telm",
  78.           "tim-""topl""tosh""treo""ts70""tsm-""tsm3""tsm5""tx-9",
  79.           "up.b""upg1""upsi""utst""v400""v750""veri""virg""vite",
  80.           "vk-v""vk40""vk50""vk52""vk53""vm40""voda""vulc""vx52",
  81.           "vx53""vx60""vx61""vx70""vx80""vx81""vx83""vx85""vx98",
  82.           "w3c ""w3c-""wap-""wapa""wapi""wapj""wapm""wapp""wapr",
  83.           "waps""wapt""wapu""wapv""wapy""webc""whit""wig ""winc",
  84.           "winw""wmlb""wonu""x700""xda-""xda2""xdag""yas-""your",
  85.           "zeto""zte-"))) {
  86.     return 4// Мобильный браузер обнаружен по сигнатуре User Agent
  87.   }
  88.  
  89.   return false// Мобильный браузер не обнаружен
  90. }
Функция возвращает false, если браузер стационарный или по каким-то причинам его не удалось определить. Если браузер запущен на мобильном устройстве, то результат будет от 1 до 4, это код метода, которым он был определен. Сигнатуры на сайте время от времени пополняются, так что можете брать их оттуда самостоятельно и дополнять эту функцию.

Просмотров: 34300 | Комментариев: 14

Поле ввода с убирающейся подсказкой

20.04.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Трудно представить современный сайт без интерактивности. И она состоит из множества мелких деталей, которые стали уже чуть ли не стандартом в web-строительстве. Одна из таких "фишек" - текстовое поле ввода, в котором по умолчанию прописана подсказка об ожидаемом содержимом, например, "введите текст для поиска". При клике на это поле текст подсказки убирается, а при уходе с него, если пользователь ничего не ввел, текст подсказки возвращается обратно. Такой способ экономит полезное место в дизайне, не загромождая его выносными подсказками, а также помогает пользователю лучше ориентироваться при заполнении различных форм. Классический вариант, который обычно используется на сайтах, выглядит примерно так:
  1. <label for="search">Поиск по сайту:</label>
  2. <input type="text" name="search" id="search" value="что ищем?"
  3.        onfocus="if(this.value==this.defaultValue){this.value='';}"
  4.        onblur="if(this.value==''){this.value=this.defaultValue;}">
Могут быть некоторые варианты в реализации, но основной принцип остается этот же. Алгоритм простейший: при получении фокуса полем ввода проверяется его содержимое. Если оно совпадает со значением, установленным в параметре value, то содержимое подменяется на пустую строку. При потере фокуса также выполняется обратная проверка, и если поле осталось пустым, то в него подставляется значение по умолчанию. Плюсы этого способа: минимальный код, работает с отключенными стилями, хорошая совместимость с различными браузерами. Но минусы тоже значительные: при отключенных скриптах поле ввода придется сперва вручную очистить, а затем уже вписать в него нужное значение, для смены оформления подсказки придется писать дополнительный код, при отправке формы без дополнительных проверок будет передано значение по умолчанию и в любом случае потребуется дополнительная обработка введенных данных на стороне сервера, особые поля типа пароля будут отображать звездочки вместо текста подсказки.

Читать статью целиком »
Просмотров: 18624 | Комментариев: 19

Методы parseInt и parseFloat: особенности и альтернативы

28.03.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Для преобразования строки в число в JavaScript используются два метода: parseInt - для целых чисел и parseFloat для чисел с плавающей запятой. В официальной документации про parseInt сказано примерно следующее:


Метод parseInt возвращает целое значение, равное числу, содержащемуся в его параметре. Если параметр не может быть обработан как целое, возвращается NaN.


И почти то же самое про parseFloat:


Метод parseFloat возвращает числовое значение, содержащееся в его параметре. Если параметр не может быть обработан как число с плавающей точкой, возвращается значение NaN.


Вроде бы все логично и понятно. Еще небольшое отличие, что parseInt имеет второй параметр - основание системы счисления, в которой рассматривается конвертируемое число, к нему мы вернемся чуть позже. А теперь от красивой теории перейдем к суровой практике.

Читать статью целиком »
Просмотров: 13176 | Комментариев: 6

prev 01 ... 32 33 34 35 36 37 38 ... 42 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.09 сек. / MySQL: 2 (0.003 сек.) / Память: 4.5 Mb
Наверх