Архив метки: php

Работа с MSSQL из PHP, Debian 7

pbgДовольно долго искал решение, как подключиться и работать с MSSQL из PHP под Linux. Рассматривал и подключение odbc и ado. Однако заработало только с FreeDTS.  Вот последовательность действий, «чтоб заработало».

1.Устанавливаем FreeDTS

apt-get install libsybdb5 freetds-common php5-sybase
apt-get install freetds-bin

2.Настроим /etc/freetds/freetds.conf

[global]
host = где_mssql_сервер
port = 1433
client charset = utf8
tds version = 8.0
text size = 20971520

3.Настроим /etc/php5/apache2/php.ini:

mssql.textlimit = 20971520
mssql.textsize = 20971520

4. Перезапускаем на всякий случай apache

5. Вот пример кода PHP для работы с MSSQL:

$link = mssql_connect('10.80.16.34', 'login', 'pass');
	if(!$link) {
		echo'Could not connect';
		die('Could not connect: ' . mssql_error());
	}
	echo'Successful connection';
        mssql_select_db('master', $link);

$version = mssql_query('SELECT @@VERSION');
$row = mssql_fetch_array($version);

	mssql_close($link);

Обьявление «пустого class» в PHP

После перехода на PHP 5.5.31, оный стал неожиданно ругаться на конструкции вида:

	$responce->page = $page;

т.е.  использование «класса» без объявления оного,  предупреждением:

Warning: Creating default object from empty value

Чтобы этого не допускать, пришлось перелопатить код,  исправив его на вид:

        $responce=new stdClass();
	$responce->page = $page;

Сортировка в MySQL кириллицы utf8-general-ci

загруженное (1)Дано: MySQL 5.1.72, таблицы созданные в utf8-general-ci, установка соединения вызывается следующей функцией:

function connect($host,$name,$pass,$base){
 $this->idsqlconnection=new mysqli($host,$name,$pass,$base);
 if (mysqli_connect_errno()) {
 $serr=mysqli_connect_error();
 die("Error connect to Mysql or select base: $serr");
 } 
 $result = mysqli_query($this->idsqlconnection,"SET NAMES utf8_general_ci"); 
 mysqli_set_charset($this->idsqlconnection, "utf8_general_ci");
 
 }

И хоть ты тресни, запрос вида:

$SQL = "SELECT * FROM places WHERE orgid='$orgid' AND active=1 ORDER BY name";
 $result = $sqlcn->ExecuteSQL( $SQL ) or die("Не могу выбрать список помещений!".mysqli_error($sqlcn->idsqlconnection));

Сортировался по непонятно каким критериям. Потеряв на поиск причины  несколько часов, перепробовав кучу «рецептов», пришлось заворачивать сортировку запросов в команду binary(), т.е. вот так:

$SQL = "SELECT * FROM places WHERE orgid='$orgid' AND active=1 ORDER BY binary(name)";

Костыль конечно.. И сортирует различая большие и маленькие буквы. Но таки лучше так чем никак. Ищу лучшее решение.

Получение данных из Active Directory посредством PHP

Сам за себя лучше всего расскажет мой кусок кода. Все сдобрено максимально большим количеством комментариев. По формату построения LDAP запросов полезно почитать вот этот мануал. Ничего толковее к сожалению найти не смог.

Вот результат:

Снимок-12Вот код:

$ldap_user='gribov.p';
$ldap_pass='ргшкуцудцс';
$filter = "(telephonenumber=*9657400222*)";   // устанавливаем фильтр выборки из AD
//(company=*Русский Север*)
$attr=array("displayname","useruid2","title","telephonenumber","department","mail","jpegphoto","homephone"); // устанавливаем какие поля нам нужно получить из AD

// устанавливаем соединение с ldap сервером
$ldap_con = ldap_connect($cfg->ldap) or die("Could not connect to LDAP server.");
echo "-Соеденяюсь с LDAP сервером: OK</br>";

// Устанавливаем флажки протокола
ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3);  // AD Windows 2003 и выше
ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0);         //Определяет, следовать ли автоматически рефералам, возвращенным сервером LDAP. Зачем нужно - не понятно

// авторизуемся в AD
$dn="$cfg->domain1\\$ldap_user";
$ldapbind = ldap_bind($ldap_con, $dn, $ldap_pass) or die("LDAP bind failed...");
echo "-Авторизуюсь на LDAP сервере: OK</br>";

// Пытаемся чтото получить из AD
$base_dn = "DC=$cfg->domain1, DC=$cfg->domain2";  
$search=ldap_search($ldap_con, $base_dn, $filter,$attr);  // Ищем эти поля, получаем ссылку на результат
$number_returned = ldap_count_entries($ldap_con,$search); // Получаем количество записей
echo "-Получаю записи из AD: $number_returned</br>";
$info = ldap_get_entries($ldap_con, $search);             // получаем результат в переменную $info

// дальше парсим полученный массив
// Результирующий массив с пользователями из AD
// "displayname","useruid2","title","telephonenumber","department","mail","jpegphoto","homephone"
  for ($i=0; $i<$info["count"]; $i++) {             
        $res=$info[$i];
        $m_name=$res["displayname"];
        echo "Имя: $m_name[0]</br>";
        $m_tab=$res["useruid2"];
        echo "Табельный: $m_tab[0]</br>";        
        $m_title=$res["title"];
        echo "Должность: $m_title[0]</br>";        
        $m_tel=$res["telephonenumber"];
        echo "Телефон: $m_tel[0]</br>";        
        $m_dep=$res["department"];
        echo "Департамент: $m_dep[0]</br>";        
        $m_mail=$res["mail"];
        echo "Email: $m_mail[0]</br>";        
        $m_photo=$res["jpegphoto"];
        $m_hometel=$res["homephone"];
        echo "Дом.тел: $m_hometel[0]</br>";               
        file_put_contents('img.jpg',$m_photo[0]);
        echo "<img src='img.jpg'>";                       
         echo "<hr>";       

    };

Jquery form или отслыка POST без обновления страницы

Для реализации сего необходимо подключить плагин jquery.form к своему проекту. Как использовать? Вот пример (взято из проекта ГдеМои):

Оформление формы:

        <form id="myForm" class="well"  ENCTYPE="multipart/form-data" action="controller/saveimei.php" method="post" name="myForm" target="_self">
            <label>Название маячка</label>
            <input name="dvname" id="dvname" type="text" class="span12" placeholder="Как будем его называть?">
            <label>Его IMEI</label>
            <input name="imeicode" id="imeicode" type="text" class="span12" placeholder="IMEI код устройства">            
            <p align="center">
            <button type="submit" class="btn">Сохранить</button>
            </p>
        </form>

Читать далее Jquery form или отслыка POST без обновления страницы