[SCRIPT] Класс для работы с mssql

Тема в разделе "Веб скрипты (WEB)", создана пользователем root, 1 окт 2014.

  1. root

    root Administrator Команда форума Administrator Moderator Developers Team

    Регистрация:
    23 авг 2014
    Сообщения:
    254
    Симпатии:
    58
    Баллы:
    11
    Класс для безопасной и удобной работы с Microsoft SQL Server.
    + Отсутствие SQL-инъекций (независимо от криворукости программиста)
    + Сокращение объема "лишнего" кода и удобство разработки.
    + Возможность полного логирования и удобная отладка.
    + Поддержка расширений mssql (устарело) и sqlsrv (от microsoft) без необходимости модификации кода.


    Пытался написать упрощенный аналог библиотеки DbSimple (отсутствует поддержка MSSQL):
    http://dklab.ru/lib/DbSimple/ (многие примеры подходят)


    Пример:
    Код:
    <?php  
    require_once 'Database.php'; 
    
    
    function dbLogger($obj, $text)  
    {  
       echo $text . "<br>\n"; 
    } 
    
    
    try  
    {  
       $db = new Database('mssql://sa:[email protected]/lin2db');  
       $db->setLogger('dbLogger');  
       for ($i = 0; $i < 5; $i++) $db->query('INSERT INTO demo (str, num) VALUES (?, ?d)', 's' . $i, $i * 10);  
         
       $row = $db->selectRow('SELECT * FROM demo WHERE id = ?d', 3);  
       // SELECT * FROM demo WHERE id = 3  
       // array('id' => 3, 'str' => 's2', 'num' => 20)  
         
       $row = $db->selectRow('SELECT num FROM ?# WHERE ?# = ?', 'demo', 'str', 's2');  
       // SELECT num FROM [demo] WHERE [str] = 's2'  
       // array('num' => 20)  
         
       $ids = array(3, 5, 7);  
       $rows = $db->select('SELECT * FROM demo WHERE id IN (?a)', $ids);  
       // SELECT * FROM demo WHERE id IN (3, 5, 7)  
       // array(0 => array('id' => 3, 'str' => 's2', 'num' => 20), 1 => array('id' => 5, 'str' => 's4', 'num' => 40))  
         
       $count = $db->selectCell('SELECT COUNT(*) FROM demo WHERE ?# > ?d', 'num', 10);  
       // SELECT COUNT(*) FROM demo WHERE [num] > 10  
       // 3  
         
       $updated = $db->query('UPDATE demo SET num = ?d WHERE num > ?d', 0, 20);  
       // UPDATE demo SET num = 0 WHERE num > 20  
       // 2  
         
       $row = $db->selectRow('SELECT * FROM demo WHERE str = ?', "' = injection?");  
       // SELECT * FROM demo WHERE str = ''' = injection?'  
       // array()  
         
       $deleted = $db->query('DELETE FROM demo');  
       // DELETE FROM demo  
       // 5  
         
       $error = $db->query('SELECT * FROM demo WHERE abc = 0');  
    }  
    catch (DatabaseException $e)  
    {  
       echo 'Exception! ' . $e->getMessage() . "<br>\n";     
    }  
    ?>
    Результат работы скрипта:
    Код:
    Log from demo (function dbLogger): 
    
    
    INSERT INTO demo (str, num) VALUES ('s0', 0) 
    -- 9 ms; 1 row(s) affected 
    INSERT INTO demo (str, num) VALUES ('s1', 10) 
    -- 4 ms; 1 row(s) affected 
    INSERT INTO demo (str, num) VALUES ('s2', 20) 
    -- 4 ms; 1 row(s) affected 
    INSERT INTO demo (str, num) VALUES ('s3', 30) 
    -- 8 ms; 1 row(s) affected 
    INSERT INTO demo (str, num) VALUES ('s4', 40) 
    -- 4 ms; 1 row(s) affected 
    SELECT * FROM demo WHERE id = 3 
    -- 1 ms; 1 row(s) returned 
    SELECT num FROM [demo] WHERE [str] = 's2' 
    -- 1 ms; 1 row(s) returned 
    SELECT * FROM demo WHERE id IN (3, 5, 7) 
    -- 0 ms; 2 row(s) returned 
    SELECT COUNT(*) FROM demo WHERE [num] > 10 
    -- 1 ms; 1 row(s) returned 
    UPDATE demo SET num = 0 WHERE num > 20 
    -- 8 ms; 2 row(s) affected 
    SELECT * FROM demo WHERE str = ''' = injection?' 
    -- 1 ms; 0 row(s) returned 
    DELETE FROM demo 
    -- 3 ms; 5 row(s) affected 
    SELECT * FROM demo WHERE abc = 0 
    -- 1 ms; failed! 
    Exception! Invalid column name 'abc'.