Архив

Публикации с меткой ‘php’

Импорт mysql дампа средствами php

26 Апрель 2013 Нет комментариев

В моем примере база была InnoDB, поэтому пример привожу с ее фишками:

//читаем файл с дампом
$str = file_get_contents("dump.sql");

//если есть CREATE TABLE, тогда создаем таблицы
if( preg_match_all("/\-\- Table.*?\s\-\-\s(.*?)\-\-/s", $str, $p) ) {
$er = false;
foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

//если есть инсерты, инсертим ;)
if(preg_match_all("/\-\- Dumping data.*?\s\-\-\s(.*?)\-\-/s", $str, $p)) <span style="font-size: 13px;">{</span>

foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

//создаем связи между таблицами
if(preg_match_all("/\-\- Constraints.*?\s\-\-\s(.*?)\-\-/s", $str, $p)) <span style="font-size: 13px;">{</span>

foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

if( $er !== false ) {
echo '<strong style="color: green;">'.gettext("Дамп базы данных установлен.").'</strong>';
}
else {
echo '<strong style="color: green;">'.gettext("Дамп базы данных установлен с ошибками.").'</strong>';
}
Categories: Новости Tags: ,

велосипед с квадратными колесами или делаем свой шаблонизатор

Наверно любой веб-программист проходит через изобретение своего собственного “велосипеда”, часто который получается с квадратными колесами. Много девелоперов стряпают свои cms, многие к ним разрабатывают свои шаблонизаторы – я не исключение.
CMS своя у меня уже есть, в качестве шаблонизатора юзал smarty, с xlst как-то вообще не сраслось из-за показавшейся сложности. Smarty юзал очень долго, но всегда бесило в нем то, что не хватало каких-то в шаблоне функций, дописывать плагины запарно на каждую мелкую функцию php, так же бесило вставлять {literal} в javascript – очень отягощает отладку, когда забываешь их вставить.

От шаблонизатора хотелось:

  • использовать в шаблоне чистый php <?php echo $this -> peremennay; ?>
  • не иметь никаких там кеширований, т к за это у меня отвечает cms
  • не иметь ничего лишнего, кроме передачи переменных в шаблон и вывод шаблона браузеру
  • имена функций передачи данных и отображения данных должны совпадать с именами в Smarty (дабы не лопатить кучу кода, да и дело привычки).
  • так же нужна была возможность подгрузки каких-то своих плагинов, для решения задач именно вывода данных.
  • возможность инклудов шаблонов внутри шаблона (include_tpl)

В итоге за пару часов накидал свой шаблонизатор:

  • передача переменных в шаблон assign( $varName, $varValue = null ) – аналогично как в смарти, можно передавать как 1 переменную, так и массив переменных
  • clear_assign( $varName ) – стереть переменную
  • clear_assign_all( ) – стереть все переменные
  • get( $varName ) – получить значение переменной
  • fetch( $template_name ) – получить результат работы шаблона
  • display( $template_name ) – вывести на экран шаблон
  • include_tpl( $template_name ) – подключить внутри шаблона другой шаблон

При вызове шаблонизатора конструктору передается путь к папке с шаблонами и разделитель директорий, по умолчанию ‘/':
$template = new Template( $path );
Путь к папке с шаблонами можно изменить, передав новое значение $template -> template_dir = ‘new path';

Плагины складываются в папку plugins, имя файла с плагином должно иметь имя вызываемой функции. Например если в шаблоне вызываем <?php echo $this -> return_ext( $var ); ?>, тогда в папке с плагинами должен лежать файл return_ext.php, с функцией function template_function_return_ext($string). Плагины не загружаются вместе с шаблонизатором, а подгружаются только в случае вызова функции в шаблоне.

Пример использование:

test.php:

<?php

$template = new Template( ‘/path’ );

$template -> assign( ‘word’, ‘Hello world’ );

$template -> display( ‘first_template.php’ );

?>

first_template.php:

<strong><?php echo $this -> word;?></strong>

Результат, в браузер выведется: Hello world

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

Categories: Новости Tags:

Многоязычность в проектах на php средствами gettext

10 Сентябрь 2010 Нет комментариев

Давно хотел написать про то, как использовать многоязычность с помощью gettext, наконец-то дошли руки, сам юзаю эту технологию наверно года 4. Материала по нему в сети полно, но на практике не всегда это дело работает сразу, причина находится очень долго и гугл в этом не всегда помощник. Опишу всю технологию с нуля и со всеми возможными припонами, с которыми столкнулся я.
При написании своей CMS мне понадобилось, чтобы интерфейс можно было переводить на любые языки. По старинке, текст в скриптах выносили в переменные, которые хранились в отдельном файле, под нужный язык подключали файл с нужным языком – не айс.
Библиотека Gettext намного облегчает задачу, можно в скриптах писать текст на привычном вам языке, но вот в таком виде: echo gettext(“Привет!”);
Так же можно делать так: _(“Привет!”);, но как показала практика, на некоторых серверах такая конструкция не прокатила, и еще не всегда проходит, когда текст в одинарных кавычках (‘), поэтому лучше всегда использовать echo gettext(“Привет”);
После того, как в вашей программе весь текст выводится в таком виде, вам потребуется этот текст как то передать переводчику. Для этого качаем бесплатную программу poedit. Есть версии под все распространенные ОСи.
Ставим прогу, запускаем, жмем Файл -> Создать каталог
В закладке Информация о проекте заполняем все поля, кроме Формы множественного числа, закладке Пути вставляем путь до своего проекта, жмем ок. Далее, меню Каталог -> Обновить из исходного кода, программа просканирует все файлы вашего проекта на наличие gettext, и выведет его в две колонки, колонка исходная и колонка перевода. На этом этапе может возникнуть ошибка, в которой будет что то про кодировку UTF-8, если у вас скрипты в этой кодировке, тогда идем в меню Файл – Установки – Парсер – PHP – Править – Поле: кодировка исходного кода меняем на –from-code=UTF-8, сохраняем и повторяем процедуру с обновлением каталога. После этого у вас сформировался файл с расширением .po – вот этот файл с программкой poedit передаете переводчику, он переводит и возвращает вам обратно, при пересохранении файла создается файл с расширением .mo – это бинарник, который и будет налету переводит наш проект на другой язык.
И так, в папке своего проекта создаем папку locale, допустим нам надо проект перевести с русского на английский, в папке locale создаем подпапку en, в ней LC_MESSAGES, куда кладем файлик с расширением .mo, пусть он будет messages.mo, имя файла важно для последующего подключения.
В начале своих скриптов, прописываем код:

//$_SESSION['lang'] - пусть в данной переменной передается

//выбранный язык ru или en
$charsets = array( 'ru' => 'ru_RU', 'en' => 'en_US' );
$locale = $charsets[$_SESSION['lang']];
$domain = 'messages';  //значение этой переменной должно совпадать с именем .mo файла
$locale_path = dirname(__FILE__).'/locale'; //путь к папке locale, должен быть полным, в моем случае dirname(__FILE__)
putenv('LC_ALL='.$locale);
putenv('LANG='.$locale);
putenv('LANGUAGE='.$locale);

if  (!setlocale (LC_ALL, $locale.'.utf8', $locale.'.utf-8',  $locale.'.UTF8', $locale.'.UTF-8', $_SESSION['lang'].'.utf-8',  $_SESSION['lang'].'.UTF-8', $_SESSION['lang'])) {
// Set current locale
setlocale(LC_MESSAGES, '');
}
bindtextdomain($domain, $locale_path);
bind_textdomain_codeset($domain, 'UTF-8'); //в случае если у вас utf-8
textdomain($domain);

И это все, далее текст echo gettext(“Привет!”); при значении $_SESSION['lang']=’en’ должен выводиться на английском Hello!
Если это не произошло…
1)проверяем, не включен ли на хостинге безопасный режим safe_mode, включен – вырубаем
если не помогло, то
2) пробуем заменить все LC_ALL, на LC_MESSAGES,
если не помогло, то
3) нужно убедиться, что на сервере стоит нужная локаль, если есть доступ к серверу по шелу, тогда вам поможет посмотреть список всех локалей команда locale -a, для английского языка это en_US.utf8, если локали нет, ее надо поставить, тут уже в гугл или саппорт.
если не помогло, то
4) возможно папку en надо переименовать в имя локали, вот тут надо перебрать все комбинации: en_US.utf8, en_US, en_US.utf-8, en_US.UTF8, en_US.UTF-8
С другими ситуациями я уже не сталкивался, поэтому если и это не сработало, придется вам “раскуривать” самостоятельно.

Categories: Новости Tags: ,

установка zend studio 5.5 в windows 7

25 Июнь 2010 5 comments

Какая-то сволочь наградила меня сегодня, уже точнее вчера, вирусом, компьютерным. Года 3 ничего не ловил, а тут капец, ни один сайт с упоминанием антивируса не открывается, гугл тоже лежит, но какие -то сайт открываются пучком. При трассировке заблокированных сайтов трассировка даже с компа не уходит. Лечение касперычем, нодом и на сладкое доктор вебом ни к чему не привело, поубивало с 20 паразитов, а сайты как были залочены, так и остались. В добавок нашел в винде файл кейлогера, хех, который отправлял с моего компа все что я пишу. В общем винду хп снес, поставил windows 7, лицензия, был у меня диск. Ставлю свой любимый zend studio 5.5.1 и тут на тебе, после загрузочной заставки тишина. Самое интересное, что под той же самой семеркой на ноуте, зенд работает превосходно. После гугления, оказалось не я один такой, на форуме зенда есть даже рецепт как с переустановкой java можно решить траблу, но она не помогла, зенд завелся, но лагал безбожно – в топку. Но нашел вот тут: http://amxm.ru/?p=54 рецепт, и так как поставить zend studio 5.5.1 в windows 7:

  1. качаем и ставим zend studio 7 – в моем случае 7.2
  2. ставим любимый zend studio 5.5.1
  3. из папки с семеркой копируем папку jre и вставляем ее в папку с 5.5.1
  4. наслаждаемся работой зенда 5.5.1, семерку можно снести
Categories: Новости Tags: ,

Функция постраничного вывода – пагинатор

20 Сентябрь 2009 1 комментарий

Копался тут в своих библиотеках и нарыл свою первую функцию!!! Функция постраничного разбиения – нынче в народе зовется “пагинатор” (paginator). Написал я сее творение аж в 2002 году, когда учил php еще по манам php3. Далее этот код перекачивал в мою CMS и стал там использоваться направо и налево, естественно мутируя под ЧПУ и требования сеошников – отслеживать чтобы при постраничном выводе не было дублей страниц.

Функция возвращает строку вида:

<< < 1 2 3 4 5 > >>

, где:

  • << – переход к самому первому блоку
  • < – переход к предыдущему блоку
  • > – переход к следующему блоку
  • >> – переход к последнему блоку

на входе имеет 4 параметра:

  • integer $total – общее количество страниц ( ceil(общее кол-во. записей / кол-во. записей на странице) )
  • integer $currentpage – номер текущей страницы ( отсчет идет от 0 )
  • string $link – какую ссылку вставлять в пагинаторе (пример: page.php?id=3&page = )
  • integer $block – по сколько страниц делать в блоке, в данном примере 5

Далее собственно сам код, он не претендует на оскара…

/**
* Создает постраничное разбиение
* @author PHPLancer 2002
*
* @param integer $total
* @param integer $currentpage
* @param string $link
* @param integer $block
* @return string
*/
function pageListing($total, $currentpage, $link, $block)
{
$j = 0;
$s = "";
$array = array();
for($i = 0, $max = ceil($total/$block); $i <= $max; $i++)  {
$array[$i] = $j;
$j += $block;
}

for($i = 0, $max = sizeof($array); $i < $max; $i++)   if($currentpage >= $array[$i]  &amp;amp;amp;&amp;amp;amp; $currentpage < $array[$i]+$block) break;

if($i > 0) $s .= "<a href=\"".$link.$array[0]."\"> << </a> <a href=\"".$link.($array[$i-1]+$block-1)."\" > < </a> \n";

$z  = (($array[$i]+$block) > $total) ?  $total : $array[$i+1];

for($j=$array[$i];$j<$z;$j++)  $s .= ($currentpage==$j) ?  "<span>".($j+1)." </span> " :  "<a href=\"".$link.$j."\">".($j+1)."</a>  \n";

$max = sizeof($array);

if($i<($max-2)) $s .= "<a href=\"".$link.$array[$i+1]."\" > >  </a> <a href=\"".$link.$array[$max-2]."\" > >> </a> \n";
return $s;
}
Categories: Новости Tags: