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

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

Возврат отформатированной строки функцией sprintf

Май13
Качественная стяжка пола разными способами и материалами.

SprintfВек живи — век учись (народная мудрость)
При внимательном чтении документации PHP, функции sprintf наткнулся на то, что доступ к одинаковым параметрам можно получить через указания номера параметра этой ф-ции.

Рассмотрим несколько примеров.

Во всех примерах я хочу вывести строку  Мой персональный блог <a href=»http://blog.nagaychenko.com»>http://blog.nagaychenko.com</a>

Пример 1:

$string = 'Мой персональный блог <a href="%s">%s</a>';
echo sprintf($string, 'http://'.$_SERVER['HTTP_HOST'].'/blog');

Получаем ответ

Warning: sprintf(): Too few arguments in D:\www\test\index.php on line 3

Как видно я хочу заменить ключи %s на ‘http://’.$_SERVER[‘HTTP_HOST’].’/blog’ в двух местах, но в ф-ции значение для второго ключа не передано, следовательно произошла ошибка.

Пример 2:

$string = 'Мой персональный блог <a href="%s">%s</a>';
echo sprintf($string, 'http://'.$_SERVER['HTTP_HOST'].'/blog', 'http://'.$_SERVER['HTTP_HOST'].'/blog');

Получаем ответ

Мой персональный блог <a href="http://blog.nagaychenko.com">http://blog.nagaychenko.com</a>

В этом примере все прошло корректно, но мне дважды пришлось писать одно и тоже значение ‘http://’.$_SERVER[‘HTTP_HOST’].’/blog’, а если таких значений куда больше чем 2? Получается не очень красиво и можно сильно попасть при смене строки с ключами. Особенно попадаем если ключи поменялись местами. Чтобы такого не было, можно использовать третий пример.

Пример 3:

$string = 'Мой персональный блог <a href="%1$s">%1$s</a>';
echo sprintf($string, 'http://'.$_SERVER['HTTP_HOST'].'/blog');

Получаем ответ

Мой персональный блог <a href="http://blog.nagaychenko.com">http://blog.nagaychenko.com</a>

Обратите внимание на %1$s и %1$s — это теже ключи, что и %s, но в них теперь указывает порядковый номер параметра переданный в ф-цию.
Еще одно замечание, если юзаете двойные кавычки, то перед знаком доллара необходимо ставить экранирующий слешь «%1\$s».

Как видно 2-й и 3-й вариант более правильный, но лучше использовать вариант номер 3!


Ниже приведено описание ф-ции из мануала:

Описание

string sprintf ( string $format [, mixed $args ] )

Возвращает строку, созданную с использованием строки формата format .

Строка формата состоит из директив: обычных символов (за исключением %), которые копируются в результирующую строку, и описатели преобразований, каждый из которых заменяется на один из параметров. Это относится также к fprintf(), sprintf() и printf().

Каждый описатель преобразований состоит из знака процента (%), за которым следует один или более дополнительных элементов (в том порядке, в котором они здесь перечислены):

Необязательный описатель заполнения, который определяет, какой символ будет использоваться для дополнения результата до необходимой длины. Это может быть пробел или 0. По умолчанию используется пробел. Альтернативный символ может быть указан с помощью ‘. См. примеры ниже.
Необязательный описатель выравнивания, определяющий выравнивание влево или вправо. По умолчанию выравнивается вправо, — используется для выравнивания влево.

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

Необязательный описатель точности, определяющий, сколько десятичных разрядов отображать для чисел с плавающей точкой. Имеет смысл только для числовых данных типа float. (Для форматирования чисел удобно также использовать функцию number_format().)

Описатель типа, определяющий, как трактовать тип данных аргумента. Допустимые типы:

% — символ процента. Аргумент не используется.
b — аргумент трактуется как целое и выводится в виде двоичного числа.
c — аргумент трактуется как целое и выводится в виде символа с соответствующим кодом ASCII.
d — аргумент трактуется как целое и выводится в виде десятичного числа со знаком.
e — аргумент трактуется как float и выводится в научной нотации (например 1.2e+2).
u — аргумент трактуется как целое и выводится в виде десятичного числа без знака.
f — аргумент трактуется как float и выводится в виде десятичного числа с плавающей точкой.
o — аргумент трактуется как целое и выводится в виде восьмеричного числа.
s — аргумент трактуется как строка.
x — аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в нижнем регистре букв).
X — аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в верхнем регистре букв).

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

Как из csv занести данные в mysql

Апрель29
Спонсор статьи: Электронная книга azbooka n516 black - читалка на основе электронных чернил. Экран идентичен обычной бумаге.

Всем привет!

Сегодня я хочу рассказать как можно данные из CSV-файла загрузить в БД MySQL.

Для сего это нужно???? Да разные бывают ситуации, иногда клиенты из экселя дают нам данные и просят их занести в БД, а как это сделать???? Не будем же мы подключать массивные скрипт для обработки этого файла и потом еще наступим на грабли с кодировкой… Есть пути куда проще.

В предыдущей своей статье я рассказывал, как записать данные из БД в CSV-файл.

Имеется содержимое файла

"id";"login";"pass"
"3";"superadmin";"da1c42eb9cec3336fa8e996832fcbc90"
"4";"admin";"21232f297a57a5a743894a0e4a801fc3"
"5";"Fabian_Admin";"60f8ffb1f0d1d30a3d4a5909452da58d"

Первое что делаем, убираем первую строку — аля название поля в БД. Именно тут эта строка не влияет ни на что.
Далее создаем таблицу в БД с соот полями:

CREATE TABLE `user` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`login` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`pass` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT

Теперь просто используя запрос:

LOAD DATA INFILE 'd:\\user.csv'
INTO TABLE `user`
FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\'
LINES STARTING BY '' TERMINATED BY '\r\n';

Конструкция LOAD DATA INFILE ‘d:\\user.csv’ говорит о том, помещен файл с данными по указанному пути, путь абсолютный.

Конструкция FIELDS TERMINATED BY ‘;’ ENCLOSED BY ‘»‘ ESCAPED BY ‘\r\n’ говорит о том, что каждое поля в файле будут разделены знаком ;, также что каждое поле будет обернуто в знак «, если внутри поле будет соот знак, то БД позаботится об экранирования (ESCAPED BY) таких знаков (правила построения CSV файлов).

Конструкция LINES STARTING BY » TERMINATED BY ‘\r\n’ говорит о том, что каждая строка начинается с указаного занчения в LINES STARTING BY, а заканчивается строка значением в TERMINATED BY, в данном примере, я ничего не присваиваю началу строки, просто написал чтобы был виден общий синтаксис. Т.к. я юзаю Windows, которому в качестве переноса строки необходимо указать \r\n, поэтому я это значение и поставил в TERMINATED BY, если Вы юзаете *nix подобные системы, то там значение конца строки \n

В итоге выполнения запроса в таблицы БД будет следующее:

mysql> select * from user;
+----+--------------+----------------------------------+
| id | login        | pass                             |
+----+--------------+----------------------------------+
|  3 | superadmin   | da1c42eb9cec3336fa8e996832fcbc90 |
|  4 | admin        | 21232f297a57a5a743894a0e4a801fc3 |
|  5 | Fabian_Admin | 60f8ffb1f0d1d30a3d4a5909452da58d |
+----+--------------+----------------------------------+
3 rows in set (0.00 sec)

Пожалуйста пользуйтесь!!! Есть вопросы — через комментарии.
UPD:

Вчера я допустил неточность, сказав что из CSV файла необходимо вручную убрать первую строчку. Её можно убрать с помощью запроса. Строка IGNORE num LINES, гду num это кол-во строк которые надо пропустить.

Вот полный запрос:

LOAD DATA INFILE 'd:\\user.csv'
INTO TABLE `user`
FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\'
LINES STARTING BY '' TERMINATED BY '\r\n'
IGNORE 1 LINES;

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

Работа с командной строкой в Kohana3 (KO3)

Апрель22
Cтолешница из искусственного камня своими руками, большой выбор столещниц, умывальник и подоконников.

Всем привет!

Есть некоторые задачи которые выполняются не по воле пользователей (зашел в браузер, набрал сайт и получил сайт — выполнилась какая-то задача), а по воле программистов, самих серверов в определенное время (cron). Писать о работе планировщика заданий не буду, а опишу здесь как правильно работать с командной строкой в Kohana3. Пока пишу опираясь на ОС Windows, когда буду обновлять на сервере сделаю обновление, если будет нужен, о работе с командной строкой в *nix подобных системах.

Первым делом заходим в командную строку, для этого нажимаем клавишу ВИНДОВС (те кто не знают, клавиша с флагом корпорации) + R. В появившемся окне пишем ручками cmd и нажимаем enter. Простите, что так подробно, но есть «уникумы» которые и такое сделать не могут. Далее переходи на диск, где установлен PHP, для этого просто пишем D:(у меня он на диске D), затем пишем команду перехода к папке, где расположен PHP cd php5, нажимаем enter. Для проверки работы самого PHP пишем тестовую команду, узнаем версию PHP: php -v, если на экране отобразилась нужная информация, значит все у нас получилось. Все показано на рисунке:

Команды для работы с PHP в командной строке

Команды для работы с PHP в командной строке

Вторым делом, избавляемся от данных из супер глобального массива $_SERVER. Опытные программисты знают, что при работе с командной строкой, всех тех индексов которые есть при работе через браузер просто НЕТ.
Вот выдержка из документации:

$_SERVER is an array containing information such as headers, paths, and script locations. The entries in this array are created by the web server.

Я, например, об этом знал, но забыл 🙁 и потратил 2 часа чтобы от этого избавится. В основном, для получения полного пути к папке где лежит запускаемый скрипт, я использовал переменную $_SERVER[‘DOCUMENT_ROOT’], но в самой Kohana есть ведь константа DOCROOT, которая и дает нам то, что нужно!!!

Третьим делом удостоверяемся, что у нас последняя версия фреймверка, т.к. из-за одного маленького, необязательного, опционально аргумента одной из ф-ций которая используется в классе CLI работа велась НЕКОРРЕКТНО! Или, если нет желания менять свою старую версию, тогда в файле:

/system/classes/kohana/cli.php

необходимо найти строки:

if (strpos($opt, '='))
{
	// Separate the name and value
	list ($opt, $value) = explode('=', $opt);
}

и заменить на следующий фрагмент кода

if (strpos($opt, '='))
{
	// Separate the name and value
	list ($opt, $value) = explode('=', $opt, 2);
}

Ну и наконец, как же работать с командной строкой.

Для работы пишем в нашей открытой командной строке, для Виндовс, если используете &, то все данные надо брать в кавычки:

D:\php5>php путь/до/index.php --uri=путь/из/роутера
--get="maxnag[]=1&maxnag[]=2" --post="intik=ddd"

обратите внимание! Строка пишется без переноса,
я это сделал чтобы влазило в видимую часть

B наш скрипт прекрасно переключается на классы и методы, которые описаны в роутере и передает данные, в данном случае это два массива $_GET и $_POST.

Вот что получилось:

Результат работы скрипта через командную строку

Результат работы скрипта через командную строку

У командной строки есть опции, в данный момент времени их 4, все они должны начинаться с ==, ну и пробел перед первым равно.

uri — строка которая идет после домена, например http://examlpe.com/test/one/1, uri=test/one/1
method — из документации: string method: GET, POST, PUT, DELETE, etc
get — данные для супер глобального массива $_GET
post — данные для супер глобального массива $_POST

не забываем, что для передачи массива надо использовать индексы массива
с квадратными скобками, как это написано в примере

Теперь можно смело в файле-конфигурации планировщика задач писать команды для работы с фреймверком Kohana из командной строки.

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

Сайт упал из-за ECHO

Март4
Дидактические материалы по геометрии Гусев 8 класс.

Привет, уважаемые читатели!

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

Также данная статься предназначена для людей которые имеют представление об ООП, приведениях типов, в общем, с углубленным знанием PHP.

Итак. Я работаю с ZendFramework. В одном из проектов который я создаю было задача построения не простой формы, следовательно вывести во вьюхе:

<?php echo $this->form;?>

я не смог из-за сложной верстки (декорировать на зенде — дольше, чем на голом ХТМЛе создать), я просто разобрал созданную в контроллере форму по элементам:

$itemsList = $this->form->getElements ();

в таком виде я получил массив всех элементов, ключами массива служили название полей в форме, а значение — объект данного поля (валидаторы, декораторы и тд).

При построении кнопок в данной форме я воспользовался конструкцией тернарного оператора:

<?php echo isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>

В форме при разных условиях часть кнопок отсутствовала, поэтому юзал условия.

При такой конструкции сайт ВАЛИТСЯ!!! Никаких сообщений нет, трейса нет, в логе-апача ничего нет — полный ГОЛЯК! Нашел я эту проблему методом «научного тыка».

Ну как ни у кого нет мысли почему эти строки валили сайт, еще скажу, если выводить какую-то одну из строк — все ОК?!

В общем дело в том, что именно оператор ECHO виновен, он не смог преобразовать объект в строку и выдать её, при этом никакого предупреждения не выдав!!!!!!!!

Если переписать эти строки вот так:

<?php print isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php print isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>

, т.е. заменить echo на print все нормально срабатывало.

Как бы я не крутил конструкция с эхо, скобочки разные, короткое сокращение эхо, и тд ничего не происходило. Помогло только явное приведение к строке с помощью конструкции (string), или конкатенация с пустой строкой, или приведение к типу с помощью ООП метода __toString();

<?php echo isset($itemsList["submit"]) ? (string)$itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? (string)$itemsList["reset"] : ''?>
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"].' ' : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"].' ' : ''?>
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"]->__toString() : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"]->__toString() : ''?>

Но самое, что для меня не понятное, почему если, я расписал условие в полном объеме:

if(isset($itemsList["submit"]))
{
	echo  $itemsList ["submit"];
}

if(isset($itemsList["reset"]))
{
	echo  $itemsList ["reset"];
}

все выполняется, заметьте, преобразованием типа я не занимался!!!

Вот часть кодов, может кто хочет протестировать:
Класс формы

public function __construct($options = null)
{
.....
	$this->_options = $options;
.....
}

public function init()
{
.....
	$this->addElement(
		'submit', 
		'submit', 
		array(
			'label' => 'submit', 
			'class' => 'but', 
			'decorators' => array('ViewHelper'), 
			'title'=>'submit'
		)
	);

	$this->addElement(
			'submit',
			'reset',
			array(
					'label'=>'reset',
					'class' => 'but',
					'decorators' => array('ViewHelper'),
					'title'=>'reset'
			)
	);
.....
}

protected $_options = array();

Контроллер

$form = new Module_Forms_MyForm(array('some options'));
.....
$this->view->form = $form;

Вьюха

$itemsList = $this->form->getElements ();

<form ....>
.....
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>
.....
</form>

Плиз, оставь свои мнения, почему в тернарном операторе эхо не сработало, а в общем условии — все ок!! Очень интересно знать, отвечу на любые вопросы.

UPD: Забыл сказать, все это без каких либо изменений работет по виндой, но подлинухом не работает!

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

Отправка почты через sendmail в ОС Windows

Февраль23

Всем привет!

Наверняка многие использовали и используют функцию mail() для отправки сообщение e-mail. Но в ОС Windows невозможно отправить почту используя только скрипты php и эту ф-цию. Нужны программные средства:

1 Установить полноценный почтовый сервер, например Kerio Connect (не реклама)
2 Использовать скрипты (классы) для работы с почтой: Zend_mail, PHPmailer и т.д.
3 Установить готовые веб-серверы типа Денвер, XAMPP
4 Воспользоваться эмуляцией демона sendmail для OS Windows

Пока не поздно подумаем о лете и ЖАРЕ, присмотримся к кондиционерам, vrf системы — наше спасение.

Лично я не любитель использовать собранные проекты, такие как Денвер, XAMPP и им подобным. Люблю использовать то, что будет жить на сервере, т.е. по-отдельности устанавливаю сервисы. Устанавливать какой-то мыльный сервере, тоже не охота — его нужно ломать (большинство платные), настраивать и тд. Что же делать?

На помощь пришел 4-й пункт! Качаем, распаковываем, и начинаем настройку.

Настройка sendmail.ini

И так в созданном каталоге будет файл sendmail.ini, его и надо править — это главный файл конфигурации:

; configuration for fake sendmail

; if this file doesn't exist, sendmail.exe will look for the settings in
; the registry, under HKLM\Software\Sendmail

[sendmail]

; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory.  (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.

smtp_server=smtp.mail.ru

; smtp port (normally 25)

smtp_port=2525

; SMTPS (SSL) support
;   auto = use SSL for port 465, otherwise try to use TLS
;   ssl  = alway use SSL
;   tls  = always use TLS
;   none = never try to use SSL

smtp_ssl=auto

; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify

default_domain=mail.ru

; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging

debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

auth_username=your_login@mail.ru
auth_password=your_password

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines.  do not enable unless it is required.

pop3_server=
pop3_username=
pop3_password=

; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content

force_sender=your_login@mail.ru

; force the sender to always be the following email address
; this will only affect the "RCTP TO" command, it won't modify 
; the "To: " header of the message content

force_recipient=

; sendmail will use your hostname and your default_domain in the ehlo/helo
; smtp greeting.  you can manually set the ehlo/helo name if required

hostname=mail.ru

где
smtp_server — сервер отправки почты;
smtp_port — порт сервера;
smtp_ssl — использование сертификата, если не знаете пусть будет auto;
default_domain — основной домен для сервера отправки сообщения;
error_logfile — лог-файл ошибок, название любое, даже можно написать путь, где будет храниться файл;
debug_logfile — лог-файл отладочной информации (деббагер) в нем видно все «разговоры» с сервером;
auth_username и auth_password — данные авторизации на сервере;
force_sender — от кого будет послано сообщение;
force_recipient — кому будет послано, но оставляем пустым, т.к. эту инфу указываем в скрипте;
hostname — ставим такое же, как и default_domain.

Хочу напомнить, что не все серверы, из-за спама, разрешают их юзать, например при написании статьи я попытался подключиться к smtp.yandex.ru:25 ничего не вышло, кол-во писем в ящике показывает, но не отправляет.
Иная ситуация с smtp.mail.ru:2525, причем порт не по-умолчанию, стандартные тоже не работал, но в помощи, на сайте, написано, что есть два других порта, я воспользовался и получилось.

Настройка php.ini

Находим секцию [mail function]

[mail function]
; For Win32 only.
; SMTP = localhost
; smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
 sendmail_path = d:/sendmail/sendmail.exe

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
; mail.force_extra_parameters =

комментируем все строки, кроме пути к sendmail, в этом пути прописываем полный путь к бинарнику.

Пишем простейший скрипт

<?php
mail('to_your_friend@server.com', 'My Subject', 'My message');

ну пояснять тут ничего не буду, самый первый линк этой статьи видет на пояснения.

Разбор логов

10.02.23 20:09:32 ** --- MESSAGE BEGIN ---
10.02.23 20:09:32 ** To: to_your_friend@server.com
10.02.23 20:09:32 ** Subject: My Subject
10.02.23 20:09:32 ** 
10.02.23 20:09:32 ** My message
10.02.23 20:09:32 ** --- MESSAGE END ---
10.02.23 20:09:32 ** Connecting to smtp.mail.ru:2525
10.02.23 20:09:33 ** Connected.
10.02.23 20:09:33 << 220 mail.ru ESMTP Tue, 23 Feb 2010 20:09:33 +0300<EOL>
10.02.23 20:09:33 >> EHLO mail.ru<EOL>
10.02.23 20:09:33 << 250-mx34.mail.ru Hello mail.ru [xxx.xxx.xxx.xxx]<EOL>250-SIZE 31457280<EOL>250-8BITMIME<EOL>250-AUTH PLAIN LOGIN<EOL>250 PIPELINING<EOL>
10.02.23 20:09:33 ** Authenticating as your_login@mail.ru
10.02.23 20:09:33 >> AUTH LOGIN<EOL>
10.02.23 20:09:33 << 334 VXNlcm5hbWU6<EOL>
10.02.23 20:09:33 >> bmFnYXljaGVua29AbWFpbC5ydQ==<EOL>
10.02.23 20:09:33 << 334 UGFzc3dvcmQ6<EOL>
10.02.23 20:09:33 >> c2V4c2hvcA==<EOL>
10.02.23 20:09:33 << 235 Authentication succeeded<EOL>
10.02.23 20:09:33 >> MAIL FROM: <your_login@mail.ru><EOL>
10.02.23 20:09:33 << 250 OK<EOL>
10.02.23 20:09:33 >> RCPT TO: <to_your_friend@server.com><EOL>
10.02.23 20:09:33 << 250 Accepted<EOL>
10.02.23 20:09:33 >> DATA<EOL>
10.02.23 20:09:33 << 354 Enter message, ending with "." on a line by itself<EOL>
10.02.23 20:09:33 >> Date: Tue, 23 Feb 2010 19:09:33 +0200<EOL>
10.02.23 20:09:33 >> To: to_your_friend@server.com<EOL>
10.02.23 20:09:33 >> Subject: My Subject<EOL>
10.02.23 20:09:33 >> <EOL>
10.02.23 20:09:33 >> My message<EOL>
10.02.23 20:09:33 >> .<EOL>
10.02.23 20:09:34 << 250 OK id=1NkBNF-000BaE-00<EOL>
10.02.23 20:09:34 >> QUIT<EOL>
10.02.23 20:09:34 << 221 mx34.mail.ru closing connection<EOL>
10.02.23 20:09:34 ** Disconnected.
10.02.23 20:09:34 ** Disconnected.
10.02.23 20:09:34 ** Disconnected.

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

Ну и в ответ, на своем почтовом ящике, куда я послал почту я её и получил.

Сам сервис для отправка почты через sendmail в ОС Windows можете взять тут

Удачи, пиши отзывы, кликайте на рекламу )))

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

Запуск скриптов PHP из под Cron в ОС Windows

Февраль17
Купили новые двери? Надо вырезать замки, обращайтесь.

Наверняка ни один большой сайт, проект, не обходится без участия запуска скриптов автоматом используя демон Linux cron.

Что такое крон, описывать не буду, очень хорошо об этом написано на ссылке выше. Здесь я опишу как можно запустить скрипт автоматом используя теже команды, что в Linux, но только под Windows.

Для работ необходимо скачать программку

Распаковать, в полученной папке вы увидите 3 файла:

crontab  - сюда записываются задания в формате крона
crontab.exe - это исполняемый файл
cron.log - отчет о работе крона

Далее запускаем файл crontab.exe, если надо чтобы крон стартовал сразу при запуске Windows, то помещаем его в папку автозапуска (пуск->программы->автозапуск), файл не работает как сервис, поэтому выход только такой.

Далее заходим в файл crontab и записываем команду

* * * * * d:/php5/php d:/www/test/phpinfo.php

это команда будет дергать файл d:/www/test/phpinfo.php каждую минуту.

Вот и все настройки, можете пользоваться и работать. Конечно это не полноценный демон, но главную задачу — запуск файла он делает.

В файле cron.log — будет записываться лог выполняемый кроном, вот содержимое:

17.02.2010 23:06 Cron started.
17.02.2010 23:07 d:/php5/php d:/SVN/www/test/phpinfo.php
17.02.2010 23:08 d:/php5/php d:/SVN/www/test/phpinfo.php

Для остановки работы крона, убираем его из процессов, с помощью диспетчера задач.

Всем удачи!

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

Создание csv файла средствами mysql

Февраль13

csv mysql средствами

Есть задача — получить данные из таблицы или результат запроса и сохранить в виде CSV файла. Т.е. получить Файл CSV MySQL средствами.

Содержимое запроса:

<pre>mysql> SELECT* FROM user;
+----+-------+----------------------------------+------------+
| id | login | pass                             | date       |
+----+-------+----------------------------------+------------+
|  1 | maxx  | 8ffc4674e44d1dffafe02b58603a9621 | 2009-01-09 |
|  5 | admin | 651e6a3959b7c09ed603071db34b238a | 2009-01-11 |
|  6 | tzmk  | 651e6a3959b7c09ed603071db34b238a | 2009-01-19 |
+----+-------+----------------------------------+------------+
3 rows in set (0.00 sec)

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

Вот полный запрос для данных действий:

SELECT * INTO OUTFILE 'd:\\test.csv'
FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\'
LINES STARTING BY '' TERMINATED BY '\r\n'
FROM user

Конструкция INTO OUTFILE ‘d:\\test.csv’ говорит о том, результат запроса будет помещен в файл по указанному пути, путь абсолютный.

Конструкция FIELDS TERMINATED BY ‘;’ ENCLOSED BY ‘»‘ ESCAPED BY ‘\\’ говорит о том, что каждое поля в файле будут разделены знаком ;, также что каждое поле будет обернуто в знак «, если внутри поле будет соот знак, то БД позаботится об экранирования (ESCAPED BY) таких знаков (правила построения CSV файлов).

Конструкция LINES STARTING BY » TERMINATED BY ‘\r\n’ говорит о том, что каждая строка начинается с указаного занчения в LINES STARTING BY, а заканчивается строка значением в TERMINATED BY, в данном примере, я ничего не присваиваю началу строки, просто написал чтобы был виден общий синтаксис. Т.к. я юзаю Windows, которому в качестве переноса строки необходимо указать \r\n, поэтому я это значение и поставил в TERMINATED BY, если Вы юзаете *nix подобные системы, то там значение конца строки \n

В итоге получится файл с таким содержимым:

"1";"maxx";"8ffc4674e44d1dffafe02b58603a9621";"2009-01-09"
"5";"admin";"651e6a3959b7c09ed603071db34b238a";"2009-01-11"
"6";"tzmk";"651e6a3959b7c09ed603071db34b238a";"2009-01-19"

Но этого для полноценного CSV файла мало. Необходимо указать название столбцов, это можно сделать так:

SELECT 'id', 'login', 'pass','date'
UNION
(
SELECT * INTO OUTFILE 'd:\\test1.csv'
FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\'
LINES STARTING BY '' TERMINATED BY '\r\n'
FROM user
ORDER BY id ASC
)

тогда результирующий файл будет такого содержания:

"id";"login";"pass";"date"
"1";"maxx";"8ffc4674e44d1dffafe02b58603a9621";"2009-01-09"
"5";"admin";"651e6a3959b7c09ed603071db34b238a";"2009-01-11"
"6";"tzmk";"651e6a3959b7c09ed603071db34b238a";"2009-01-19"

Обратите внимание!!! Если Вам необходимо результирующие данные как-то отсортировать, то сортируемый запрос оберните в скобки, иначе MySQL сначала совместит 2 запроса, а потом сделает общую сортировку, вот цитата из документации:

To apply ORDER BY or LIMIT  to an individual SELECT,
place the clause inside the parentheses that enclose the:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

Не забываем поддерживать проект кликая на рекламу гугля))

Всем удачи!

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

Настройка memcached под Windows7

Февраль12
Нужно быстро и качественно сделать сайт визитку? Обращайтесь.

Захотел я попробовать поработать с кешированием данных, посмотреть что из этого выйдет. Много читал статей о разных технологиях кеширования, о плюсах и минусах каждой. Приглянулась мне кеширование в ОЗУ — память компа, а именно memcached.

Начал я читать как это все устанавливать и настраивать. Использую я для локальной разработки ОС Windows 7. Вроде бы скачал сам сервис (демон), установил просто в папку для этого сервиса (f:/memcached). Вроде скачал само расширение для PHP, написал соответствующие строки в
php.ini:

extension=php_memcache.dll

настрока совместимости ОС Windows

Затем началось самое интересное.
Апач перезапустил, ошибок никаких не выдал, значит расширение моему php 5.2.10 пришлось по вкусу, а вот сервис memcached поднять не могу!!!

Пишу в командной строке директиву — memcached.exe -d install и выдается ошибка… я уже пол часа над ней бился, пока не пошел за комп жены и там под Windows XP попробовал установить сервис. Сервис завелся за считанные секунды, и тут меня осенило!!!!

Надо в свойствах файла memcached.exe установить на вкладке совместимость режим совместимости с Windows XP.  Я так и попробовал — заработало!!!

О том что как им пользоваться можно почитать тут
Что такое memcached тут

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

Дамп таблиц. Операторы BACKUP TABLE и RESTORE TABLE в MySQL

Февраль11
Сольвентный принтер для печати широкого формата.

Ковыряясь в документации по MySQL я наткнулся на два оператора RESTORE TABLE(S) и BACKUP TABLE(S). Буква S на конце говорит, что можно писать и TABLE, и TABLES — это синонимы. Эти операторы позволяют делать копирование файлов данных таблиц. Применяются ТОЛЬКО к таблицам типа MyISAM.

Как же оно работает?

Оператор BACKUP TABLE(S) делает копирование файлов .MYD (данные таблицы) и файл описание структуры таблицы .FRM, файл индексов .MYI не копируется, т.к. может быть построен на основании двух вышеперечисленных файлов.

Синтаксис оператора BACKUP TABLE(S):

BACKUP TABLE tbl_name [, tbl_name] ... TO '/путь/к/резервному/каталогу';

Через запятую перечисляем копируемые таблицы. Путь, куда будет копироваться дамп таблиц, должен существовать, иначе БД вернет ошибку:

LOCK TABLE users READ;
BACKUP TABLE users TO 'd:\\1\\'\G;

конструкция \G — говорит о том, чтобы данные в консоли выводились не по горизонтали, а по вертикали, удобно, если итоговые данные содержат много полей или в поле длинное значение.

*************************** 1. row ***************************
   Table: test.users
      Op: backup
Msg_type: error
Msg_text: Failed copying .frm file (errno: 2)
*************************** 2. row ***************************
   Table: test.users
      Op: backup
Msg_type: Warning
Msg_text: The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
*************************** 3. row ***************************
   Table: test.users
      Op: backup
Msg_type: Error
Msg_text: Can't create/write to file 'd:\1\users.frm' (Errcode: 2)
*************************** 4. row ***************************
   Table: test.users
      Op: backup
Msg_type: status
Msg_text: Operation failed
4 rows in set (0.00 sec)

Как видно, БД предупреждает, что данные оператор будет опущен в 6-й версии (пока доживем, многие еще юзают 5.0).

Как еще было указано перед создание копии была сделана блокировка таблицы на чтение, оператором:

LOCK TABLE users READ;

делается это для того, чтобы не было возможности менять данные во время копии.

Если все сделано верно, то получаем такое сообщение:

mysql>
LOCK TABLE users READ;
BACKUP TABLE users TO 'd:\\'\G;
*************************** 1. row ***************************
   Table: test.users
      Op: backup
Msg_type: Warning
Msg_text: The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
*************************** 2. row ***************************
   Table: test.users
      Op: backup
Msg_type: status
Msg_text: OK
2 rows in set (0.16 sec)

Копия сделана, теперь её можно восстановить, на помощь придет оператор RESTORE TABLE(S), он имеет следующий синтаксис:

RESTORE TABLE tbl_name [, tbl_name] ... FROM  '/путь/к/резервному/каталогу';

При восстановлении, также необходимо, чтобы путь существовал и указание пути задаётся абсолютным. Еще одной особенностью восстановления является то, что восстанавливаемая таблица должна отсутствовать в БД. Иначе будет ошибка:

mysql> RESTORE TABLE users FROM 'd:\\';
+-------+---------+----------+---------------------------------------------+
| Table | Op      | Msg_type | Msg_text                                    |
+-------+---------+----------+---------------------------------------------+
| users | restore | error    | table exists, will not overwrite on restore |
+-------+---------+----------+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)

При успешном восстановлении на экране будет такая надпись:

mysql> RESTORE TABLE users FROM 'd:\\'\G;
*************************** 1. row ***************************
   Table: test.users
      Op: restore
Msg_type: Warning
Msg_text: The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
*************************** 2. row ***************************
   Table: test.users
      Op: restore
Msg_type: status
Msg_text: OK
2 rows in set (0.14 sec)

Восстановление длится дольше, т.к. необходимо построить индексы.

Всем удачи.

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

Проверка существования файла-картинки перед выводом на экран в 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.

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

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

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

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

 « предыдущие статьиновые статьи » 

Облако тегов

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

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

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

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

Календарь

Апрель 2024
Пн Вт Ср Чт Пт Сб Вс
« Июл    
1234567
891011121314
15161718192021
22232425262728
2930  

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