За чистый и ясный код!

Статьи на тему программирования под веб, используя PHP, MySQL, Jquery и многое другое

Проверка существования файла-картинки перед выводом на экран в Kohana3

Январь19
Циркон удобрение лучше, что есть для почвы!

Все наверное сталкивались с проблемой, когда на сервере отсутствует картинки и вместо неё зияет дыра, особенно это видно в глючном семействе браузеров ИЕ. Как бы избежать этого, ну чтобы или вообще эта картинка не показывалась?

Во многих фреймверках имеются инструменты для работы с частыми HTML тегами, например для работы с тегом IMG во фреймворке Kohana имеется статический метод image, который располагается в классе HTML. Я рекомендую именно писать ссылки, картинки, элементы форм используя инструменты фреймверка, в чем выигрыш? Да в том, что можно управлять создаваемым тегом.

Вот реальный пример, когда мы в Kohana пишет тег image:

Html::image('/img/news/test.jpg', array('alt'=>'Testing'));

то при выводе на экран эта строка превратится в тег:

<img src="http://site.com/img/news/test.jpg" alt="Testing" />

Если картинка на серваке отсутствует, то в зависимости от браузера она либо на экран не покажется, либо просто зиять её дыра, но по-любому будет лишний запрос-заголовок к серверу для выдачи фотки.

http://nagaychenko.com/test.jpg

GET /test.jpg HTTP/1.1
Host: nagaychenko.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,uk;q=0.8,en-us;q=0.6,en;q=0.4,de;q=0.2
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: MANTIS_VIEW_ALL_COOKIE=4; MANTIS_PROJECT_COOKIE=1; 
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.x 200 OK
Date: Thu, 21 Jan 2010 09:09:33 GMT
Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.2.11
Last-Modified: Thu, 21 Jan 2010 09:08:49 GMT
Etag: "3b90001-1a31b-47da90d10ea40"
Accept-Ranges: bytes
Content-Length: 107291
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: image/jpeg

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

	/**
	 * Creates a image link.
	 *
	 * @param   string   file name
	 * @param   array    default attributes
	 * @return  string
	 */
	public static function image($file, array $attributes = NULL, $index = FALSE)
	{
	    $file_from_another_server = FALSE;
	    
		if (strpos($file, '://') === FALSE)
		{
		    
		    $file_exists = (is_file($_SERVER['DOCUMENT_ROOT'].$file) AND file_exists($_SERVER['DOCUMENT_ROOT'].$file)) ? TRUE : FALSE;
			// Add the base URL
			$file = URL::base($index).trim($file,'/');
		}
		else
		{
		    $file_from_another_server = TRUE;
		}

		// Add the image link
		$attributes['src'] = $file;

		// провряем есть ли файл на ФС
		if ($file_exists)
		{
		    return '<img'.HTML::attributes($attributes).' />';
		}
		elseif($file_from_another_server)
		{
		    return '<img'.HTML::attributes($attributes).' />';
		}
	}

В коде я проверяю на присутствие именно файла, т.к. php-функция file_exists проверяет существование директории, т.е. написали вы просто путь и получите положительный ответ, но этоже не файл! Поэтому я еще и проверяю файл ли я передаю ф-циец is_file.

Если передаешь ссылку с другого сайта, то тут я ничего проверить не могу, в таком случае я просто отдаюсь на сознательность другого сервера.

Проверил сам и использую на своем проекте.

В помощь тебе, юзер.

Статья просмотренна 83425 раз, зашло посетителей 26061

Название классов в стилях регистрозависимое

Январь18

Через 5 лет столкнулся с проблемой, что название классов регистро-зависимое.

Во что значит писать все время в lower-case формате )))

Ссылка на главную доку

Статья просмотренна 34826 раз, зашло посетителей 8405

Конструирование запроса с использование JOIN в Kohana3

Январь17
Укрась свой сад с помощью разных фигурок, например с помощью фигуры рыбы.

Предстояло мне сформировать запрос с использование 2-х таблиц связанных с помощью конструкции JOIN. Беда была в том, что таблицы имели префикс (test_), который был указан в конфиге БД и к созданным алиасам, указанных таблиц, цеплялся префикс таблицы.

Ниже приведен запрос который был после использования такой конструкции:

DB::select()
                        ->from(array('context_adv_theme', 't'))
                        ->join(array('context_adv', 'a'), 'inner')
                        ->on('t.id', '=', 'a.theme_id')
                        ->where('fl', '=' ,1);
SELECT * FROM `test_context_adv_theme` AS `t`
INNER JOIN `test_context_adv` AS `a` ON (`test_t`.id = `test_a`.theme_id)
WHERE `fl` = 1

как видно в конструкции ON получалась такая запись (`test_t`.id = `test_a`.theme_id), вместо (`t`.id = `a`.theme_id)

для того, чтобы было (`t`.id = `a`.theme_id) необходимо ставить алиасы таблицы в конструкторе запроса ->ON в двойные кавычки, как это показано на нижнем примере:

DB::select()
                        ->from(array('context_adv_theme', 't'))
                        ->join(array('context_adv', 'a'), 'inner')
                        ->on('"t".id', '=', '"a".theme_id')
                        ->where('fl', '=' ,1);
SELECT * FROM `test_context_adv_theme` AS `t`
INNER JOIN `test_context_adv` AS `a` ON (`t`.id = `a`.theme_id)
WHERE `fl` = 1

В помощь тебе, юзер!!!

Статья просмотренна 40794 раз, зашло посетителей 14015

Название БД и её таблиц (влияние регистра букв)

Январь13
Воспользуйтесь смс рассылкой для Вашего бизнеса.

Всем привет!

Могу поспорить о том, что многие программисты PHP ведут свои локальные разработки на компьютерах под управлением операционной системы семейства Windows (я сам такой, но об этом сильно жалею). И наверное никто и не задумывался написать название БД или её таблиц с большой буквы, сколько я встречал БД все они имеют формат слово_слово, по правилам MySQL они должны начинаться с буквы, могут иметь цифры и знак подчеркивания «_» и прочие знаки. Даже если обратится к документации MySQL, то видно, что и там также применяется подобный формат.

И мало ли кто задумывался о создании таблицы или БД с Большой буквы!!!! А надо было.

Если написать в Windows, что что таблица будет с большой буквы

CREATE TABLE `Test` (
	`id` INT(10) NULL AUTO_INCREMENT,
	PRIMARY KEY (`id`)
) COLLATE=utf8_general_ci ENGINE=MyISAM ROW_FORMAT=DEFAULT

то в файловой системе, где хранятся данные о таблице, сами файлы имеют такое же написание, как и название таблицы, т.е. НАЗВАНИЕ ТАБЛИЦЫ ВЛИЯЕТ НА НАЗВАНИЕ ФАЙЛА и ессно зависят от РЕГИСТРА. Получается, что при обращении к таблице из ОС Windows

SELECT * FROM `Test`;

или

SELECT * FROM `test`;

ответ будет правильным, нам MySQL возвратит какие-то данные, но не дай Боже написать второй запрос в ОС *nix подобных системах — сразу будет исключение! Догадались чего???? Конечно в ОС *nix создание файлов регистрозависимое, и когда мы в запросе пишем название таблицы отличное от созданного, то не находится такой файл и вылетает ОШИБКА!!!! Иногда приходится часы тратить не понимая какого у меня локально все зашибись, а на серваке по *nix все х…во. Да и вообще, если мы юзаем РНР, то и должны писать под ОС на которой будет выполняться код!!

А вот название полей пофиг какие будут буквы, также как и название операторов.

Изначально под виндой запрещено вводить большие буквы в название таблиц))), а вот иногда ну надо!!! Как же быть??

Воть! Все легко и просто — lower_case_table_names настраиваем и можем делать, что угодно.

Удачного, правильного и чистого подхода.

Статья просмотренна 52396 раз, зашло посетителей 18378

Извлечение из дампа нужной таблицы

Январь4
Большой выбор бытовой техники! Магазин где Вы можете купить холодильник!

Иногда необходимо из большой БД получить данные по одной или несколько таблицам, а не грузит огромные дампы ради одной маленькой таблицы. Как это сделать и пойдет речь в данной статье.

Иногда требуется взять дамп только скелета таблиц, т.е. без данных:

mysqldump -uroot -proot name_of_db -d  > dump.sql

Запись дампа без некоторых таблиц:

mysqldump -uroot -proot name_of_db --ignore-table=name_of_db.table1  --ignore-table=name_of_db.table2 > dump.sql

Перенос определенных таблиц из одной в другую БД:

mysqldump -uroot -proot name_of_db --tables table1 table2 | mysql -uroot -proot another_db

Дамп определенной (нужной) таблицы:

mysqldump -uroot -proot name_of_db --tables  table1 table2  > dump.sql

Я думаю этого набора команд с лихвой хватит для работы.

Если вы не имеете доступ к консоли БД, то тогда воспользуйтесь программами phpMyAdmin или Sypex

Статья просмотренна 66489 раз, зашло посетителей 20206

выполнение действий до (preDispatch) и после (postDispatch) действия (Action)

Январь4

Всем привет. В этой статье я хочу поделится с Вами о том как выполнять какие-то действия до/после выполнения действий в методе Action контроллера.

Для чего это может понадобится? Ну например, перед тем как делать действия вам необходимо удостоверится залогинелся пользователь или нет. Конечно можно в каждом методе Action проверять залогинелся ли юзер или нет, но при таких условиях и в зависимости от громоздкости Вашего приложения необходимо это условие прописывать во всех методах, это не удобно, а вдруг Вы решите как-то сменить метод проверки на залогиненность, что тогда? Переписывание всех условия. Для решения данной задачи, можно создать контроллер который будет наследоваться от Zend_Controller_Action и в этом контроллере будет метод preDispatch или postDispatch которые будут делать действия до или после выполнения действий в самом экшене.

class BaseController extends Zend_Controller_Action
{
	/**
	* Pre-dispatch routines
	*
	* (non-PHPdoc)
	* @see Site/branch/Lib/Zend/Controller/Zend_Controller_Action#preDispatch()
	*/
	public function preDispatch()
	{
		$auth = Zend_Auth::getInstance();
		$userAuth = $auth->getStorage()->read();

		if (isset($userAuth->Id))
		{
			$this->_redirect('/');
		}
	}
}

class Module_IndexController extends BaseController
{
	public function indexAction()
	{
		// какие-то свои действия
	}
}

такие же работает и метод postDispatch.

Дешевая техника в интернет-магазине http://bestchinashops.ru/chinabuye/

Есть еще:

метод init() — этот метод выполняет действия вообще до метода preDispatch.

метод Render() — этот метод рисует данные вьюхи.

более подробно о всех методах вот тут — Контроллеры действий

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

позиция метод
1 __construct
2 init
3 preDispatch
4 indexAction
5 postDispatch

Именно в такой последовательности запускаются методы. Юзайте на здоровье.

Статья просмотренна 42098 раз, зашло посетителей 10336

  

Облако тегов

cli csv dump events form Kohana locale models MySQL mysqldump orm PHP tools trigger validate газ газовый счетчик итоги кеширование переменные

Облако тегов плагина WP Cumulus для WordPress требует для просмотра Flash Player 9 или выше.

Я на твиттере!

  • у твиттера тоже бывают перерывы...

Календарь

Январь 2010
Пн Вт Ср Чт Пт Сб Вс
« Дек   Фев »
 123
45678910
11121314151617
18192021222324
25262728293031

Сейчас на сайте