<rmcreative>

RSS

Все заметки с тегом «PHP»

Можно уточнить:

  1. Несколько SQL-запросов за один раз через PDO

    24 июня 2011

    Понадобилось исполнить несколько не однотипных запросов за один раз. Также, как это делает mysqli::multi_query, но через PDO. Сделать это, оказалось, вполне реально, но и без интересностей не обошлось.

    Во-первых нагуглить это оказалось почему-то не так просто: вылезали какие-то обсуждения PDO_MYSQLND 2008-го года и, хоть и свежие, но оставшиеся без внятного ответа вопросы на StackOverflow.

    Оказалось, что PDO_MYSQLND с релизом PHP 5.3 заменил PDO_MYSQL, который такие вещи не поддерживал. Причём заменил под тем же именем PDO_MYSQL.

    Итого, для выполнения нескольких запросов за один раз понадобится:

    • PHP 5.3+
    • mysqlnd
    • Эмуляция prepared statement через PDO::ATTR_EMULATE_PREPARES, выставленный в 1 (по умолчанию) или, как альтернатива, не использование prepared statements и выполнение запроса напрямую через $pdo->exec.

    Используем exec

    $db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
     
    // работает как для реальных statement-ов, так и для эмуляции
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
     
    $sql = "DELETE FROM car; INSERT INTO car(name, type) VALUES ('car1', 'coupe'); INSERT INTO car(name, type) VALUES ('car2', 'coupe');";
     
    try {
        $db->exec($sql);
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
        die();
    }

    Используем statement-ы

    $db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
     
    // Не будет работать с реальными statement-ами. Только с эмуляцией.
    // Строку ниже можно закомментировать, это умолчание
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
     
    $sql = "DELETE FROM car; INSERT INTO car(name, type) VALUES ('car1', 'coupe'); INSERT INTO car(name, type) VALUES ('car2', 'coupe');";
     
    try {
        $stmt = $db->prepare($sql);
        $stmt->execute();
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
        die();
    }
    9 комментариев
  2. DevConf 2011, впечатления

    6 июня 2011

    Вчера вернулся с DevConf, где читал доклад про Yii и процесс его разработки. В общем доклад был похож на одноимённый с CodeFest, но включал себя багфиксы и раскрывал мысль несколько лучше. На вопрос «во что может превратиться Yii, если его разработчики станут компанией» я чётко ответил «в Битрикс», чем, сдаётся мне, поверг окружающих в лёгкий в шок. На самом деле оговорился :) Вопросы были, кстати, очень хорошие и правильные. Спасибо задававшим их людям.

    Читаем

    18 комментариев
  3. Рекурсивные анонимные функции PHP

    1 июня 2011

    // считаем факториал
    $fact = function($n) use (&$fact)
    {
        if($n==1)
            return 1;
     
        return $fact($n-1)*$n;
    };
    echo $fact(5); // =120
    25 комментариев
  4. Импорт больших SQL-дампов через PHP

    27 мая 2011

    Основная проблема при импорте большого SQL-дампа — нехватка памяти при чтении всего дампа. Решение очевидно: грузить в память только то, что нужно в данный момент.

    $f = @fopen("path/to/dump.sql", "r");
    if($f)
    {
        $q = '';
     
        while(!feof($f))
        {
            // читаем построчно в буфер $q      
            $q .= fgets($f);
     
            // пока не упрёмся в ;
            if(substr(rtrim($q), -1) == ';')
            {
                // выполяем запрос
                execute_sql($q);
     
                // обнуляем буфер
                $q = '';
            }
        }
    }
    20 комментариев
  5. Как скомпилить libevent для PHP под Windows

    22 мая 2011

    Компилировать расширения PHP под Windows нет так уж и просто. Но задача вполне выполнимая.

    Читаем

    6 комментариев
  6. PHP, построение URL

    20 мая 2011

    При работе с разными API (и не только) требуется построить URL. На входе имеем массив параметров имя-значение, на выходе получаем URL. Решение очень простое:

    function getUrl($url, $params = array())
    {
        return $url.'&'.http_build_query($params);
    }
     
    // используем так
    echo getUrl('http://open.mapquestapi.com/nominatim/v1/search?format=json', array('q' => 'Olympiaturm, Spiridon-Louis-Ring 7, München 80809'));

    UPD: http_build_url.

    13 комментариев
  7. Короткий echo в PHP 5.4

    19 мая 2011

    Похоже, в 5.4 и последующих версиях PHP собираются включить короткий echo по умолчанию и сделать его независимым от short_tags. Меня лично данное известие радует

    <?=$username?>

    выглядит гораздо приятнее, чем

    <?php echo $username?>

    Единственное, что пока останавливает от повсеместного использования более короткого синтаксиса — необходимость писать продукты под дефолтные конфиги PHP. Хотя, например, в коде этого блога как раз используется короткий echo.

    14 комментариев
  8. PHP PECL под Windows

    7 мая 2011

    Если вы работаете с PHP под Windows или просто разрабатываете в Windows, как я, то наверняка вы знакомы со страничкой http://downloads.php.net/pierre/, которая временно-постоянно заменяет PECL для Windows и на которой можно найти свежие билды различных расширений.

    Конечно, найти там нужное не так просто, если не знать, что именно вам нужно. Если у вас последние версии PHP (начиная с 5.3.6) для Windows и если вы не собирали их самостоятельно, можно смело игнорировать всё что помечено как vc6 или x64. Далее смотрим, thread safe ли у вас версия PHP. Если не уверены, то можно посмотреть, имеется ли у вас php5ts.dll. Если да, версия thread safe и расширения надо выбирать только с пометкой ts. После этого обычно остаётся пара вариантов: стабильная версия и собранные из текущего svn/cvs кода.

    С некоторыми расширениями, конечно, приходится повозиться. Например, APC. После очевидного отбора остаётся прилично вариантов:

    • php_apc-20110109-5.3-vc9-x86.zip
    • apc-igbinary-fastlz-snap20110301-5.3-ts-vc9-x86.zip
    • php_apc-3.1.8-dev-+igbinary-1.1.2-dev-5.3-ts-vc9-x86.zip
    • php_apc-3.1-5.3-svn20101116-vc9-x86.zip
    • php_apc-3.1.5-5.3-vc9-x86.zip

    Мне было некогда разбираться, взял первый попавшийся php_apc-20110109-5.3-vc9-x86.zip и пару дней мучался с тем, что сервер время от времени просто переставал отвечать на запросы. Потом, методом исключения, нашёл виновника и проверил все остальные варианты:

    • php_apc-20110109-5.3-vc9-x86.zip — время от времени вешается.
    • apc-igbinary-fastlz-snap20110301-5.3-ts-vc9-x86.zip — сразу рушит апач.
    • php_apc-3.1.8-dev-+igbinary-1.1.2-dev-5.3-ts-vc9-x86.zip — стабильно.
    • php_apc-3.1-5.3-svn20101116-vc9-x86.zip — стабильно, но есть 3.1.5.
    • php_apc-3.1.5-5.3-vc9-x86.zip — стабильно, но есть 3.1.8.

    т.к. 3.1.8 оказалась вполне стабильной, остановился на ней. Кстати, внутри там:

    20 комментариев
  9. PhpStorm 2.1 EAP build 107.21

    29 апреля 2011

    Уже давно не писал про EAP PhpStorm потому как просто не успевал. Уж очень шустро он развивается. А произошло действительно много всего.

    Во-первых был выпущен апдейт 2.0.1, в котором мне лично понравилось, кроме всего остального, следующее:

    • Добавили рефакторинг «Introduce Constant».
    • Наконец, IDE стала сообщать, что у нас в проекте несколько одноимённых классов и автодополнению плохо. Лучше бы, конечно, дополняло как NetBeans, из всех, но и это уже очень хорошо.

    Через некоторое время возобновилась EAP:

    Ну и свежий EAP тоже порадовал. Особенно:

    • Теперь стало возможно делать diff для директорий. Похоже, скоро можно будет избавиться от отдельного внешнего инструмента.
    • Улучшили навигацию по конструктору и поиск использования класса.

    От практики обновления EAP-билдов автоматически, похоже отказались, поэтому установить придётся самостоятельно.

    16 комментариев
  10. Сообщения об ошибках и хороший код

    17 апреля 2011

    Как ни странно, очень многие разработчики пренебрегают более строгими режимами работы тех же PHP и MySQL. Странно это, прежде всего, потому, что включение таких режимов позволяет получать больше информации о потенциальных ошибках в коде и, соответственно писать код лучше.

    В PHP самый строгий уровень ошибок можно получить записав в php.ini:

    error_reporting  =  -1
    

    Это позволяет выявить такие слабые места, как, например, использование переменных без их объявления. Да и банальные описки выявляются сразу, а не после пары часов жёсткого дебага.

    В MySQL тоже есть строгий режим, который не позволяет, например, вставить строку длиной в 200 символов в поле varchar(20). В «умолчательном» режиме MySQL молча вставит первые 20 символов, выкинув остальные. В строгом — получим соответствующую ошибку. Включается этот режим через my.cnf:

    [mysqld]
    sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"
    

    Все значения sql-mode можно подсмотреть в официальной документации.

    22 комментария