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

1 нояб. 2011 г.

коварный php5 ...

Цель:  И вот.. .пробил час перехода на зимнее время ... в то время когда на серверах  zoneinfo был успешно обновлен и системы показывали правильное время, php всё равно упрямился и показывал зимнее ...

Дано:  PHP 5.3.5

22 сент. 2011 г.

факир был пьян... статус 200 вместо 404 ...

Цель: Пропуская через сокет nginx'a, а в качестве такого выступает php-fpm, php-сценарий, не зависимо от того, что в сценарии есть:
header("HTTP/1.0 404 Not Found");
возвращается ответ с статусом 200 вместо 404, хотя статусов 301 и 302 это не касается ...
кто же режет 404 СТАТУС?! nginx? php-fpm? or php?

#cat /1.php
<?php
header("HTTP/1.0 404 Not Found");
?> 

#curl -i test.local/1.php
HTTP/1.1 200 OK
Server: nginx/1.0.6
Date: Thu, 22 Sep 2011 10:01:13 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.6

1 сент. 2011 г.

и снова русские буквы в именах файлов ....

Цель: Научить ckfinderпри загрузке файлов на сервер, транслитерации имен.


Дано: Drupal 7transliteration (1.11), ckfinder (2.0.2)

Решение:
Увы, для решения этой задачи пришлось залезть в модуль transliteration ...
И так, лезем в файл: filemanager.config (лежит туть: \sites\all\modules\ckeditor\includes\, ну или где у вас там ckeditor установлен), находим в нем строчку (где та в 70 строках):

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
и дописываем:
transliteration_init();

после,находим файл: /sites/all/modules/transliteration/transliteration.module

8 июл. 2011 г.

Just benchmark. Легкий SQL запрос VS запрос SQL с использованием JOIN

Цель:
Вопрос, что быстрее работает... sql с кучей join'ов или более простые запросы но с дополнительной обработкой сценария на сервере ...

Нужно достать последнюю модификацию файла (таблица ФАЙЛ), находящихся в разных категория (таблица КАТЕГОРИИ), причем категории включают в себя подкатегории, благо второго порядка. Данные связывающие сия безобразия находятся в таблице ЛИНКС.

28 февр. 2011 г.

PHP && FoxPro DBF


Цель: научить зверюгу Пыха читать данные БД хитрого лиса ...
Дано: 
  • OS Window Server 2003  с многочисленными обновлениями, увы, под юниксами решения пока не нашел =(
  • Apache and etc. (all this not necessarily)
  • Базы даных FoxPro, то бишь файлы *.dbf и *.cdx  и 
  • PHP 5.3.5 (хотя версия принципиальной разницы не играет)

3 нояб. 2010 г.

SlidePress и NextGEN Gallery в одной упряжке!


Цель: Учим работать плагин SlidePress с плагином NextGEN Gallery в одной связке для CMS WordPress.

Дано:

Решение:
Плагину SlidePress'у можно скормить xml-формата файлик, опция Director. А у плагина NextGEN Gallery, уже имеется свой генератор xml (/wp-content/plugins/nextgen-gallery/xml/): imagerotator.php

Но вот досада та, его структура не подходит под xml формата SlidePress плагина...

Что делаем? Правильно делаем копию этого файлика и задаем ему то что нужно ;) а если быть точнее SlidePress требует для себя следующую структуру:
<gallery>
 <album description="описание альбома" title="имя альбома">
  <img 
        caption="описание картинки" 
        link="путь куда линковать для просмотра в оригинале" 
        src="путь к вашей картинке" 
        title="заголовок картинки" 
        tn="путь к миниатюрной копии картинки" 
  />
 </album>
</gallery>

если не очень та и хочется вникать и переписывать что то, то качаем вот от седа уже готовый генератор xml списка галереи NextGEN Gallery для нашего плагина SlidePress:[СКАЧАТЬ] и кладем его в папку /wp-content/plugins/nextgen-gallery/xml/ 

Теперь идем в админку сайта, в управление галереями плагина SlidePress, создаем тестовую галерею, указываем в поле "XML Source" -> "Director" и в текстовой строке пишем путь к нашему ранее созданному/скаченному xml генератору: http://panno64.ru/wp-content/plugins/nextgen-gallery/xml/gen_xml_sp.php?gid=5

где gid=5, это идентификатор галереи NextGEN Gallery
... можно и без него, но тогда картинок будет много.

вот и всё... =)

12 февр. 2010 г.

php + Firebird connect remote host

Цель: Заставить работать с удаленной БД ...

Дано:
- Windoвьсь
- PHP 5.2.12
+ штатная библиотека расширения на Firebird/InterBase, gds32.dll
Version language : Английский (США)
CompanyName : Inprise Corporation
FileDescription : InterBase Server
FileVersion : WI-V6.0.1.0
InternalName : IBSERVER60
LegalCopyright : Copyright (c) 1999 Inprise Corporation
ProductName : InterBase Server
ProductVersion : 6.0.1.0


Решение:

$dbh = ibase_connect("RemoteHostName:C:/dir/to/db/db_name.gdb", "login", "password");


запускаем и имеем следующее:
Warning:  ibase_connect() [function.ibase-connect]: Unable to complete network request to host "RemoteHostName". Failed to locate host machine. Undefined service gds_db/tcp.  in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test.php on line 2


что делать?!
косяк в gds32.dll ... онная уже старенькая, поношенная, а почему её не обновляют вопрос второстепенный ...
Если уже имеется установленный на каком нить хосте свеженький Firebird (в моем случае v.1.5) дергаем у него дллку fbclient.dll и тащим к себе. Переименовываем на gds32.dll и заменяем прежнию, старенькую, нашей.
Рестартуем сервер и радуемся жизни.

Ну а у кого нет установленого Firebird, тащим его (5-7 метров), ставим и дергаем то что нужно, или как вариант лезем на мамонт поисковик по фтп и шарим на тему fbclient.dll.


Некоторые данные о fbclient.dll
FileDescription : Firebird SQL Server
FileVersion : WI-V1.5.3.4870
ProductVersion : 1.5.3.4870
SpecialBuild : Firebird 1.5




Примечание:
На момент написания заметки на офф сайте имеется Firebird 2.1.3 (http://www.firebirdsql.org/)

28 янв. 2010 г.

IE строгий дядько, порой слишком ...

Цель: IE(7,8): jquery .ajax => error: parseerror
Дано: jquery 1.3.2 (вполне возможно как и младшие так и старшие версии)

Решение:
Фишка не в самом jquery, а в излюбленным всеми IE. Не впервой ругаюсь, все тестыф под мозиллой и в самый последний момент под ИЕ, и как результат сплошные неожиданности ...

есть кусок:
        $.ajax({
type: "POST",
url: "/index.php",
data: dataString,
cache: false,
dataType: "text",
error: function(msg, textStatus, errorThrown)
{
alert("Error: " + msg +"\r\nStatus: " + textStatus);
},
success: function(msg, status)
{
alert("MSG: "+msg);
}
});


По части url: "/index.php"
содержание index.php:
  
header("Content-Type: text/html");
print "True";
exit;


Опера, мозила, софари, хром съели на ура, результат всплывающее окно с текстом True ...

IE полон неожиданностей с визгом закричал "Error: Status:parseerror"
пляски с типом (dataType) ни к чему не приводили, снифером (вирешарком) то же всё чисто ... к примеру для типа json => ['True']

Чего не хватало?!
всё проще оказалось ... пишем по части url: "/index.php"

header("Content-Type: text/html; charset=utf-8");
print "True";
exit;


вуаля.


еще один момент не в пользу ИЕ:

.img
<style>
{
background-image:url(images.gif);
background-repeat:no-repeat;
padding-left:20px;
}
</style>
<span class='img'></span>



Опера, мозила, софари, хром: видим то что и ожидаем
IE: видим то что и ожидаем от IE, а собственно НИЧЕГО

костыль или нет, не знаю, честно копать некогда ... но работает

<span class='img'>&nbsp;</span>


вполне возможно что, сработает как
<style>
{
background-image:url(images.gif);
background-repeat:no-repeat;
padding-left:20px;
width: 20px;
}
</style>

24 мар. 2009 г.

PHP. SSL HTTP средствами socket'а

Цель: Отправить данные и получить ответ по SSL соединению c авторизацией на сервере из PHP скрипта.

Дано: PHP 4.4.9, OpenSSL 0.9.8j, Apache 2.0.63


Решение:

Сначала массив сведений данных для коннекта по SSL HTTPS:
$SSL  = array ( 'Host'=>'hostssl.domen.local', # URI хоста сервера
'Port'=> 443, # Порт хоста сервера
'Path' => '/cgi-bin/', # путь к скриптам
'User' => 'login', # логин для авторизации
'Pass' => 'password' # пароль для авторизации
);



Вызываем функцию для соединения:
 $options = array (  'var1' => 'value1',
'var2' => 'value2',
'var3' => 'value3'
);
$script = 'script.cgi'; # имя скрипта на стороне сервера
$result = SendDataHTTPS($script, $options);
print $result;



Теперь сама функция:
 function SendDataHTTPS($script, $options) {
if (!is_array($options)) return false;

$option='';
foreach ($options as $key=>$row) {
$option .= ($option ? "&" : "?").rawurlencode($key)."=".rawurlencode($row);
}

$sock = fsockopen("ssl://".$SSL['Host'], $SSL['Port'], $errno, $errstr, 15);
if(!$sock) {user_error("$errstr ($errno)\n", E_USER_ERROR); return false;}

fwrite($sock,"GET ".$SSL['Path'].$script.$option." HTTP/1.0\r\n");
fwrite($sock,"Host: ".$SSL['Host']."\r\n");
fwrite($sock,"Content-type: text/plain\r\n");
fwrite($sock,"Authorization: Basic ".base64_encode($SSL['User'].":".$SSL['Pass'])."\r\n");
fwrite($sock,"Connection: close\r\n\r\n");

$headers = '';
while($str = trim(fgets($sock,4096)))
$headers .= "$str\n";

$body = '';
while(!feof($sock))
$body .= @fgets($sock,4096);

fclose($sock);

return $body;
}



Примечание:
Стоит заметить, данное решение средствами GET запроса,
для POST запроса немного подправляется и юзается не менее успешно.

5 мар. 2009 г.

Менее востребованные регуляки (Regexp)

IP адрес
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b


MAC адрес
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$


Имя домена
^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$


Число с плавающей точкой
[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?


Римское число
^(?i:(?=[MDCLXVI])((M{0,3})((C[DM])|(D?C{0,3}))?((X[LC])|(L?XX{0,2})|L)?((I[VX])|(V?(II{0,2}))|V)?))$


Дата формата dd-MM-yyyy
(0[1-9]|[12][0-9]|3[01])([- /.])(0[1-9]|1[012])\2(19|20)\d\d

10 февр. 2009 г.

Аторизация силами Apacha и MySQL

Цель: Произвести авторизацию силами Apache и MySQL.
Дано: Apache/2.2.6, apache-mod_auth_mysql-3.0.0, PHP 4.4.1, mysqld 5.0.45

Решения:
На изучении данного момента решения данной задачи рисуется два пути.

Первый из них заключается если нет возможности поставить дополнительный модуль apache-mod_auth_mysql к Апачу , к примеру в случае хостинга у провайдера) тогда нам поможет скриптик Симдянова И.В. "Система авторизации HTTP-Basic авторизации". О нём подробно расписано всё по данной ссылке http://www.softtime.ru/info/authorization.php.

Второй путь, владельцу сервера хостинга, дополнительно поставить модуль apache-mod_auth_mysql, благо через urpmi в Mandrive вытянулось и успешно установилось. К слову, Apache после установки модуля автоматом ребутнулся, если не заметили данного обстоятельства, не забудьте это сделать вручную.

Далее проверяем наличие модуля в конфигах апача
# grep mod_auth_mysql /etc/httpd/conf/httpd.conf
LoadModule
mysql_auth_module extramodules/mod_auth_mysql.so


Если нет такого результат, проверим
#ls /etc/httpd/modules.d/ grep mod_auth_mysql
xx_mod_auth_mysql.conf


далее идем в каталог хоста в котором нужно осуществить авторизацию, к примеру
#cd /var/www/hosts/host1.local/www/test


создадим файл .htaccess
#touch .htaccess


правим его, каму как удобней, добавив строки и не забыв заменить значение некоторых из них:
AuthName "Enter login and password"
AuthType Basic
AuthMYSQLAuthoritative on
AuthMySQLHost localhost
AuthMySQLDB DB_Name
AuthMySQLUser User_Name
AuthMySQLPassword User_Password
AuthMySQLUserTable Table_Users
AuthMySQLNameField FildNameUser
AuthMySQLPasswordField FildNamePassword
AuthMySQLPwEncryption none

Require valid-user


localhost, DB_Name, User_Name, User_Password – параметры подключения к БД,
Table_Users - соответствует названию таблицы где лежат логины и пароли к ним,
FildNameUser – название поля логинов,
FildNamePassword - название поля паролей.

Стоит отнестись с вниманием к следующему параметру AuthMySQLPwEncryption, в данном случае пароли в БД лежат в открытом виде (не самый лучший способ, знаю, как тестовая заведена была) соответственно стоял параметр none, в случае если пароли в хэше MD5, тогда так и указываем: AuthMySQLPwEncryption md5.
Список поддерживаемых хэшей данного параметра: crypt, scrambled, md5, aes, sha1.

Вот и всё, осталось обнавить страницу в Вашем браузере и протестить. =)

Описания параметров для данного модуля можно посмотреть тут:
http://modauthmysql.sourceforge.net/CONFIGURE


После успешной авторизации, пользователь и пароль передается в глобальной переменной $_SERVER.

Создадим в той же папке index.php, добавив строки
Ужасно секретная страница!
Вы тут как пользуватель
<?
print $_SERVER['PHP_AUTH_USER'];
?>


Примечание: Остался открытым вопрос, как после успешной авторизации прервать сессию пользователя по требованию клиента …