Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

воскресенье, 7 февраля 2010 г.

Резервное копирование базы данных на хостинге и отправка дампа по почте.

Бэкап можно сделать таким вот образом:
$user = "";
$db_name = "";
$password = "";

$command = "mysqldump --opt -h localhost -u$user -p$password $db_name > dump.sql";
system($command);
Конечно можно еще и заархивировать все это дело.

А вот для работы с почтой, я использую класс swift mailer.
По моему мнению это очень удобный класс на PHP для работы с почтой, очень широкий спектр возможностей.
Отправка письма с вложением будет выглядеть примерно так:

// подключаем библиотеку
require_once 'swift/lib/swift_required.php';

// объект smpt
$transport = Swift_SmtpTransport::newInstance('тут адрес smtp', 25)
->setUsername('тут имя вашего пользователя')
->setPassword('тут пароль вашего пользователя')
;

// объект для работы с почтовым ящиком
$mailer = Swift_Mailer::newInstance($transport);

// создаем сообщение
$message = Swift_Message::newInstance()

// тема
->setSubject('наша тема')

// адрес отправителя
->setFrom(array('адрес отправителя' => 'backup'))

// адрес получателя
->setTo(array('адрес получателя'))

// тело сообщения
->setBody('тело сообщения')

// альтернативное тело в html
->addPart('тело сообщения', 'text/html')

// вложение
->attach(Swift_Attachment::fromPath('dump.sql'))
;

// отправляем сообщение
$result = $mailer->send($message);
Вот так вот все просто, удобно а главное быстро.

суббота, 6 февраля 2010 г.

Интеграция Zend Framework в Netbeans IDE.

Добавлена поддержка Zend Framework для Netbeans.
Смотреть тут Интеграция Zend Framework в Netbeans IDE
Скачать сборку с поддержкой Zend Framework

Сборка пока еще весьма сырая, видимо в версии 6.9 все будет.

Создание проекта Zend Framework. Использование инструмента командной строки (начало).

Для начала нужно скачать и распаковать сам фреймворк.

Фреймворк содержит каталог bin/, в котором находятся скрипты zf.sh и zf.bat для UNIX- и Windows-систем соответственно.

Откройте терминал (в Windows, Start -> Run, а затем использовать cmd). Перейдите в каталог, где вы хотели бы создать проект. Затем, используя пути к соответствующему сценарию, и выполните одно из следующих действий (при запуске скрипта нужно указать абсолютный путь к файлу сценария, например с:\ZendFramework\bin\zf.bat):
# Unix:
% zf.sh create project quickstart

# DOS/Windows:
C:> zf.bat create project quickstart
Запуск этой команды создаст основную структуру сайта, включая контроллеры и представления. Дерево должно выглядеть следующим образом:
quickstart
|-- application
| |-- Bootstrap.php
| |-- configs
| | `-- application.ini
| |-- controllers
| | |-- ErrorController.php
| | `-- IndexController.php
| |-- models
| `-- views
| |-- helpers
| `-- scripts
| |-- error
| | `-- error.phtml
| `-- index
| `-- index.phtml
|-- library
|-- public
| `-- index.php
`-- tests
|-- application
| `-- bootstrap.php
|-- library
| `-- bootstrap.php
`-- phpunit.xml
Каталог library/ нашего проекта должен содержать классы Zend Framework (то есть каталог library/Zend дистрибутива). Тут есть два пути:

1. Символическая ссылка.
2. Копирование файлов из дистрибутива.

Для unix:
# Symlink:
% cd library; ln -s path/to/ZendFramework/library/Zend

# Copy:
% cd library; cp -r path/to/ZendFramework/library/Zend
В Windows скорее всего удобнее скопировать файлы, используя explorer. Таким образом просто копируем library/Zend в каталог library/ нашего проекта.

Теперь, когда проект создан, нужно разобраться с начальной загрузкой (bootstrap), настройками (configurations), контроллерами (controllers) и представлениями (views).


Наш класс Bootstrap определяет какие ресурсы и компоненты будут инициализорованы при запуске приложения. По умолчанию исполняется Front Controller, он использует каталог application/controllers/ для поиска контроллеров действий (actions), но об этом пожзе ... Класс Bootstrap выглядит примерно так:
// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

}
Как видите тут пока ничего особенного нет.

Настройки приложения.

Хотя Zend Framework является по сути неконфигурируемым, часто требуется настройка самого вашего приложения. Конфигурационный файл по умолчанию находится в application/configs/application.ini, помимо прочего он содержит некоторые основные директивы по настройке окружения PHP (например, управление режимом вывода отчетов об ошибках), указавает путь к Bootstrap-классу (а также его имя) и путь к контроллерам действий. Она выглядит следующим образом:


; application/configs/application.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1


Стоит отметить несколько моментов относительно этого файла. Во-первых, благодаря тому что формат этого файла ini, вы можете непостредственно ссылаться на константы и расширять их (например APPLICATION_PATH). Также определены несколько разделов: производство, установка, тестирование и разработка. Это удобно при дифференциации настроек на разных этапах создания приложения.

Контроллеры.

Контроллеры - это классы, которые обеспечивают сопоставление запросов пользователей с классами-моделями и представлениями (проще говоря обрабатывают запросы пользователей).

Класс-контроллер должен содержать один или несколько методов, имена которых заканчиваются на Action. По умолчанию url в Zend Framework следуют схеме: /controller/action, где controller - это имя контроллера без суффикса Controller, а action - это имя метода-действия без суффикса Action.

Как правило вам нужные минимум два контроллера: IndexController, ответсвенный за отображение домашней страницы, и ErrorController - для отображения всевозможных ошибок, например HTTP 404 или HTTP 500. Пример:


// application/controllers/IndexController.php

class IndexController extends Zend_Controller_Action
{

public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{
// action body
}
}

пятница, 5 февраля 2010 г.

Язык запросов ORM Doctrine. DQL (Doctrine Query Language). Запрос SELECT.

Запросы SELECT.

Синтаксис оператора SELECT:

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

SELECT используется для извлечения данных одного или более компонентов.

Каждый select_expr указывает на колонку или группу колонок таблицы, которую вы хотите получить. Должно быть не менее одного выражения (select_expr).

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

// test.php

// ...
$account = new Account();
$account->name = 'test 1';
$account->amount = '100.00';
$account->save();

$account = new Account();
$account->name = 'test 2';
$account->amount = '200.00';
$account->save();


Выполните test.php:
$ php test.php

Теперь вы можете протестировать выборку данных со следующими ниже примерами запросов:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('a.name')
        ->from('Account a');

echo $q->getSqlQuery();

Посмотрим на sql, который генерируется данным запросом:
SELECT a.id AS a__id, a.name AS a__name FROM account a

// test.php

// ...
$accounts = $q->execute();
print_r($accounts->toArray())

Результат обоих примеров будет одинаков:
$ php test.php
Array
(
    [0] => Array
    (
        [id] => 1
        [name] => test 1
        [amount] =>
    )

    [1] => Array
    (
        [id] => 2
        [name] => test 2
        [amount] =>
    )
)

FROM указывает на компонент или компоненты, из которых извлекаются записи:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username, p.*')
        ->from('User u')
        ->leftJoin('u.Phonenumbers p')

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username, p.id AS p__id, 
p.user_id AS p__user_id, p.phonenumber AS p__phonenumber 
FROM user u LEFT JOIN phonenumber p ON u.id = p.user_id

В аргументе WHERE, если оно присутствует, указывается условие или условия, которым должны удовлетворять записи при выборке. where_condition - это условие которое истинно для каждой строки в выборке. Если не задан аргумент WHERE, запрос выбирает все строки.
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('a.name')
        ->from('Account a')
        ->where('a.amount > 2000');

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT a.id AS a__id, a.name AS a__name FROM account a WHERE a.amount > 2000

В предложении WHERE, вы можете использовать любую из функций или операторов, которые поддерживают DQL, за исключением функций агрегирования. HAVING может быть использована для сужения результатов со статистическими функциями:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username')
        ->from('User u')
        ->leftJoin('u.Phonenumbers p')
        ->having('COUNT(p.id) > 3');

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username FROM user u 
LEFT JOIN phonenumber p ON u.id = p.user_id HAVING COUNT(p.id) > 3

Выражение ORDER BY может быть использована для сортировки результатов:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username')
        ->from('User u')
        ->orderBy('u.username');

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username FROM user u ORDER BY u.username

Выражения LIMIT и OFFSET могут быть использованы для эффективного ограничения количества записей до заданного row_count:
// test.php

// ...
$q = Doctrine_Query::create()
        ->select('u.username')
        ->from('User u')
        ->limit(20);

echo $q->getSqlQuery();

Метод getSql() вернет следующий запрос:
SELECT u.id AS u__id, u.username AS u__username FROM user u LIMIT 20