6 декабря 2012 г.
Маленькие сюрпрайзы PHP PDO.
На днях ковыряясь в mysql при помощи pdo сделал для себя маленькое открытие.
В методах prepere(), execute() не могут использоваться переменные (именованные не именованные через которые в запрос подставляются название таблиц и колонок. Вот так никакого exception, ни Fatal error, Kernel demage и т.п. Все тихо пропускаем и переходим к следующим инструкциям.
Вот такое не сработает:
$preQuery = $this->pdo->prepare('SHOW ?');
$preQuery->execute(array("tables"));
К вашим услугам конкатенация строк и хранимые процедуры
12 июля 2012 г.
Какое в вашей форме поле ввода номера телефона?
Заполняя контактные данные в веб формах, вижу что то на подобие такого
или такое
На что идут веб мастера, чтобы упрастить себе работу и навязать посетителю свое видение отформатированного номера телефона.
Лично я считаю, что чем проще форма тем лучше - просто оставить текстовое поле и попробовать сделать одним из двух вариантов:
или такое
На что идут веб мастера, чтобы упрастить себе работу и навязать посетителю свое видение отформатированного номера телефона.
Лично я считаю, что чем проще форма тем лучше - просто оставить текстовое поле и попробовать сделать одним из двух вариантов:
- Задать шаблон в виде регулярного выражения атрибута pattern текстового поля (доступны в HTML5);
- Уже отправляя или получая данные, удалять из введенного пользователем значение, к примеру, все не цифровые знаки, распарсивая и приводя к нужной форме.
Начиная с HTML5 тесктовое поле input обзавелось атрибут pattern и сделало возможным проверку введенного значения регулярным выраженнием. (Если бы я не написал регулярное выражение для проверки корректности ввода номера телефона, то и начинать этот пост не было бы смысла.)
Но чтобы распарсить номер телефона надо иметь модель "типового" номера телефона.
Поэтому приведу сразу какими могут быть номера телефона:
- С или без указания кода страны +7, 28 или просто 8;
- С или без указания кода оператора или кода города - 3 цифры (В Санкт-Петербурге других не встречал);
- 7 цифр номера телефона c пробелами, через тире или все слитно (что то вроде 123-45-67, 1234567, 123 45 67).
Согласно этой модели привожу регулярное выражение которое удовлетворяет озвученным требованиям:
\s*(?:\+\d{1,2}|\d)?\s*(?:\(\s*\d{3}\s*\)\s*|\-?\d{3}(?:\-|\s)?)?\d{3}(?:\-|\s)?\d{2}(?:\-|\s)?\d{2}\s*
Описание с комментарием:
/\s*
(?:\+\d{1,2}|\d)? # +7, +38 или 8 или ничего из этого
\s* # пробелы, или ничего
(?:\(\s*\d{3}\s*\)\s*|\-?\d{3}(?:\-|\s)?)? # код города или оператора, может быть даже в скобочках
\d{3} # 3 обязательных числа
(?:\-|\s)?
\d{2} # 2 обязательных числа
(?:\-|\s)?
\d{2} # 2 обязательных числа
\s*/x
Регулярное выражение это можно использовать для выделения номеров телефона в произвольном тексте (Например если стану sms-спамером и буду писать граббер номеров телефонов с сайтов). Модифицировав выражение, можно извлекать различные части номера телефона.
Чтобы проверить работоспособность регулярного выражения мне нужна была большая выборка примеров номеров телефонов согласно созданной модели номера телефона. Для этой цели я использовал программу генератор seo текстов Seo Anchor Generator. Программа Seo Anchor Generator позволяет по заданному шаблону составить выборку всех возможных комбинаций по заданному шаблону.
Пример используемого в программе шаблона:
{+{7|38}|8|}{| }{({ |}012{ |}){ |}|{-|}012{ |-|}|}345{-| |}67{-| |}89{ |}
Таким образом я собрал 2160 примеров правильных комбинаций написания телефонов.
Javascript код для тестирования:
Javascript код для тестирования:
function isFormattedTelefon(str){ return /^\s*(?:\+\d{1,2}|\d)?\s*(?:\(\s*\d{3}\s*\)\s*|\-?\d{3}(?:\-|\s)?)?\d{3}(?:\-|\s)?\d{2}(?:\-|\s)?\d{2}\s*$/.test(str); } // массив с различными комбинациями написания одного телефона var testArray2=[ "+7( 012 ) 345-67-89","+7( 012 ) 345-67-89", ... , "345 67-89" ]; for(var i=0, len=testArray2.length;i<len;i++){ console.log("#%s is: %s",i,isFormattedTelefon(testArray2[i]) ); }Осталось только обкатать все это дело.
28 июня 2012 г.
Почему я больше не делаю мобильные версии сайтов
Мобильная версия будет отвлекать силы и время на ее поддержание. Смартфоны с удобным выходом в интернет сделают эту работу просто бессмысленной. Они стали доступнее, их качество выросло.
![]() |
| Вот, какие гейши... |
К тому же, всякая попытка «пересаживать» посетителей на урезанную мобильную версию будет вызывать раздражение у них.
Что будет с мобильными телефонами
Мобильные телефоны с номинальной возможностью выхода в интернет существуют, но их доля среди владельцев будет снижаться и останется на определенном нишевом уровне. Выход в интернет с этих устройств не рассматривается их владельцами в качестве приоритетных опции телефона.
Что делать с сайтом
Теперь сайт будет необходимо тестировать для отображения на мобильных устройствах, применять техники адаптивной верстки с явным использованием viewport-а.
20 июня 2012 г.
Ruby, регулярные выражения и Windows XP
Ruby хоть и является одним из наикроссплатформейших языков общего назначения с которыми мне приходилось работать, но в нем то и дело спотыкаюсь о грабли ее реализации на разных платформах.
Так сегодня мне потребовалось написать скрипт на ruby, который должен был запускаться на Windows XP (При этом я еще хотел его запускать дома, уже на Linux). Проблема заключалось в том что регулярные выражения, которые я применял к импортируемому тексту из стороннего файла напрачь не работали. Как заведено, в опенсорсе, раскажу о своей проблеме и как ее решал, кому нибудь пригодиться.
Что было:
- Windows XP
- ruby (MRI v1.9.3)
- Большой текстовый файл в кодировке utf-8, почти все содержимое набрано кириллицей.
Как иследовало ожидать проблемы в Windows XP были в двух кодировках. Консоль в Windows XP в IBM866 (соответственно импортируемый текст тоже был в ней), сам файл в utf-8.
Вообщем пришел к такому варианту:
# coding: utf-8
# Попутно, в Windows, импортированный utf-8 текст (через File) будет в utf-8 (а не IBM866)
Encoding.default_internal = 'UTF-8'
Encoding.default_external = 'UTF-8'
# регулярное выражение:
FIOPATTERN=/^Имя:\s*([^\n^\r]+)/u
31 мая 2012 г.
Депозитный калькулятор
Если Вы ищете легкий инструмент с помощью, которого можно посчитать доход по вкладу.
Представляю общественному вниманию свою недавнюю работу, приложение для браузера Chrome - депозитный калькулятор Deposit Calculation Tool.
Приложение создано, чтобы помочь определить вероятный доход по вкладу. В приложение cуществует возможность расчета дохода:
- с ежемесячной капитализации;
- с пополнениями вкладов (с частичным снятием я делать не стал, так как не встречал людей, которые такое планировали, но пожеланию такую возможность можно добавить);
- с различным сроком (с точностью до нескольких дней).
![]() |
| Внешний вид Deposit Calculation Tool |
Результаты вычиления выводятся в виде сводных данных и в виде графика.
Приложение доступно в магазине Chrome по ссылке и распространяется бесплатно.
Приятного использования.
![]() |
| Вывод результата вычисления |
23 мая 2012 г.
Все разумно в пределах потребностей
Сегодня в обеденный перерыв мне пришло озарение, очередное. Так часто бывает. Я как обычно вышел на улицу подышать воздухом. Взглядом пробежался по округе - машины, одуваньчики, девушки. Так вот, все на месте, только с одуваньчиками было не все в порядке. В виду того, что снег в этом году растаял на месяц раньше чем в прошлом году и одуваньчики начали во всю цвести и заполонять собой все газоны и пустыри. Не заметить аномалию с поведением одуваньчиками было не возможно.
Я даже с фотографировал.
Часть газона, которая освещена солнцем, в отличие от той что находиться в теньке, вся усеяна одуванчиками с раскрывшимися цветками. В пику им, те что в теньке, наоборот собрали свои бутончики.
Вот она растительная жизнь. Есть у них чувство хода событий. Растения может быть и не чувствуют ход времени, но меряют свой день солнечными лучами.
П. П. С. Вообщем занят был я последнее время. Совсем недавно запустил сайт клининговой компании "Северный блик". Люди, если кому-нибудь, потребуются чистые окна или радующий глаза, диван заходите http://www.blik-cleaning.ru/ .
30 марта 2012 г.
Поле для форматированного ввода числа
Вступление
Вам никогда не требовалось контролировать пользователя при вводе данных в форму на сайте?
На этой недели такую задачу я получил на работе. Имелось поле для ввода ссумы. Но чтобы ввод был форматированным не "100000", а "100 000". И соответстенно только цифры.Что нам Google подскажет
Как Google(Yandex) не борется за хороший поиск, а оригинальные варианты он не отбирает. Получается список почти идентичных вариантов контроля ввода через событие keypress. Html5 тоже не помог type="number" даже не контролирует ввод только цифр. Не много отвлекусь, поиск по блогам Google или Яндекса частично помогает разрядить выдачу однотипных решений. Но все равно чтобы найти хороший метод в выдаче нужно постараться.
Что нам понадобится
В стартное html поле ввода input можно ввести данные тремя спосбами:
- с клавиатуры. Это можно отловить слушая события keypress, keydown, keyup;
- вставить из буфера обмена;
- автоподстановка в браузере.
<input autocomplete="off" autofocus="" id="principal_amount" name="principal_amount" required type="text">
![]() |
| Как это выглядит |
if (!Array.prototype.indexOf){// Привет IE Array.prototype.indexOf = function(elt/*, from*/){ var len = this.length, from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++){ if (from in this && this[from] === elt) return from; } return -1; }; } function numberFormat(str){ // форматируем строку 12000 -> 12 000 var str_array=[], length=str.length; var undefined2string=function(val){ return val?val:""; } for(var i=length-1; i>=0;i-=3){ str_array.unshift( undefined2string(str[i-2])+undefined2string(str[i-1])+undefined2string(str[i]) ); } var resStr=str_array.join(" "); return resStr; } function createFormatControl(element,onchange_callback){ if (!(element instanceof HTMLInputElement)) throw("Wrong type of node, need HTMLInputElement"); onchange_callback=onchange_callback||function(){}; /* @e.keyCode: 9 - Tab 8 - Backspace 46 - Del 48-57 - 0-9 13 - Enter 37-40 - arrow: left,top,right,bottom 35 -Home 36 -End */ $(element).bind("keydown",function(e){//контролируем ввод с клавиатуры var keyCodeArray=[8,9,13,46]; if( (e.keyCode>47 && e.keyCode<58) || keyCodeArray.indexOf(e.keyCode) >= 0 || (e.keyCode>34 && e.keyCode<41) ){ return true; }else{ return false; } }).bind("textchange",function(e){// Контролируем изменение текста (вставку из буфера обмена.) var $this=$(this), origStr=$this.val().replace(/\D+/g,""), str=numberFormat(origStr); if(!(e.keyCode>34 && e.keyCode<41)){ $this.val(str); } onchange_callback(str); }); } $(document).ready(function(){ var in2 = document.getElementById("in2"), $deb3=$("#deb3"); createFormatControl(in2,function(e){$deb3.text(e);}); });Верстка:
<script type="text/javascript" src="jquery-1.7.1.min.js"></script> <script type="text/javascript" src="jquery.textchange.min.js"></script> <p> <label>#2: </label> <input type="text" id="in2" autocomplete="off"/> </p> <p id="deb3"></p>
Скачать архив с исходниками
Подписаться на:
Сообщения
(
Atom
)





