ZendFramework

ZF FAQ: установка кодировки при подключении к БД

Posted in Tips And Tricks, ZendFramework on July 28th, 2009 by Yaroslav Vorozhko – Be the first to comment

Привет!
Вопрос: Как установить кодировку utf8 при подключении к базе данных?

В версии Zend Framework 1.8, если вы используете Zend_Application, кодировка устанавливается через конфигурационный файл.

PHP:
  1. [production]
  2. resources.db.adapter = "pdo_mysql"
  3. resources.db.params.host = "localhost"
  4. resources.db.params.username = "YOURUSER"
  5. resources.db.params.password = "YOURPASS"
  6. resources.db.params.dbname = "YOURDB"
  7. resources.db.params.charset = utf8
  8. resources.db.isDefaultTableAdapter = true

В версии 1.7, кодировку можно установить при явном подключении к БД или при использовании конфигурационного файла, ниже приведен пример как установить кодировку явно.

PHP:
  1. $config = Zend_Registry::get('dbConfig');
  2.  
  3. $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
  4. Zend_Db_Table::setDefaultAdapter($db);
  5. Zend_Registry::getInstance()->set('db', $db);
  6.        
  7. $db->query("set names utf8");
  8. $db->query("set time_zone = '+0:00'");

ZF FAQ: Минимальный bootstrap.php

Posted in Tips And Tricks, ZendFramework on July 27th, 2009 by Yaroslav Vorozhko – Be the first to comment

Сегодня открываю в своем блоге раздел Zend Framework FAQ. Куда соотвественно буду писать различные вопросы-ответы по теме программирования в Zend Framework.

Итак, вопрос:

Каким должен быть минимальный bootstrap.php?

Ответ:

Создайте файл application/Bootstrap.php

и его содержимое как минимум должно быть таким:

PHP:
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3. }

Класс Bootstrap появился с версией 1.8. Поэтому при переходе с 1.7 на 1.8 учтитывайте это.

Авто редирект из http в https в Zend Framework

Posted in Development, PHP, Tips And Tricks, ZendFramework on July 1st, 2009 by Yaroslav Vorozhko – Be the first to comment

Привет,
Следующий Helper решает проблему редиректа из http страници на https.
Скажем надо перейти от http://mysite.com/action/param/ на https://mysite.com/action/param/

PHP:
  1. class My_Helper_SslSwitch extends Zend_Controller_Action_Helper_Abstract
  2.     {
  3.         public function direct()
  4.         {
  5.             if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) {
  6.                 $request    = $this->getRequest();
  7.                 $url        = 'https://'
  8.                             . $_SERVER['HTTP_HOST']
  9.                             . $request->getRequestUri();
  10.                 $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
  11.                 $redirector->gotoUrl($url);
  12.             }
  13.         }
  14.     }

Автор хелпера Matthew Weier O'Phinney

Далее в bootstrap добавляем путь к Helper в include_path
и вызываем его, таким образом мы переводим весь сайт на использование https.

PHP:
  1. Zend_Controller_Action_HelperBroker::addPrefix('My_Helper');
  2. $ssl = new My_Helper_SslSwitch();
  3. $ssl->direct();

Если же вам надо включить SSL только для определенных контроллеров, то вы можете поместить следующий код в preDispath() метод контроллеров.

PHP:
  1. $this->_helper->sslSwith();

В данном случае мы используем объект _helper для создания объекта sslSwith и вызова метода direct().
Note: Метод direct() вызыватеся автоматически для всех Action Helpers.

Проверка существования таблицы в базе данных с ZendFramework

Posted in MySQL, Tips And Tricks, ZendFramework on April 19th, 2009 by Yaroslav Vorozhko – Be the first to comment

Существует несколько способов проверить наличие таблицы в базе данных с помощью zendframework.

Первый и самый простой это использовать функцию listTables из Zend_db, но у этой функции есть ограничение, она получает список таблиц только текущей базы данных.

Например вам надо узнать существует ли таблица my_table в подключении к текущей базе данных:

$db = $this->getAdapter();

$tables = $db->listTables();

if (in_array('my_table', $table)){

//todo something with table

}

listTables() возвращает массив имен всех таблиц в текущей базе данных.

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

Пример:

$db = $this->getAdapter();

$sql = "show tables from any_db like 'my_table' ";

if ( $db->fetchOne($sql) ){

//todo something with table

}

fetchOne() вернет строку с именем таблицы, если таблица будет найдена, если ничего не будет найдено, то будет возвращена пустая строка.

С помощью приема с show tables можно проверять на существование одной и более таблиц, что делает этот прием более универсальным.

ZF Error: Can’t create/write to file

Posted in Tips And Tricks, ZendFramework on February 16th, 2009 by Yaroslav Vorozhko – Be the first to comment

Рассмотрим ситуацию когда вы получаете следующее сообщение об ошибке от ZendFramework.

exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY000]:
General error: 1 Can't create/write to file
'C:\WINDOWS\TEMP\#sql_c48_0.MYI' (Errcode: 13)' in
C:\...\Zend\Db\Statement\Pdo.php:227

Errorcode 13: - это сообщение об ошибке от ОС, что нет прав на запись в каталог или файл.

Если вы получаете это сообщение каждый раз при выполнении SQL, то первое и самое вероятное, проверьте права на чтение/запись во временный каталог установленный в вашем php.ini.
В данном случае C:\WINDOWS\TEMP\ .

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

Надеюсь это вам помогло, если нет, тогда жду комментариев.

Zend_DB Out of memory bug

Posted in MySQL, PHP, Tips And Tricks, ZendFramework on February 10th, 2008 by Yaroslav Vorozhko – 2 Comments

zend_framework_logo

Привет,

Натолкнулся сегодня на один неприятный баг в Zend_DB при работе с "длинными типами данных", которые часто используются для хранения неопределенных по размеру данных в MySQL. Как оказалось, Zend_DB  некорректно работает с типом LONGTEXT И LONGBLOB и решение этой проблемы пока не найденно, но давайте посмотрим подробнее что все-таки можно сделать.

read more »