Показаны сообщения с ярлыком php. Показать все сообщения
Показаны сообщения с ярлыком php. Показать все сообщения

2014-09-16

Работа с Azure SQL из PHP в Ubuntu

Приведу пример, как это делается в Ubuntu. Установим нужные пакеты

sudo apt-get install php5-cli php5-sybase freetds*

Изменим файл концигурации FreeTDS /etc/freetds/freetds.conf, добавив секцию

[xxxserver.database.windows.net]
    host = xxxserver.database.windows.net
    port = 1433
    tds version = 8.0

Короткий кусочек кода на PHP5

<?php
$server = 'xxxserver';
$dbname = 'xxxdbname';
$user = "xxxuser@{$server}";
$passwd = 'xxxpassword';

$p = new PDO("dblib:host={$server}.database.windows.net;dbname={$dbname}", $user, $passwd);
foreach($p->query('SELECT col FROM table') as $row){
        echo $row['term'];
}
?>

Это очень актуально для Yii-фреймворка.

2013-07-22

Использование оператора for в Twig: итератор

Некоторое время пользуюсь шаблонизатором Twig, где циклы в шаблонах задаются практически только с использованием оператора for:

{% for item in some_array %}
 {{ item }}
{% endfor %}

При обходе массива (что и делается в большинстве случаев) вопросов не возникало. Но тут приспичило мне сделать цикл типа while. То есть подразумевалось нечто вроде

{% while item = some_array.next() %}
 {{ item }}
{% endwhile %}
однако, while не реализован в Twig.

Недолгий гуглёж привёл меня (внезапно!) на страницу документации Twig, где черным по английскому написано: "A sequence can be either an array or an object implementing the Traversable interface." Итак, решается задачка таким образом: создаётся объект, имплементирующий методы стандартного PHP-интерфейса Iterator, подаётся в оператор for и всё работает. Как-то так:


class SomeItems implements Iterator{
 private $position = 0;
 private $items = [];

 public function add($item){
  $this->items[] = $item;
 }

 public function current() {
  return $this->items[$this->position];
 }
 public function key() {
  return $this->position;
 }
 public function valid() {
  return isset($this->items[$this->position]);
 }
 public function rewind() {
  $this->position = 0;
 }
 public function next(){
  ++$this->position;
 }
}

$items = new SomeItems();
$items->add('One');
$items->add('Two');
$twig->display('page.twig', ['items'=>$items]);

На странице page.twig используем обычную конструкцию:

{% for item in items %}
 {{ item }}
{% endfor %}
В результате на странице выведены слова "One" и "Two".

2012-02-02

PHP, кодировки и строковые функции


Время от времени возникает у разработчиков проблема - не желают работать стандартные функции strtolower, strtoupper, ucfirst. Особенно это актуально для сайтов, в которых есть файлы нескольких видов кодировок. Видел я решение самописное, вот такое:
strtr(
    $s,
    'йцукенгшщзхъфывапролджэячсмитьбюё',
    'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ'
);
strtr(
    $s,
    'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ',
    'йцукенгшщзхъфывапролджэячсмитьбюё'
);
strtr(
    substr($s,0,1),
    'йцукенгшщзхъфывапролджэячсмитьбюё',
    'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ'
).substr($s,1) ;

При использовании кодировки UTF-8 начинают сбоить и такие методы. С радостью обнаружил готовые функции, предназначенные для работы с многобайтными кодировками. Вы легко это найдете, но пусть хорошей информации будет побольше.
mb_convert_case($str, $mode [, $encoding ]);
$str - строка для обработки.
$mode может быть MB_CASE_UPPER (верхний регистр), MB_CASE_LOWER (нижний регистр) или MB_CASE_TITLE (первая буква в верхнем регистре).
$encoding может быть, например 'UTF-8'. Если не указывать, то вместо него будет использовано значение внутренней кодировки.

Есть укороченные варианты для MB_CASE_UPPER и MB_CASE_LOWER:
mb_strtolower($str [, $encoding]);
mb_strtoupper($str [, $encoding]);

P.S. Прошу не судить строго за бояны.

2011-04-19

PHP и временные зоны

Заметка для себя, чтобы не забыть.
Используя PHP столкнулся с такой закавыкой: функция date() выдает время по гринвичу. Вероятно, на сервере в настройках PHP не прописана временная зона. Раньше всегда было настроено на место размещения сервера, т.е. как правило, Москва, а тут - нет.
В результате выдает время на 4 часа меньше, чем надо. Решается использованием стандартной функции с параметром:
date_default_timezone_set('Europe/Moscow');
Полный список временных зон тут.

2008-11-10

О Ruby и холиварах

Решил попробовать изучить Ruby, ну и рельсы заодно. Запасся литературой и приступил. Понравилось, интересно, доступно для понимания.
В ходе поисков информации по этой теме в сети наталкивался на многочисленные холивары между разработчиками на python, php и ruby. Очень это угнетает. Каждый приводит аргументы в пользу своего болота и творчески, с выдумкой обливает грязью чужое. Я прямо на части рвался, не мог решить, чья же сторона мне милее.
PHP использую давно, и привычен вроде как, и удобен, шишки от привычных граблей уже превратились в мозоли. Распространение на хостингах - практически 100%. Неплохо. Десктопное приложение жаль не написать толком.
Python распространен в Linux, и Ubuntu крепко держится за него, всякие скрипты, программы, плагины на питоне очень часто встречаются. Даже для Nokia N810 и других таблеток можно приложения писать - ну не красота ли? Ну и веб-фреймворк вроде как свой есть - Django, недавно был релиз 1 версии.
А Ruby сравнительно недавно вырос. Но у него есть свой бульдозер - Rails. Прост для изучения, чистое ООП, даже работу с БД и ту заточили под него. Сам не знаю, почему я решил за него взяться, вроде к ООП особо никогда не тяготел.
Впрочем, никто же не мешает просто НЕ ВЫБИРАТЬ, а брать то, что удобнее и/или интереснее в данный момент? Кто вообще придумал, что надо выбрать какой-то один язык и отстаивать его, пока пуп не развяжется? PHP рулит. Python рулит. Ruby рулит.
Сумбурно получилось, но что поделаешь.