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

понедельник, 2 мая 2011 г.

php. Работа с БД

Работа с БД



Стандартная библиотека MySQL

Кодировка

когда вместо русских букв отображаются ????? ?? ????????, может помочь это:

mysql_query( "SET character_set_client = cp1251;" );
mysql_query( "SET character_set_connection = cp1251;" );
mysql_query( "SET character_set_results = cp1251;" );

ставиться сразу после подключения к БД.


PDO

Класс для унифицированной работы с базами данных.
http://ru2.php.net/pdo

Создать курсор БД

$cursor = new PDO( sprintf( "mysql:host=%s;dbname=%s",
    Config::$dbHost, Config::$dbName),
    Config::$dbUser, Config::$dbPass);

foreach ($cursor->query("select 1") as $row){
    print_r( $row );
}
Параметры соединения указываеются четвёртым аргументом:
$dbh = new PDO($dbtype.':host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass, array(PDO::ATTR_PERSISTENT => true));

Выполнение запросов

Для выполнения запросов есть два метода: prepare и query

            $q = $this->db->prepare( "
insert into advert ( advert_nm, advert_text, homepage, group_id )
values (:title, :text, :homepage, :groupId )
" );
            $q->bindParam(':title', $_POST["adv_title"], PDO::PARAM_STR, 255 ); # есть ещё PDO::PARAM_INT
            $q->bindParam(':text', $_POST["adv_text"], PDO::PARAM_STR, 1024 );
            $q->bindParam(':homepage', $_POST["home_page"], PDO::PARAM_STR, 255 );
            $q->bindValue(':groupId', 1, PDO::PARAM_INT );
            $q->execute();  # после выполнения select можно получить данные через $q->fetch(), fetchall(), fetchObject(), fetchColumn()
                                    ## после выполнения insert -> $this->db->lastInsertId();
            $a = $q->errorInfo();
            if ($a[0]=="00000"){
                header( "Location: /do/" );
            }
Если нужно выполнить несколько запросов подряд, то могут возникнуть запарки: на некоторых серверах PDO может иметь только одно подготовленное выражение.
Прежде чем создавать очередной запрос, нужно удалить (unset) старое подготовленное выражение.

fetchObject

fetchObject возвращает объект типа stdClass. Чтобы получить данные из него, надо обращаться с ним как с объектом:
$res = $q->fetchObject();
print $res->column_nm;

dbSimple

Для начала

http://dklab.ru/lib/DbSimple/
dbSimple не обновлялся с 2006(?) года.
В PHP5 появился класс PDO для работы с БД.

Интерфейс библиотеки (кратко)

Полное описание интерфейса см. в подробной документации.

mixed connect(string $dsn) Соединение с указанной СУБД, используя DSN. mixed select(string $query [,$arg1...]) Выборка двумерного массива (список строк). hash selectRow(string $query [,$arg1...]) Выборка однострочного результата запроса (одна строка). array selectCol(string $query [,$arg1...]) Выборка одноколоночного результата запроса (один столбец). scalar selectCell(string $query [,$arg1...]) Выборка скалярного результата запроса (одна ячейка). mixed selectPage(int &$total, string $query [,$arg1...) Выборка ограниченного двумерного массива с занесением общего числа записей в переменную. mixed query(string $query [,$arg1...]) Вызов не-SELECT запроса; для автоинкрементных полей в INSERT-запросах возвращает ID вставленной записи. mixed transaction([mixed $parameters]) Запускает новую транзакцию. mixed commit() / mixed rollback() Подтверждает/отменяет текущую транзакцию.

воскресенье, 24 апреля 2011 г.

php. Типы данных

Типы данных

print gettype( $var ); // определить тип данных

print get_class($var); // определить имя класса

Числа

бесконечность:
echo INF > 10000000 , "\n";
echo -INF > 100 ? "true" : "false", "\n";
echo -INF < -10000000 , "\n";
выведет:
1
false
1

Строки

плэйсхолдеры:
$text = sprintf( "text %s digit %d", "text", 11 );
кодировка:
string iconv( string $in_charset , string $out_charset , string $str );
ещё советуют посмотреть convert_cyr_string
экранировать html:
htmlspecialchars( $string ); // преобразует спец-символы в соответствующие html-последовательности ( '<' → &lt;).
strip_tags( $string ); // вырезает html символы
склейка:
$str = implode( "; ", $myArray );
заменить один массив строк другим:
$res = " 1, 2, 3";
echo str_replace( array("1","2"), array("4","5"), $res );

Массивы (Array)

Если массив используется как list, то добавление (append) элемента в массив:
$a = new Array();
$a[] = "first";

проверить вхождение в массив
in_array( $value, $array )
$module = array_shift( $args ); // получает первый элемент и удаляет его из массива

Сортировка

Перемешать массив произвольным ("рандомным") образом:
shuffle($arr_sauna);
Чтобы при обновлении страницы "рандомная" сортировка массива не изменялась:
srand(crc32(session_id())); // устанавливаем функцию рандомайза зависимой от session_id()
if(@$_SESSION['a']!=1)     shuffle($arr_sauna);


Дата и время

$date = strptime( '2009-10-20', '%Y-%m-%d' ); // Получить время (в массив) из строки в заданном формате
// далее преобразуем в unix-time c помощью mktime:
$time = mktime( $date["tm_hour"], $date["tm_min"], $date["tm_sec"], $date["tm_mon"], $date["tm_mday"], $date["tm_year"] + 1900 );
$str = strftime( '%Y.%m.%d %H:%M:%S', $time ); // и, наконец, получаем строку в нормальном человеческом виде

получить в виде строки:
date( "d.m.Y" ); // 31.10.2009
для базы данных:
date( 'Y-m-d H:i:s' );

получить в виде массива:
$date_time_array = getdate( time() );
echo $date_time_array['weekday']; // "seconds", "minutes", "hours", "mday" - день месяца, "wday" - день недели в числовом формате
                // "mon" - месяц в числовом формате, "year" - год, "dyear" - день года в числовом формате, "month" - полное имя месяца







пятница, 22 апреля 2011 г.

php



Настройки php.ini

# Максимальный размер загружаемого файла.
upload_max_filesize = 2M

сменить кодировку сайта

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

Конструкции языка

foreach

конструкция: foreach ($params as $name => &$value) проход по ассоциативному массиву
в $name записываются ключи
в $value значения.
при изменении value будет изменяться массив $params

function &name() # результат возвращается по ссылке (не происходит копирования)

однострочные функции (аналог lambda в python)

$lambda = create_function('', 'return "g_item_id=%d";');
$sql = "delete from {imce_gallery_items} where " . (implode( " or ", array_map( $lambda, $key_array ) ) );

Классы

Объявление

class MyClass{
    var $attr;
    function __construct(){  // конструктор в php5.
        $this->attr = "1"; // ключевое слово $this - указатель на текущий объект
                                 // ключевое слово self - указатель на текущий класс
    }
}

В php4 название конструктора совпадает с название класса. Если в php5 для класса не найдена функция __construct, то в качестве конструктора берётся функция с именем совпадающим с именем класса.

Переменная класса (статическая переменная)

задать значения статических переменных

По-умолчанию статической переменной можно задать только статическое занчение:
class Module extends Common{
    public static $tt = "какое-то там дефолтное значение. нельзя даже написать \$tt=md5();";
}
Но можно определить значение более-менее динамически:
class Module extends Common{
    public static $tt;
    public static function init(){
        self::$tt = md5("param1");
    }
}
Module::init(); // сразу после объявления класса вызываем статическую функцию, которая определяет значения статических переменных.
На самом деле Module::init(); можно вызывать и перед кодом класса, т.к. php-файл сначала загружается и разбирается, а уже потом выполняется.

реестр объектов внутри класса

$a = new MyClass();
$b = new MyClass();
$c = new MyClass();
print_r( MyClass::$byId );

class MyClass{
    static public $byId = Array();
    function __construct(){
        self::$byId[] = $this;
    }
}

Работа с файлами

$a = fopen( "1.txt", "w"); // открыть файл на запись. если файл не существует, создать
fwrite( $a, "aaa" ); // записать строку в файл
fclose( $a );

Загрузка файла на сервер

<form method="post" enctype="multipart/form-data">

if(copy($_FILES["filename"]["tmp_name"], "c:/temp/".$_FILES["filename"]["name"]))
{
echo(
"Файл успешно загружен <br>");
}

Получить список директорий

function dirList($path){
    $componentList = array();
    foreach (scandir($path) as $dir){
        if (is_dir($path . $dir) && $dir !== '.' && $dir !== '..'){
            $componentList[] = $dir;
        }
    }
    return $componentList;
}


Работа с сетью

Curl

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://web20/ws/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // чтобы полученный ответ от удалённого сервера был доступен как результат curl_exec();
$res = curl_exec($ch);
curl_close($ch);

post

curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_POSTFIELDS$data);

get и urlencode

в php нет функции, которая по массиву создаёт url-строку (типа питоновской urllib.urlencode), поэтому:
$authParam = array('msgType'=>'loginRequest','session'=>$dsS,'login'=>$_POST["login"],'passwd'=>$_POST["pswd"]);
function dictToUrl($authParam){
    array_walk($authParam, create_function('&$v,$k', '$v = $k."=".urlencode($v) ;'));
    return implode("&",$authParam);
}

Буфер


интересная php-конструкция:

function obHandler($text) // $text, видимо, это содержимое буфера
{

    header('Content-Type: application/json; charset=UTF-8');

    return json_encode($GLOBALS['_RESULT']);
}
ob_start("obHandler"); // назначает callback

при завершении работы php-скрипта выведет содержимое массива

XML

DOM

Пусть есть некий xml-файл:
<?xml version="1.0" encoding="utf-8" ?>
<commands>
<command name="Get" table="User"/>
<command name="Get" table="User">
    <item>
        <guid>ce987888-c6ba-4527-bbff-85b356f9ad9b</guid>
    </item>
</command>
</commands>
Парсим его:
$xml = DOMDocument::load( "1.xml" );
$nodeList = $xml->documentElement->getElementsByTagName("command");
for ( $i=0; $i < $nodeList->length; $i++ ){
    $command = $nodeList->item($i); // тип DOMNode
    print $command->nodeName . "<br>"; // название "command" ноды из строки
                                       // <command name="Get" ....
    $domAttr = $command->attributes->getNamedItem("name"); // из DOMNamedNodeMaps вытаскиваем DOMAttr
    print sprintf( '%s="%s"', $domAttr->name ,$domAttr->value );
    print "<br>";
}

Именованные параметры <command name="Get" table="User"/> вытаскиваются из DOMNode через параметр attributes (тип DOMNamedNodeMaps).
Вложенные узлы <command name="Get" table="User"><item>... вытаскиваются из DOMNode через параметр childNodes (тип DOMNodeList).
Чтобы получить текст внутри узла: $guidNode->childNodes->item(0)->wholeText (но что-то подсказывает, что должен быть метод проще)

SOAP

SOAP - это протокол обмена сообщениями в формате XML, передаваемых по какому-то сетевому протоколу (чаще всего через HTTP).
С помощью SOAP реализуются различные web-сервисы. Все возможные запросы к web-сервису могут быть описаны в WSDL-документе (см. http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL). Для тестирования запросов есть хорошая программа soapUI.
Классы для работы с SOAP в PHP доступны после установки соответствующего расширения (extension). Под windows - это файл php_soap.dll, он есть в дистрибутиве PHP. В Denwer-е по-умолчанию SOAP не установлен.


Xdebug

1. скачать dll c http://xdebug.org/. Пред скачиванием сайт попросит отправить phpinfo(), зато потом расскажет подробно что и как надо устанавливать.
2. в php.ini надо прописать настройки:
[Xdebug]
zend_extension_ts = \usr\local\php5\ext\php_xdebug-2.1.0-5.2-vc6.dll
xdebug.profiler_enable=On
xdebug.profiler_output_dir=\traces
xdebug.profiler_output_name = "cachegrind.out.%t.%s"
я их добавил сразу после "секции" Dynamic Extensions
3. установил php-программу webgrind

Все запускаемые фалы будут оставлять после себя логи в указанной для трейсов директории.
После запуска webgrind надо нажать кнопку update, после этого он начнёт анализировать самый последний лог-файл.
Анализ может идти несколько минут, если файл большой.