powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [php] Фильтрация переменных в классе-обертке для БД
90 сообщений из 90, показаны все 4 страниц
[php] Фильтрация переменных в классе-обертке для БД
    #37789934
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
    /**
     * Возвращает подготовленную строку для безопасного использования в запросе.
     * 
     * ? => начало спецификации<br>
     * i => число<br>
     * s => проэскейпленная строка в кавычках<br>
     * t => имя таблицы с преффиксом
     * 
     * <code>
     * echo $db->prepare('SELECT * FROM ?t WHERE age > ?i AND age < ?i AND city = ?s;', 'users', 'foo', '24', 'Moscow');
     * </code>
     * 
     * Выведет:
     * <pre>
     * SELECT * FROM prefix_users WHERE age > 0 AND age < 18 AND city = 'Moscow';
     * </pre>
     *
     * @param type $args
     * @return string 
     */
    public function prepare() {
        $args = func_get_args();
        return $this->_prepare($args);
    }
    
    private function _prepare($args) {        
        $count = count($args);
        $length = strlen($args[0]);     
        $query = '';
        $start = 0;
        $i = 1;
        
        while ($offset = strpos($args[0], '?', $start)) {
            if ($offset == $length - 1) {
                throw new Exception('Unexpected end.');
            }  
                       
            $modifier = $args[0][$offset + 1];
            
            switch ($modifier) {
                case 'i':
                    $value = intval($args[$i]);
                    break;

                case 's':
                    $value = $this->quote($args[$i]);
                    break;

                case 't':
                    $value = $this->getTablename($args[$i]);
                    break;
                
                default:
                    throw new Exception("Unknown modifier '{$modifier}'.");
            }
                      
            $query .= substr($args[0], $start, $offset - $start) . $value;
            $start = $offset + 2;
            ++$i;
        }
        
        $query .= substr($args[0], $start, $length);      
        return $query;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37789979
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
$db->query('SELECT * FROM ?t WHERE name = ?s AND pass = ?s', 'users', 'tester', "\x00"); // SELECT * FROM t_users WHERE name = 'tester' AND pass = '\0'
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37789994
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В mysqli и PDO это уже давно сделали
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37789999
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если надо будет сделать запрос
Код: php
1.
'SELECT * FROM user WHERE id IN (' . inplode(',', $ids) . ')'


?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790004
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hett, нет там неудобно все сделано
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790005
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hett, можно добавить модификатор ?v он будет джойнить по запятой эл-ты
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790017
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HettА если надо будет сделать запрос
Код: php
1.
'SELECT * FROM user WHERE id IN (' . inplode(',', $ids) . ')'


?

Код: php
1.
2.
$ids = array(1, 3, 5, 7, 9);
$db->query('SELECT * FROM ?t WHERE id IN (?v);', 'example', $ids);



Код: sql
1.
SELECT * FROM t_example WHERE id IN (1, 3, 5, 7, 9);



?v в IN и VALUES можно использовать, хотя ему бы придумать более осмысленный модификатор, а то s -> string, i -> integer, t -> table
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790062
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
$set = array('name' => "\x00'\"", 'password' => 'qwerty');
$set = $db->filterArray($set);
$db->query('UPDATE ?t SET ?H WHERE id = ?i;', 'users', $set, '1');



Код: sql
1.
UPDATE t_users SET name = '\0\'\"', password = 'qwerty' WHERE id = 1;



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    /**
     * Возвращает подготовленную sql-строку для безопасного использования в запросах.
     * 
     * ? => начальный символ c которого начинается модификатор<br>
     * i => значение будет приведено к типу INT<br>
     * s => строка будет экранирована и заключена в кавычки<br>
     * t => имя таблицы с преффиксом<br>
     * L => элементы списка через запятую<br>
     * H => ассоциативный массив key = value, key1 = value1, ... 
     * 
     * <code>
     * echo $db->prepare('SELECT * FROM ?t WHERE age > ?i AND age < ?i AND city = ?s;', 'users', 'foo', '24', 'Moscow');
     * </code>
     * 
     * Выведет:
     * <pre>
     * SELECT * FROM prefix_users WHERE age > 0 AND age < 24 AND city = 'Moscow';
     * </pre>
     *
     * @param array $args
     * @return string 
     */



Но вот задумалсястоит ли фильтровать автоматически хэши и списки? Вот например массив айдишников которые используются в WHERE IN мы получаем из базы, т.е. фильтровать не имеет смысла, в INSERT да и в UPDATE? Как лучше сделать?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790066
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Няша ррр , опять нарушаете. Внимательно читаем правила форума. Особенно вот это место http://www.sql.ru/forum/rules.aspx Не рекомендуется:
Публиковать сообщения с бессмысленными темами. Например: <Люди помогите>, <Проблема!!>, <Срочно нужна помощь!>, <может знаете?> и т.д. Жду сообщения с новым названием темы. В противном случае топик будет удален, а Вам - бан за неоднократные нарушения. Как Вам такая идея?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790076
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, Автоматическое экранирование переменных при их передаче в функцию с применением модификаторов
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790085
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няша ррр, Вы действительно считаете что можно заэкранировать переменную ? Если это высказывание вообще имеет смысл...
И, да, Ваш вариант не лезет в поле - перебор по количеству знаков. Попытка два.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790107
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleНяша ррр, Вы действительно считаете что можно заэкранировать переменную ? Если это высказывание вообще имеет смысл...
И, да, Ваш вариант не лезет в поле - перебор по количеству знаков. Попытка два.

Фильтрация переменных в классе-обертке для БД
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790108
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
    private function _set($data) {
        $data = $this->_filterArray($data);
        
        $sql = '';
        
        foreach ($data as $key => $value) {
            $sql .= $key . ' = ' . $value . ', ';
        }
        
        return substr($sql, 0, -2);
    }
    
    private function _applyModifier($modifier, $value) {
        switch ($modifier) {
            case 'i':
                return intval($value);

            case 's':
                return $this->quote($value);

            case 't':
                return $this->getTablename($value);
 
            case 'v': 
                return implode(', ', $value);

            case 'a':
                return implode(', ', $this->_filterArray($value));

            case 'h':
                return $this->_set($value);

            default:
                throw new Exception("Unknown modifier '{$modifier}'.");
        }
    }
    
    private function _prepare($args) {
        $sql = '';
        $length = strlen($args[0]);
        $start = 0;
        $i = 1;
        
        while ($offset = strpos($args[0], '?', $start)) {
            if ($offset == $length - 1) {
                throw new Exception('Unexpected end.');
            }  
                       
            $value = $this->_applyModifier($args[0][$offset + 1], $args[$i]);
            $sql .= substr($args[0], $start, $offset - $start) . $value;
            $start = $offset + 2;
            ++$i;
        }
        
        $sql .= substr($args[0], $start, $length);      
        return $sql;
    }
    
    /**
     * Возвращает подготовленную sql-строку для безопасного использования в запросах.
     * 
     * ? => начальный символ c которого начинается модификатор<br>
     * i => значение будет приведено к типу INT<br>
     * s => строка будет экранирована и заключена в кавычки<br>
     * t => имя таблицы с преффиксом<br>
     * v => значения через запятую(без фильтрации)<br>
     * a => значения через запятую(данные будут отфильтрованы)<br>
     * h => будет заменен на строку вида вида key = value[, key1 = value1[, ...]](данные будут отфильтрованы)
     * 
     * <code>
     * echo $db->prepare('SELECT * FROM ?t WHERE age > ?i AND age < ?i AND city = ?s;', 'users', 'foo', '24', 'Moscow');
     * </code>
     * 
     * Выведет:
     * <pre>
     * SELECT * FROM prefix_users WHERE age > 0 AND age < 24 AND city = 'Moscow';
     * </pre>
     *
     * @param array $args
     * @return string 
     */
    public function prepare() {
        $args = func_get_args();
        return $this->_prepare($args);
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790326
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няша ррр,

а имя таблицы зачем 'фильтровать'? вы сами себе недоверяете?
а если запрос сразу к нескольким таблицам? их имена будут размазаны по массиву параметров...
запоминать кучу модификаторов со странными именами - сомнительный прогресс.
и главный вопрос.
в чем конкретные преимущества вашего велосипеда перед тем же pdo?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790427
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора имя таблицы зачем 'фильтровать'? вы сами себе недоверяете?
скорее это уже не фильтрация, а прикрепление префикса. Лучше это сделать как-то по другому, например неявно.

Код: sql
1.
INSERT INTO {{user}} VALUES(?, ?, ?)



Далее автозаменой

Код: php
1.
preg_replace('#{{(\w+)}}#', $this->prefix . '$1');
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790575
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,

> а имя таблицы зачем 'фильтровать'? вы сами себе недоверяете?

преффиксы добавляются

> а если запрос сразу к нескольким таблицам? их имена будут размазаны по массиву параметров...

А можно так сделать 'SELECT * from ^users' => 'SELECT * FROM prefix_users'

> запоминать кучу модификаторов со странными именами - сомнительный прогресс.

Никого не заставляю

> и главный вопрос.
> в чем конкретные преимущества вашего велосипеда перед тем же pdo?

PDO такого не умеет
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790611
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няша рррPDO такого не умеет
префиксы да. остальное умеет даже лучше
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790614
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няша рррА можно так сделать 'SELECT * from ^users' => 'SELECT * FROM prefix_users'

ага
Код: php
1.
UPDATE maths SET formula = "2^3=8" WHERE id=1
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790653
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
РенатНяша рррА можно так сделать 'SELECT * from ^users' => 'SELECT * FROM prefix_users'

ага
Код: php
1.
UPDATE maths SET formula = "2^3=8" WHERE id=1



Такое только дураку в голову придет, тем более знаки вопроса могут быть тоже в строке, как и любой другой символ. Есть какие предложения?

И вопрос. Можно ли сделать красивее?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
    private function _replacePlaceholders($matches) {
        if ($matches[0] == '^') {
            return $this->tablesPrefix;
        }
        else {
            $value = next($this->_args);
            
            switch ($matches[1]) {
                case '':
                case 's':
                    return $this->quote($value);
                    
                default:
                    throw new Exception("Unknown placeholder ?{$matches[1]}.");
            }
        }
    }
    
    private function _prepare($args) {
        $sql = '';
        
        if (count($args) > 1) {
            $this->_args = $args; // вроде как хак, не нравится
            $sql = preg_replace_callback('/\^|\?(\w?)/s', array($this, '_replacePlaceholders'), $args[0]);
        }
        else {
            $sql = $args[0];
        }
        
        return $sql;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790743
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так код менее понятен:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
   private function _replacePlaceholders($matches) {
        if ($matches[0][0] == '^') {
            return $this->tablesPrefix . $matches[1];
        }
        else {
            $value = next($this->_args);
            
            switch ($matches[1]) {
                case '':
                case 's':
                    return $this->quote($value);
                    
                default:
                    throw new Exception("Unknown placeholder ?{$matches[1]}.");
            }
        }
    }
    
    private function _prepare() {
        if (count($this->_args) > 1) {
            return preg_replace_callback('/\^([a-z]+[_a-z0-9]*)|\?([a-z]*)/is', array($this, '_replacePlaceholders'), $this->_args[0]);
        }
        else {
            return $this->_args[0];
        }
    }
 
   public function prepare() {
        $this->_args = func_get_args();
        return $this->_prepare();
    }



Но зато массивы не передаются по значению, вроде как экономия на спичках.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790773
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя и такая регулярка сойдёт
Код: sql
1.
/\^([a-z]+)|\?([a-z]*)/is



Можно ещё добавить, указание номера аргумента

3?s 1?d 2?d
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790850
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
SELECT * 
        FROM :pages 
        WHERE 
            alias = 1?



Кстати двоеточие тож можно использовать, с '^' некрасиво
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790883
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аргументы можно сделать именованные. Но тогда получится тоже самое что и в PDO
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790955
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hett, это не очень удобно, там много лишних телодвижений, подготовить строку, подставить значения, выполнить, как и в mysqli

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
lib/classes/DB.php
prepare  Возвращает подготовленную sql-строку для безопасного использования в запросах.  
: -> преффикс таблицы
? -> значение будет:
... s    -> экранировано и заключено в кавычки(если опущен сам флаг, то подразумевается применение 's')
... i, d -> приведено к целому
... a    ->  выведено через запятую(без фильтрации)
... ai   -> выведено через запятую(с фильтрацией)
... as   -> представлено в виде строки key = value[, key1 = value1[, ...]](с фильтрацией)
Пример: Перед '?' можно указывать порядковый номер аргумента.
echo $db->prepare('SELECT * FROM :users WHERE age > ?i AND age < ?i AND city = ?s;', 'foo', '24', 'Moscow');
Output: SELECT * FROM prefix_users WHERE age > 0 AND age < 24 AND city = 'Moscow';
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790973
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ai -> Indexed Array
as -> Associative Array

Надо записать
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37790977
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
    private function _replacePlaceHolders($matches) {
        if ($matches[1]) {
            return $this->getTablename($matches[1]);
        }
        else {
            $value = $matches[2] ? $this->_args[$matches[2]] : next($this->_args);
            
            switch ($matches[3]) {
                case '':
                case 's':
                    return $this->quote($value);
                    
                case 'i':
                case 'd':
                    return intval($value);
                    
                case 'a': 
                    return implode(', ', $value);

                case 'ai': // Indexed Array
                    return $this->_list($value);

                case 'as': // Associative Array
                    return $this->_set($value);
                    
                default:
                    throw new Exception("Unknown placeholder ?{$matches[3]}.");
            }
        }
    }
    
    private function _prepare($args = null) {
        if ($args) {
            $this->_args = $args;
        }
        
        if (count($this->_args) > 1) {
            $pattern = '/:([a-z]+)|([1-9]+[0-9]*)?\?([a-z]*)/is';
            return preg_replace_callback($pattern, array($this, '_replacePlaceHolders'), $this->_args[0]);
        }
        else {
            return $this->_args[0];
        }
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791214
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няша ррр,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
<?php

/**
 * Абстрактный слой для работы с базой данных.
 * 
 * Возможности:
 *... Поддержка плейсхолдеров.<br>
 *....... Типы плейсхолдеров<br>
 *........... :tablename       -> добавляем префикс к имени таблицы<br>
 *........... {arg_num}?{flag} -> заменяет на значение<br>
 *........... Подробнее см. справку к методу prepare.<br><br>
 *........Синтаксис.<br>
 *........... $dbo->$method($formatted_sql[, $arg1[, $arg2[, $_args]]]);<br><br>
 *....... Методы с поддержкой:<br>
 *........... prepare, query, row, rows, one<br><br>
 *... Автоматизация рутинных операций, таких как: несложная выборка, INSERT, UPDATE, DELETE.<br>
 *... Безопасное добавление и обновление данных(insert, update).<br>
 *....... Если нужно передать в методы insert, update строку как есть, то нужно для этого нужно использовать метод unescape:<br><br>
 *........... $entry['published'] = $db->unescape('DATETIME');<br>
 *........... $db->insert('news', $entry);
 * 
 */
abstract class DB {
    protected $_args, $_connection;   
    public $tablesPrefix,
           $counter = 0,
           $lastQuery,
           $executionTime,
           $totalExecutionTime = 0,
           $affectedRows = 0,
           $numRows;
    
    abstract protected function _query($sql);
    
    abstract protected function _error();
    
    abstract protected function _errNo();
    
    abstract protected function _affectedRows();
    
    abstract public function insertId();
    
    abstract public function escape($string);
    
    abstract public function fetch($result);
    
    abstract public function single($result, $row, $field);
    
    abstract public function seek($result, $row);
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791243
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няша ррр,

иногда страное чуство дежавю green_troll`я...
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791297
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ренат, какие ещё идеи есть?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791328
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этак скоро мыдо формальной грамматики дойдем.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791414
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
    public function query() {
        $this->_args = func_get_args();
        $sql = $this->_prepare();
        return $this->rawQuery($sql);
    }
    
    /**
     * Отправляет запрос, возвращает количество модифицированных рядов.
     */
    public function execute($sql) {
        $this->_args = func_get_args();
        $sql = $this->_prepare();
        $this->rawQuery($sql);
        return $this->affectedRows;
    }

    /**
     * В случае удачи возвращает один ряд в виде ассоциативного массива либо false.
     * 
     * @param string $sql SQL-строка
     * @return mixed 
     */
    public function row() {
        $this->_args = func_get_args();
        $sql = $this->_prepare();
        $result = $this->rawQuery($sql);
        return $this->fetch($result);
    }
    
    /**
     * В случае удачи возвращает двухмерный массив либо пустой массив.
     * 
     * @param string $sql SQL-строка
     * @return mixed 
     */
    public function rows($sql) {
        $this->_args = func_get_args();
        $sql = $this->_prepare();
        $result = $this->rawQuery($sql);
        return $this->fetchAll($result);
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791773
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няша ррр,

Вставляем 1000 новостей.

Код: php
1.
2.
3.
4.
5.
6.
$i = 0;
while ($i++ < 1000) {
    $entry['id'] = null;
    $entry['title'] = 'Новость#' . $i;
    $db->insert('news', $entry, false);
}



Простая реализация постраничной навигации.

Код: php
1.
2.
3.
4.
5.
6.
7.
$page = isset($_GET['page']) ? $_GET['page'] : null;

$entries = $db->getAll('news', array('limit' => 10, 'page' => $page));

echo '<pre>';
var_dump($entries);
echo '</pre>';



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
    public function select($table, $options = array()) {
        $defaults = array(
            'columns' => '*',
            'where' => null,
            'order' => null,
            'offset' => null,
            'limit' => null,
            'page' => 0,
        );
        
        if ($options) {
            $options = array_change_key_case($options);  
        }
        
        $options = array_merge($defaults, $options);
        
        $sql = "SELECT {$options['columns']}";      
        $sql .= ' FROM ' . $this->table($table);
        
        if ($options['where']) {
            $sql .= " WHERE {$options['where']}";
        }
        
        if ($options['order']) {
            $sql .= " ORDER BY {$options['order']}";
        }
        
        if (!is_null($options['offset']) || !is_null($options['limit'])) {                      
            $limit = intval($options['limit']);
            $offset = $options['page'] > 0 ? $options['page'] * $limit - $limit :  intval($options['offset']);
            $sql .= " LIMIT $offset, $limit";
        }
        
        $sql .= ';';
        $result = $this->query($sql);
        return $result;
    }

    public function get($table, $options = array()) {
        $result = $this->select($table, $options);
        return $this->fetch($result);
    }
    
    public function find($table, $id, $columns = '*') {
        return $this->get($table, array('columns' => $columns, 'where' => 'id = ' . intval($id)));
    }
    
    public function getAll($table, $options = array()) {
        $result = $this->select($table, $options); 
        return $this->fetchAll($result);
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791793
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм

Код: php
1.
2.
var_dump(' 1 
    ' > 0); // bool(true)
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791796
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
    public function select($table, $options = array()) {
        $defaults = array(
            'columns' => '*',
            'where' => '',
            'order' => '',
            'limit' => 0,
            'page' => 0,
        );
        
        if ($options) {
            $options = array_change_key_case($options);  
        }
        
        $options = array_merge($defaults, $options);
        
        $sql = "SELECT {$options['columns']}";      
        $sql .= ' FROM ' . $this->table($table);
        
        if ($options['where']) {
            $sql .= " WHERE {$options['where']}";
        }
        
        if ($options['order']) {
            $sql .= " ORDER BY {$options['order']}";
        }
        
        if ($options['limit'] > 0) {                      
            $limit = intval($options['limit']);
            $offset = $options['page'] > 0 ? $options['page'] * $limit - $limit :  0;
            $sql .= " LIMIT $offset, $limit";
        }
        
        $sql .= ';';
        $result = $this->query($sql);
        return $result;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791808
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
var_dump($db->get('pages', array('where' => $db->like('title', 'Тест'), 'limit' => 1)));
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791813
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   public function like($column, $string) {
        $string = $this->escape($string);
        $search = array('%', '_');
        $replacements = array('\%', '\_');
        $string = str_replace($search, $replacements, $string);   
        return "$column LIKE '%$string%'";
    } 
    
    public function search($columns, $string) {  
        return "MATCH($columns) AGAINST (" . $this->quote($string) . ")";
    }



С сцеплением плохая идея, да и плодить сущности без необходимости незачем
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791816
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик постепенно становится похожим то ли на личный веб-лог автора, то ли на хауту от какой-то софтины-на-все-случаи-жизни. Уже хочется поскорее скачать и посмотреть, реализованы ли в текущей версии счетчики количества запросов и времени их выполнения, возможность сброса в лог... для отладки штука полезная. Мдя, не припоминаю, чтоб на форуме разрешалось вести личный блог.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791844
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,

Класс MySQL выглядит так:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
<?php

class MySQL extends DB {
    public function __construct($db_host, $db_user, $db_pass, $db_name, $tables_prefix = null) {
        $this->tablesPrefix = $tables_prefix;
        
        @$this->_connection = mysql_connect($db_host, $db_user, $db_pass);
        if (!$this->_connection) {
            throw new Exception('Can\'t connect to MySQL server.');
        }
        if (!mysql_select_db($db_name, $this->_connection)) {
            throw new Exception('Database does not exist.');
        } 
    }
    
    protected function _query($sql) {
        return mysql_query($sql, $this->_connection);   
    }
    
    protected function _affectedRows() {
        return mysql_affected_rows($this->_connection);
    }
    
    public function error() {
        return mysql_error($this->_connection);
    }
    
    public function errno() {
        return mysql_errno($this->_connection);
    }
    
    public function insertId() {
        return mysql_insert_id($this->_connection);
    }

    public function escape($string) {
        return mysql_real_escape_string($string, $this->_connection);
    }

    public function fetch($result) {
        return mysql_fetch_assoc($result);
    }

    public function seek($result, $row = 0) {
        return mysql_data_seek($result, $row);
    }

    public function __destruct() {
        return mysql_close($this->_connection);
    }
}

?>



Так что чтобы реализовать, враппер для MySQLi особых сложностей не составит.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  /**
     * Отправляет 'сырой' запрос.
     */  
    public function query($sql) {
        ++$this->counter;
        $this->lastQuery = $sql;
        $this->executionTime = -microtime(1);
        $result = $this->_query($sql);
        $this->executionTime += microtime(1);
        $this->totalExecutionTime += $this->executionTime;
        $this->numRows = null;
        $this->affectedRows = $this->_affectedRows();
        
        if (!is_bool($result)) {
            $this->numRows = $this->affectedRows;   
            return $result;
        }
        else if (!$result) {
            throw new Exception('SQL Error Code: ' . $this->errno() . ' - ' . $this->error() . '. Query: "' . $sql .'".');
        } 
    }



Да все замеряется.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
   public function pquery() {
        $this->_args = func_get_args();
        $sql = $this->_prepareSql();
        return $this->query($sql);
    }
    
    public function fetchOne($result) {
        $row = $this->fetch($result);
        
        if (is_array($row)) {
            return current($row);
        }
        
        return false;
    }
    
    /**
     * Вернет одно значение, либо false
     **/
    public function one() {
        $this->_args = func_get_args();
        $sql = $this->_prepareSql();
        $result = $this->query($sql);
        return $this->fetchOne($result);
    }

    /**
     * В случае удачи возвращает один ряд в виде ассоциативного массива либо false.
     */
    public function row() {
        $this->_args = func_get_args();
        $sql = $this->_prepareSql();
        $result = $this->query($sql);
        return $this->fetch($result);
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791846
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
  /**
     * Посчитать количество рядов в таблице.
     */
    public function count($table, $column, $where = null) {
        $value = $this->single($table, "COUNT($column)", $where);    
        
        if ($value === false) {
            return false;
        }
        
        return intval($value);
    }
    
    /**
     * Посчитать количество всех рядов в таблице.
     */
    public function countAll($table, $where = null) {
        return $this->count($table, '*', $where);
    }
    
    public function countPages($table, $limit, $where = null) {
        if ($limit > 0) {
            $total = $this->countAll($table, $where);
            
            if ($total === false) {
                return false;
            }
            
            return ceil($total / $limit);
        }
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791850
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наврядли освобождение предыдущего результата даст что-то

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
    public function query($sql) {     
        ++$this->counter;
        $this->lastQuery = $sql;
        $this->executionTime = -microtime(1);
        $result = $this->_query($sql);
        
        if ($this->lastResult) {
            $this->freeResult($this->lastResult);
        }
        
        $lastResult = $result;
        $this->executionTime += microtime(1);
        $this->totalExecutionTime += $this->executionTime;
        $this->numRows = null;
        $this->affectedRows = $this->_affectedRows();
        
        if (!is_bool($result)) {
            $this->numRows = $this->affectedRows;   
            return $result;
        }
        else if (!$result) {
            throw new Exception('SQL Error Code: ' . $this->errno() . ' - ' . $this->error() . '. Query: "' . $sql .'".');
        } 
    }

    // ...
    
    public function __destruct() {
        if ($this->lastResult) {
            $this->freeResult($this->lastResult);
        }
    
        $this->close();
    }  
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791861
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

это новый вид бота
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37791990
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uvkle,

это новый вид бота
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792035
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hett,

Так всё переделал, теперь указатель на результат хранится в самом объекте

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$db->select('news', array('limit' => 10, 'page' => 5));
$news = $db->fetchAll();

/*
Можно и так писать:

$news = $db->getAll('news', array('limit' => 10, 'page' => 5));

Но это для наглядности.
*/
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792058
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няша ррр,

Всё-таки сделал сцепление(chain вроде ж цепь, хз как по-русски) для методов query, pquery(prepared query, метод с поддержкой плейсхолдеров), select, они все равно ничего не возвращали

Код: php
1.
2.
3.
echo '<pre>';
var_dump($db->select('pages', array('where' => $db->like('title', 'Тест'), 'limit' => 1))->fetchAll());
echo '</pre>';



Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<pre>array(1) {
  [0]=>
  array(6) {
    ["id"]=>
    string(1) "1"
    ["alias"]=>
    string(4) "test"
    ["title"]=>
    string(33) "Тестовая страница"
    ["keywords"]=>
    string(0) ""
    ["description"]=>
    string(0) ""
    ["content"]=>
    string(18) "<p>It's works!</p>"
  }
}
</pre>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792079
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
<?php

class MySQL extends DB {
    public function __construct($db_host, $db_user, $db_pass, $db_name) {
        @$this->_connection = mysql_connect($db_host, $db_user, $db_pass);
        if (!$this->_connection) {
            throw new Exception('Can\'t connect to MySQL server.');
        }
        if (!mysql_select_db($db_name, $this->_connection)) {
            throw new Exception('Database does not exist.');
        } 
    }
    
    protected function _query($sql) {
        return mysql_query($sql, $this->_connection);   
    }
    
    public function affectedRows() {
        return mysql_affected_rows($this->_connection);
    }
    
    public function error() {
        return mysql_error($this->_connection);
    }
    
    public function errno() {
        return mysql_errno($this->_connection);
    }
    
    public function insertId() {
        return mysql_insert_id($this->_connection);
    }

    public function escape($string) {
        return mysql_real_escape_string($string, $this->_connection);
    }

    public function fetchAssoc() {
        return mysql_fetch_assoc($this->_result);
    }
    
    public function fetchNum() {
        return mysql_fetch_row($this->_result);
    }
    
    public function fetchArray() {
        return mysql_fetch_array($this->_result);
    }
    
    public function freeResult() {
        return mysql_free_result($this->_result);
    }

    public function seek($row = 0) {
        return mysql_data_seek($this->_result, $row);
    }

    public function close() {
        return mysql_close($this->_connection);
    }
}

?>



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    public function fetch($type = 'ASSOC') {
        $type = strtoupper($type);
        
        switch ($type) {
            case 'ASSOC':
                return $this->fetchAssoc();
                
            case 'NUM':
                return $this->fetchNum();
                
            case 'BOTH':
                return $this->fetchArray();
            
            case 'OBJECT':
                return (object) $this->fetchAssoc();
                
            default:
                throw new Exception("Unknown fetch type {$type}.");
        }
    }
    
    public function fetchAll($type = 'ASSOC') {
        $rows = array();
        
        while ($row = $this->fetch($type)) {
            $rows[] = $row;
        }
        
        return $rows;
    } 
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792084
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няша ррр,

Код: php
1.
2.
3.
    public function fetchObject($class_name = null, $params = array()) {
        return mysql_fetch_object($this->_result, $class_name, $params);
    }




Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class Page {
    private $_db;
    
    public function __construct($db) {
        $this->_db = $db;
    }
    
    public function save() {
        // $this->_db->update ...
    }
}

$page = $db->select('pages', array('where' => $db->like('title', 'Тест'), 'limit' => 1))->fetchObject('Page', array($db));

echo '<pre>';
var_dump($page);
echo '</pre>';



Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<pre>object(Page)#2 (7) {
  ["_db":"Page":private]=>
  object(MySQL)#1 (10) {
    ["_connection":protected]=>
    resource(9) of type (mysql link)
    ["_result":protected]=>
    resource(10) of type (mysql result)
    ["_args":protected]=>
    NULL
    ["tablesPrefix"]=>
    string(2) "t_"
    ["counter"]=>
    int(2)
    ["lastQuery"]=>
    string(63) "SELECT * FROM t_pages WHERE title LIKE '%Тест%' LIMIT 0, 1;"
    ["executionTime"]=>
    float(0.00045084953308105)
    ["totalExecutionTime"]=>
    float(0.00087785720825195)
    ["affectedRows"]=>
    int(1)
    ["numRows"]=>
    int(1)
  }
  ["id"]=>
  string(1) "1"
  ["alias"]=>
  string(4) "test"
  ["title"]=>
  string(33) "Тестовая страница"
  ["keywords"]=>
  string(0) ""
  ["description"]=>
  string(0) ""
  ["content"]=>
  string(18) "<p>It's works!</p>"
}
</pre>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792086
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    public function fetch($type = 'ASSOC') {
        $type = strtoupper($type);
        
        switch ($type) {
            case 'ASSOC':
                return $this->fetchAssoc();
                
            case 'NUM':
                return $this->fetchNum();
                
            case 'BOTH':
                return $this->fetchArray();
                
            default:
                throw new Exception("Unknown fetch type {$type}.");
        }
    }
    
    public function fetchAll($type = 'ASSOC') {
        $rows = array();
        
        while ($row = $this->fetch($type)) {
            $rows[] = $row;
        }
        
        return $rows;
    } 
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792137
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такого нигде не видел.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function show_entry($entry) {
?>
<h2><?=$entry['title']?></h2>
<p><?=$entry['description']?></p>
Опубликовано: <?=$entry['published']?>. <a href="news/<?=$entry['id']?>">Читать полностью &raquo;</a>
<?php
}

$page = isset($_GET['page']) ? $_GET['page'] : null;
$db->select('news', array('columns' => 'id, title, description, published', 'limit' => 10, 'page' => $page, 'order' => 'id DESC'));
$db->fetchCallback('show_entry');



Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<h2>Новость #50</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/50">Читать полностью &raquo;</a>
<h2>Новость #49</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/49">Читать полностью &raquo;</a>
<h2>Новость #48</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/48">Читать полностью &raquo;</a>
<h2>Новость #47</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/47">Читать полностью &raquo;</a>
<h2>Новость #46</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/46">Читать полностью &raquo;</a>
<h2>Новость #45</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/45">Читать полностью &raquo;</a>
<h2>Новость #44</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/44">Читать полностью &raquo;</a>
<h2>Новость #43</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/43">Читать полностью &raquo;</a>
<h2>Новость #42</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/42">Читать полностью &raquo;</a>
<h2>Новость #41</h2>
<p>Кратко</p>
Опубликовано: 2012-05-13 15:52:33. <a href="news/41">Читать полностью &raquo;</a>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792156
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И даже так:

Код: php
1.
2.
$db->prepare('UPDATE :news SET description = ?;', 'Без описания')->query();
echo $db->sql; // хотя пожалуй я сделаю его protected



$db->pquery($formatted_sql, $_args); // return $this

заменяет

$db->prepare($formatted_sql, $_args); // return $this
$db->query(null); // return $this, т.е. можно строит такие цепочки $db->prepare()->query()->fetch();

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
    /**
     * Отправляет 'сырой' запрос, либо подготовленный.
     */  
    public function query($sql = null) {     
        if ($sql) {
            $this->sql = $sql;
        }
        
        if (is_resource($this->_result)) { // освобождаем предыдущий результат
            $this->freeResult();
        }
        
        ++$this->counter;
        $this->executionTime = -microtime(1);
        $this->_result = $this->_query($this->sql);       
        $this->executionTime += microtime(1);
        $this->totalExecutionTime += $this->executionTime;
        $this->numRows = null;
        $this->affectedRows = $this->affectedRows();
        
        if (!is_bool($this->_result)) {
            $this->numRows = $this->affectedRows;   
        }
        else if (!$this->_result) {
            throw new Exception('SQL Error Code: ' . $this->errno() . ' - ' . $this->error() . '. Query: "' . $sql .'".');
        } 
        return $this;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792157
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няша ррр
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    public function fetch($type = 'ASSOC') {
        $type = strtoupper($type);
        
        switch ($type) {
            case 'ASSOC':
                return $this->fetchAssoc();
                
            case 'NUM':
                return $this->fetchNum();
                
            case 'BOTH':
                return $this->fetchArray();
                
            default:
                throw new Exception("Unknown fetch type {$type}.");
        }
    }
    
    public function fetchAll($type = 'ASSOC') {
        $rows = array();
        
        while ($row = $this->fetch($type)) {
            $rows[] = $row;
        }
        
        return $rows;
    } 




редкосnysq бред.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792158
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вам что за количество строк кода платят?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792186
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow, почему?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792187
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в мод иксе или джумле такое видел
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792198
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
<?php

class MySQL extends DB {
    protected function _open() {       
        @$this->_connection = mysql_connect($this->_conf['server'], $this->_conf['user'], $this->_conf['password']);
        if (!$this->_connection) {
            throw new Exception('Can\'t connect to MySQL server.');
        }
        if (!mysql_select_db($this->_conf['database'], $this->_connection)) {
            throw new Exception('Database does not exist.');
        }
    }
    
    protected function _close() {
        return mysql_close($this->_connection);
    }
    
    protected function _query($sql) {
        return mysql_query($sql, $this->_connection);   
    }
    
    public function affectedRows() {
        return mysql_affected_rows($this->_connection);
    }
    
    public function numRows() {
        return $this->affectedRows();
    }
    
    public function error() {
        return mysql_error($this->_connection);
    }
    
    public function errno() {
        return mysql_errno($this->_connection);
    }
    
    public function insertId() {
        return mysql_insert_id($this->_connection);
    }

    public function escape($string) {
        return mysql_real_escape_string($string, $this->_connection);
    }

    public function fetch() {
        return mysql_fetch_assoc($this->_result);
    }
    
    public function freeResult() {
        return mysql_free_result($this->_result);
    }

    public function seek($row = 0) {
        return mysql_data_seek($this->_result, $row);
    }
}

?>



<?php

/**
* Абстрактный слой для работы с базой данных.
*
* Возможности:
* Поддержка плейсхолдеров.
* Типы плейсхолдеров.
* :tablename -> добавляем префикс к имени таблицы.
* {arg_num}?{flag} -> заменяет на значение.
* Подробнее см справку к методу prepare.
*
* Синтаксис.
* $dbo->{$method}($formatted_sql[, $arg1[, $arg2[, $_args]]]);
*
* Методы с полной поддержкой плейсхолдеров:
* prepare, pquery, one, row, rows
*
* Автоматизация рутинных операций, таких как: несложная выборка, INSERT, UPDATE, DELETE.
* Безопасное добавление и обновление данных(insert, update).
* Если нужно передать в методы insert, update строку как есть, то нужно для использовать метод raw:
* $entry['published'] = $db->raw('DATETIME');
* $db->insert('news', $entry);
*
*/
abstract class DB {
protected $_conf = array('prefix' => ''),
$_connection,
$_sql,
$_result,
$_args,
$_statistics = array('Queries' => 0, 'Execution Time' => 0, 'Total Execution Time' => 0);

abstract protected function _open();

abstract protected function _close();

abstract protected function _query($sql);

abstract public function fetch();

abstract public function numRows();

abstract public function affectedRows();

abstract public function error();

abstract public function errno();

abstract public function insertId();

abstract public function escape($string);

abstract public function freeResult();

abstract public function seek($row);

public function __construct($conf) {
$conf = array_change_key_case($conf);
$defaults = array('prefix' => '');
$conf = array_merge($defaults, $conf);
$this->_conf = $conf;
$this->_open();
}

public function getConf() {
return $this->_conf;
}

public function getSql() {
return $this->_sql;
}

public function getStatistics() {
return $this->_statistics;
}

public function table($name) {
return $this->_conf['prefix'] . $name;
}

/**
* Отправляет 'сырой' запрос, либо подготовленный.
*/
public function query($sql = null) {
if ($sql) {
$this->_sql = $sql;
}

if (is_resource($this->_result)) { // освобождаем предыдущий результат
$this->freeResult();
}

$this->_statistics['Queries'] += 1;
$this->_statistics['Execution Time'] = -microtime(1);
$this->_result = $this->_query($this->_sql);
$this->_statistics['Execution Time'] += microtime(1);
$this->_statistics['Total Execution Time'] += $this->_statistics['Execution Time'];

if (is_bool($this->_result) && !$this->_result) {
throw new Exception('SQL Error Code: ' . $this->errno() . ' - ' . $this->error() . '. Query: "' . $sql .'".');
}

return $this;
}

public function setCharset($charset) {
$this->query("SET NAMES $charset;");
}

public function fetchAll() {
$rows = array();

while ($row = $this->fetch()) {
$rows[] = $row;
}

return $rows;
}

Код: php
1.
2.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792200
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
    public function __construct($conf) {
        $conf = array_change_key_case($conf);
        $this->_conf = array_merge($this->_conf, $conf);
        $this->_open();
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792222
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
public function error() {
        return mysql_error($this->_connection);
    }
    
    public function errno() {
        return mysql_errno($this->_connection);
    }


редкостный бред.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792229
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow, угу тебе лучше знать

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function show_entry($entry) {
    $out = '';
    $out .= "<h2>{$entry['title']}</h2>";
    $out .= "<p>{$entry['description']}</p>";
    $out .= "Опубликовано: {$entry['published']}<br>";
    $out .= '<a href="news/' . $entry['id'] . '">Читать полностью &raquo;</a>';
    return $out;
}

$page = isset($_GET['page']) ? $_GET['page'] : null;

$buff = $db->select('news', 
            array(
                'columns' => 'id, title, description, published', 
                'limit' => 10, 
                'page' => $page, 
                'order' => 'id DESC'
            ))->fetchRender('show_entry');

echo $buff;



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public function fetchRender($callback) {
        $buff = '';
        
        while ($row = $this->fetch()) {
            $buff .= call_user_func($callback, $row);
        }
        
        return $buff;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792240
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обработки ошибок нету
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792263
авторобработки ошибок нету
гыгыгы !

to Няша ррр
MVC pattern уже изобретён - http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<?php
namespace abstracts;

    abstract class ModelPDO
    {        
        protected $conn = NULL;
        protected $stmt = NULL;

        public function __construct( $connection_string )
        {
            try
            {
                $this->conn = new \PDO( $connection_string );
            }
            catch( \PDOException $ex )
            {
                die( $ex->getMessage() );
            }           
        }

	public function __destruct()
	{
	    if( $this->conn ) $this->conn = NULL;
            if( $this->stmt ) $this->stmt = NULL;
	}
}
?>


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
<?php

namespace models;

class gallerySqlite extends \abstracts\ModelPDO {

    public function __construct() {
        parent::__construct('sqlite:app_data/gallery.sqlite');
    }

    public function getPictures() {

        $query = 'SELECT id,
                      description,
                      short_description
                  FROM pictures;';

        $this->stmt = $this->conn->prepare($query);
        $this->stmt->execute();

        return $this->stmt->fetchAll(\PDO::FETCH_ASSOC);
    }

    public function getPictureById($id) {

        $query = 'SELECT body,
                     type,
                     size
                  FROM pictures
                  WHERE id = :id;';

        $this->stmt = $this->conn->prepare($query);
        $this->stmt->execute(array((int) $id));

        return $this->stmt->fetch(\PDO::FETCH_ASSOC);
    }

    public function getModifedById($id) {

        $query = 'SELECT modifed
                  FROM pictures
                  WHERE id = :id;';

        $this->stmt = $this->conn->prepare($query);
        $this->stmt->execute(array((int) $id));

        return $this->stmt->fetchColumn();
    }

    public function insertNew(array $picture) {

        \my_validator::getInstance()
                ->isEmpty($_name = & $picture['name'], 'file')
                ->isLonger($_name, NULL, 150)
                ->isEmpty($_type = & $picture['type'])
                ->inArray($_type, NULL, array(
                                            'image/gif',
                                            'image/jpeg',
                                            'image/pjpeg',
                                            'image/png'
                                        ))
                ->isInt($_size = & $picture['size'])
                ->isLarger($_size, NULL, 153600)
                ->isEmpty($_error = & $picture['error'])
                ->isEmpty($_tmp_name = & $picture['tmp_name'])
                ->isEmpty($_description = & $picture['description'], 'description')
                ->isLonger($_description, NULL, 250)
                ->isEmpty($_short_description = & $picture['short_description'], 'short_description')
                ->isLonger($_short_description, NULL, 50);

        if (!\my_validator::hasErrors()) {
            $query = 'INSERT
                        INTO pictures (name, size, type, description, short_description, body)
                        VALUES (:name, :size, :type, :description, :short_description, :body);';

            $this->stmt = $this->conn->prepare($query);
            return $this->stmt->execute(array(
                        (string) $_name,
                        (int) $_size,
                        (string) $_type,
                        (string) $_description,
                        (string) $_short_description,
                        (string) file_get_contents($_tmp_name)
                    ));
        }
    }

    public function deleteById($id) {

        $query = 'DELETE
                  FROM pictures
                  WHERE id = :id;';

        $this->stmt = $this->conn->prepare($query);
        return $this->stmt->execute(array((int) $id));
    }

}

?>

...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792347
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrowобработки ошибок нету

Всё там есть
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792349
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как-то так...,

эта портянка не имеет никакого отношения ни к MVC, ни как демонстрационный пример обертки для базы.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792352
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няша ррр,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
    public function fetchOne() {
        $row = $this->fetch();
        
        if (is_array($row)) {
            return current($row);
        }
        
        return false;
    }
    
    public function fetchAll() {
        $rows = array();
        
        while ($row = $this->fetch()) {
            $rows[] = $row;
        }
        
        return $rows;
    } 
    
    public function fetchCol($name) {
        $rows = $this->fetchAll();
        $column = array();
        $num = $this->numRows();
        
        if ($num > 0) {
            if (!isset($rows[0][$name])) {
                return false;
            }
        
            for ($i = 0; $i < $num; ++$i) {
                $column[] = $rows[$i][$name];
            }
        }
        
        return $column;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792354
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
    public function select($table, $options = array()) {              
        static $defaults = array(
            'columns' => '*',
            'where' => '',
            'order' => '',
            'limit' => 0,
            'page' => 0,
        );
        
        if ($options) {
            $options = array_change_key_case($options);  
        }
        
        $options = array_merge($defaults, $options);
        
        $sql = "SELECT {$options['columns']}";      
        $sql .= ' FROM ' . $this->table($table);
        
        if ($options['where']) {
            $sql .= " WHERE {$options['where']}";
        }
        
        if ($options['order']) {
            $sql .= " ORDER BY {$options['order']}";
        }
        
        if ($options['limit'] > 0) {                      
            $limit = intval($options['limit']);
            $offset = $options['page'] > 0 ? $options['page'] * $limit - $limit :  0;
            $sql .= " LIMIT $offset, $limit";
        }
        
        $sql .= ';';
        $this->query($sql);
        return $this;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792374
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то кодо-блог...

Нельзя завести себе акк на профильном ресурсе и туда лить свои поделки?
Ту же форум! ОБСУЖДЕНИЕ, а свалка кода
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792384
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.Dragon,

Не придумал как можно сделать красиво, поэтому пришлось удалить, может кому понадобится

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
   public function single($table, $column, $where = null) {
        $this->select($table, array('columns' => $column, 'where' => $where));
        return $this->fetchOne();
    }
    
    public function col($table, $name, $where = null) {
        $this->select($table, array('columns' => $name, 'where' => $where));
        return $this->fetchCol($name);
    }
    
    public function assoc($table, $column, $where = null) {
        $this->select($table, array('columns' => 'id, ' . $column, 'where' => $where));
        $keys = $this->fetchCol('id');
        
        if ($keys === false) {
            return false;
        }
        
        $this->seek(0); // вернулись к первому ряду
        $values = $this->fetchCol($column);
        
        if ($values === false) {
            return false;
        }
        
        return array_combine($keys, $values);
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792388
авторэта портянка не имеет никакого отношения ни к MVC, ни как демонстрационный пример обертки для базы.
это то понятно...
кроме твоего учёного! мнения, больше, вообще, ничего не существует!!!

ПыСы (задумчиво): кто же тебя зомбировал на "обертки для базы" (C)?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37792557
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бот - генератор gavnoкода?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793029
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r u,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
<?php

abstract class DB {
    private $conf = array('database' => null, 'prefix' => null), $link, $temp;
    
    abstract public function open($database);
    
    abstract public function close();
    
    abstract public function query($sql);
    
    abstract public function escape();
    
    abstract public function insertId();
    
    abstract public function affectedRows();
    
    abstract public function numRows();
    
    public function __construct(array $conf) {
        $conf = array_change_key_case($conf);
        $this->conf = array_merge($this->conf, $conf);
        $this->open();
    }
    
    public function __destruct() {
        $this->close();
    }
    
    public function getConf() {
        return $this->conf;
    }
    
    public function table($name) {
        return $this->conf['prefix'] . $name; 
    }
    
    public function setCharset($charset) {
        $this->query("SET NAMES $charset;");
    }
    
    public function quote($string) {
        return "'" . $this->escape($string) . "'";
    }
    
    public function raw($string) {
        return new DB_Expression($string);
    }
    
    public function filterArray($data) {
        foreach ($data as &$value) {
            if (is_null($value)) {
                $value = 'NULL';
            }
            else if (is_bool($value)) {
                $value = $value ? 'TRUE' : 'FALSE';
            }
            else if (is_string($value)) {
                $value = $this->quote($value);
            }
        }
        
        return $data;
    }
    
    public function valuesStr($array) {
        $array = $this->filterArray($array);
        return implode(', ', $array);
    }
    
    public function setStr($array) {
        $array = $this->filterArray($array);      
        $str = '';
        
        foreach ($array as $key => $value) {
            $str .= $key . ' = ' . $value . ', ';
        }
        
        $str = substr($str, 0, -2);
        return $str;
    }
    
    protected function replaceHolders($matches) {
        if ($matches[1]) {
            return $this->table($matches[1]);
        }
        else {
            $value = $matches[2] ? $this->temp[$matches[2]] : next($this->temp);
            
            switch ($matches[3]) {
                case '':
                case 's':
                    return $this->quote($value);
                    
                case 'i':
                case 'd':
                    return intval($value);
                    
                case 'j':
                    return implode(', ', $value);

                case 'v':
                    return $this->valuesStr($value);

                case 'a':
                    return $this->setStr($value);
                    
                default:
                    throw new Exception("Unknown placeholder ?{$matches[3]}");
            }
        }
    }
    
    /**
     * $stmt = $db->prepare('SELECT * FROM :users WHERE login = ? AND password = ?;', $login, $password);
     * $result = $stmt->execute();
     * $user = $result->fetch();
     */
    public function prepare() {
        $this->temp = func_get_args();
        $pattern = '/:([a-z]+)|(\d*)?\?([a-z]?)/is';
        $callback = array($this, 'replaceHolders');
        $sql = preg_replace_callback($pattern, $callback, $this->temp[0]);
        $stmt = new DB_Statement($this, $sql);
        return $stmt;
    }
    
    public function select($table, $options = array()) {              
        static $defaults = array(
            'columns' => '*',
            'where' => '',
            'order' => '',
            'limit' => 0,
            'page' => 0,
        );
        
        if ($options) {
            $options = array_change_key_case($options);  
        }
        
        $options = array_merge($defaults, $options);
        
        $sql = "SELECT {$options['columns']}";      
        $sql .= ' FROM ' . $this->table($table);
        
        if ($options['where']) {
            $sql .= " WHERE {$options['where']}";
        }
        
        if ($options['order']) {
            $sql .= " ORDER BY {$options['order']}";
        }
        
        if ($options['limit'] > 0) {                      
            $limit = intval($options['limit']);
            $offset = $options['page'] > 0 ? $options['page'] * $limit - $limit :  0;
            $sql .= " LIMIT $offset, $limit";
        }
        
        $sql .= ';';
        $result = $this->query($sql);
        return $result;
    }
    
    public function find($table, $id, $columns = '*') {
        $table = $this->table($table);
        $id = intval($id);
        $result = $db->query("SELECT $columns FROM $table WHERE id = $id;");
    }
    
    public function insert($table, $row, $return_insert_id = true) {
        $sql = 'INSERT INTO ' . $this->table($table);
        $sql .= ' (' . implode(', ', array_keys($row)) . ')';
        $sql .= ' VALUES(' . $this->getValuesString(array_values($row)) . ');';
        $this->query($sql);
        
        if ($return_insert_id) {
            return $this->insertId();
        }
    }

    public function update($table, $set, $id) {
        $sql = 'UPDATE ' . $this->table($table);
        $sql .= ' SET ' . $this->getArrayString($set);
        $sql .= ' WHERE id = ' . intval($id);
        $this->query($sql);
    }

    public function delete($table, $id) {
        $sql = 'DELETE FROM ' . $this->table($table);
        $sql .= ' WHERE id = ' . intval($id);
        $this->query($sql);
    }
    
    public function countRows($table, $extra = 1) {
        $result = $db->query("SELECT COUNT(*) FROM $table WHERE $extra;");
        $num = (int) $result->fetchSingle();
        return $num;
    }
    
    public function countPages($table, $limit, $extra = 1) {
        if ($limit > 0) {
            $total = $this->countRows($table, $extra);
            
            if ($total === false) {
                return false;
            }
            
            return ceil($total / $limit);
        }
    }
}

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793042
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
protected $conf = array('database' => null, 'prefix' => null), $link, $temp;
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793046
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    public function insert($table, $row, $return_insert_id = true) {
        $sql = 'INSERT INTO ' . $this->table($table);
        $sql .= ' (' . implode(', ', array_keys($row)) . ')';
        [FIXED]$sql .= ' VALUES(' . $this->valuesStr(array_values($row)) . ');';[/FIXED]
        $this->query($sql);
        
        if ($return_insert_id) {
            return $this->insertId();
        }
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793065
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
    public function find($table, $id, $columns = '*') {
        $table = $this->table($table);
        $id = (int) $id;
        $result = $db->query("SELECT $columns FROM $table WHERE id = $id;");
    }
    
    public function insert($table, $values, $return_insert_id = true) {
        $table = $this->table($table);
        $columns = array_keys($row);
        $values = $this->valuesStr($row);
        $this->query("INSERT INTO $table ($columns) VALUES ($values);");
        
        if ($return_insert_id) {
            return $this->insertId();
        }
    }

    public function update($table, $set, $id) {
        $table = $this->table($table);
        $set = $this->setStr($set);
        $id = (int) $id;
        $this->query("UPDATE $table SET $set WHERE id = $id;");
    }

    public function delete($table, $id) {
        $table = $this->table($table);
        $id = (int) $id;
        $this->query("DELETE FROM $table WHERE id = $id;");
    }
    
    public function countRows($table, $extra = 1) {
        $table = $this->table($table);
        $result = $db->query("SELECT COUNT(*) FROM $table WHERE $extra;");
        $num = (int) $result->fetchSingle();
        return $num;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793268
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
$login = 'tester';
$password = 'test';
$stmt = $db->prepare('SELECT * FROM :users WHERE login = 2? AND password = 1?s;', $password, $login);
echo $stmt;



Код: sql
1.
SELECT * FROM t_users WHERE login = 'tester' AND password = 'test';
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793296
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
class MySQL extends DB {
    public function open($database = null) {
        if (!$this->link) {
            @$this->link = mysql_connect($this->conf['server'], $this->conf['username'], $this->conf['password']);
        
            if (!$this->link) {
                throw new Exception('No connection');
            }
        }
        
        if ($database) {
            $this->conf['database'] = $database;
        }
        
        if (!mysql_select_db($this->conf['database'], $this->link)) {
            throw new Exception('Database does not exist');
        }
    }
    
    public function close() {
        mysql_close($this->link);
        $this->link;
    }
    
    public function query($sql) {
        $result = mysql_query($sql, $this->link);
        
        if (is_resource($result)) {
            return new MySQL_Result($result);
        }
        
        if ($result === false) {
            throw new Exception('MySQL Error: ' . mysql_error($this->link) . '. Query: ' . $sql);
        }
    }
    
    public function escape($string) {
        return mysql_real_escape_string($string, $this->link);
    }
    
    public function affectedRows() {
        return mysql_affected_rows($this->link);
    }
    
    public function numRows() {
        return $this->affectedRows();
    }
    
    public function insertId() {
        return mysql_insert_id($this->link);
    }
}

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793337
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няша ррр,

у вас раньше аккаунта green_troll не было?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793537
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
РенатНяша ррр,

у вас раньше аккаунта green_troll не было?

нет
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793618
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
if (!$this->link) {
                throw new Exception('No connection');
            }


сбрить усы и расстрелять.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793700
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow, чо не так?
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793712
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все тут нормально

Код: php
1.
2.
3.
4.
5.
// при создании создании объекта подключаемся
$db = new MySQL($conf);

// а при вызове метода open, выбирает другую базу, в SQLite другой файл откроет
$db->open('forum');
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793723
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, да закройте эту тему! О чем она? Что тут обсуждается?
Флуд идет нескончаемой портянкой от автора...

Няша ррр
Еще раз - откройте для себя сайты для выкладывания своего кода! А тут тупо в ОДНОМ сообщении дайте туда ссылку. Или вообще вырежте из своей головы идею устраивать из sql.ru систему хранения исходников!

Какой-то психоз, чесслово...
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793744
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здесь нету флуда мне никто не мешает

Код: php
1.
2.
3.
$stmt = $db->prepare("SELECT alias, title FROM :pages;");
$entries = $stmt->execute()->fetchPairs();
var_dump($entries);



Код: html
1.
2.
3.
4.
5.
6.
7.
8.
array(3) {
  ["test"]=>
  string(33) "Тестовая страница"
  ["new"]=>
  string(8) "New Page"
  ["contacts"]=>
  string(16) "Контакты"
}



Может кто чо подскажет, подкинет идею

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
<?php

abstract class DB_result {   
    protected $result;
    
    abstract public function fetch();
    
    abstract public function fetchNum();
    
    abstract public function fetchBoth();
    
    abstract public function fetchSingle();
    
    abstract public function fetchAll();
    
    abstract public function numRows();
    
    abstract public function seek($row = 0);
    
    abstract public function free();
        
    public function __construct($result) {
        $this->result = $result;
    }
    
    public function _destruct() {
        if ($this->result) {
            $this->free();
        }
    }
    
    public function fetchCol($column) {
        $type = is_int($column) ? 'NUM' : 'ASSOC';
        $records = $this->fetchAll($type);     
        $list = array();
        $count = count($records);
        
        if ($count) {
            if (!isset($records[0][$column])) {
                return false;
            }
            
            for ($row = 0; $row < $count; ++$row) {
                $list[] = $records[$row][$column];
            }
        }
        
        return $list;
    }
    
    public function fetchPairs() {
        $records = $this->fetchAll('NUM');     
        $pairs = array();
        $count = count($records);
        
        if ($count) {
            if (count($records[0]) < 2) {
                return false;
            }
            
            for ($row = 0; $row < $count; ++$row) {
                $pairs[$records[$row][0]] = $records[$row][1];
            }
        }
        
        return $pairs;
    }
}

?>

<?php

class MySQL_Result extends DB_Result {
    public function fetch() {
        return mysql_fetch_assoc($this->result);
    }
    
    public function fetchNum() {
        return mysql_fetch_row($this->result);
    }
    
    public function fetchBoth() {
        return mysql_fetch_array($this->result);
    }
    
    public function fetchSingle() {
        return mysql_result($this->result, 0);
    }
    
    public function fetchAll($type = 'ASSOC') {
        $type = strtoupper($type);
        $fetch_func = 'mysql_fetch_';
        
        switch ($type) {
            case 'NUM':
                $fetch_func .= 'row';
                break;
                
             case 'BOTH':
                $fetch_func .= 'array';
                break;
                 
             case 'ASSOC':
             default:
                 $fetch_func .= 'assoc';
        }
             
        $rows = array();
        
        while ($row = $fetch_func($this->result)) {
            $rows[] = $row;
        }
        
        return $rows;
    }
    
    public function numRows() {
        return mysql_num_rows($this->result);
    }
    
    public function seek($row = 0) {
        mysql_data_seek($this->result, $row);
    }
    
    public function free() {
        mysql_free_result($this->result);
        $this->result = null;
    }
}

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793747
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автормне никто не мешает
Все-таки унылый тролль
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793750
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя я думаю надо все эти намы, босы выкинуть и fetchCol и fetchPairs(переименовать в fetchAssoc) засунуть в класс MySQL_Result и переписать их с использованием нативных функций, хотя экономия на спичках, но всё же
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793776
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
if (!$this->link) {
                throw new Exception('No connection');
            }


Няша рррScareCrow, чо не так?
как получив такой эксепшн вы поймете что на самом деле случилось? ошибок при подключении может быть много разных.
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793783
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow, а зачем их видеть? Если надо, то:


Код: php
1.
throw new Exception('MySQL Connection Error: ' . mysql_error($this->link));




Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<?php

abstract class DB_Result {   
    protected $result;
    
    abstract public function fetch();
    
    abstract public function fetchSingle();
    
    abstract public function fetchAll();
    
    abstract public function fetchCol($column = 0);
    
    abstract public function fetchPairs();
    
    abstract public function seek($row = 0);
    
    abstract public function free();
        
    public function __construct($result) {
        $this->result = $result;
    }
    
    public function _destruct() {
        if ($this->result) {
            $this->free();
        }
    }
}

?>



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
<?php

class MySQL_Result extends DB_Result {
    public function fetch() {
        return mysql_fetch_assoc($this->result);
    }
    
    public function fetchSingle() {
        return mysql_result($this->result, 0);
    }
    
    public function fetchAll() { 
        $rows = array();
        
        while ($row = mysql_fetch_assoc($this->result)) {
            $rows[] = $row;
        }
        
        return $rows;
    }
    
    public function fetchCol($column = 0) {
        $fetch_func = 'mysql_fetch_' . (is_int($column) ? 'row' : 'assoc');        
        $list = array();
        
        while ($row = $fetch_func($this->result)) {
            $list[] = $row[$column];
        }
        
        return $list;
    }
    
    public function fetchPairs() {    
        $pairs = array();
        
        while ($row = mysql_fetch_row($this->result)) {
            $array[$row[0]] = $row[1];
        }
        
        return $pairs;
    }
    
    public function numRows() {
        return mysql_num_rows($this->result);
    }
    
    public function seek($row = 0) {
        mysql_data_seek($this->result, $row);
    }
    
    public function free() {
        mysql_free_result($this->result);
        $this->result = null;
    }
}

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793787
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все классы

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
<?php

class MySQL extends DB {
    public function open($database = null) {
        if (!$this->link) {
            @$this->link = mysql_connect($this->conf['server'], $this->conf['username'], $this->conf['password']);
        
            if (!$this->link) {
                throw new Exception('No connection');
            }
        }
        
        if ($database) {
            $this->conf['database'] = $database;
        }
        
        if (!mysql_select_db($this->conf['database'], $this->link)) {
            throw new Exception('Database does not exist');
        }
    }
    
    public function close() {
        mysql_close($this->link);
        $this->link = null;
    }
    
    public function query($sql) {
        $result = mysql_query($sql, $this->link);
        
        if (is_resource($result)) {
            return new MySQL_Result($result);
        }
        
        if ($result === false) {
            throw new Exception('MySQL Error: ' . mysql_error($this->link) . '. Query: ' . $sql);
        }
    }
    
    public function escape($string) {
        return mysql_real_escape_string($string, $this->link);
    }
    
    public function affectedRows() {
        return mysql_affected_rows($this->link);
    }
    
    public function numRows() {
        return $this->affectedRows();
    }
    
    public function insertId() {
        return mysql_insert_id($this->link);
    }
}

?>



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
<?php

abstract class DB {
    protected $conf = array(
                  'database' => null, 
                  'prefix' => null
               ), 
               $link, 
               $temp;
    
    abstract public function open($database = null);
    
    abstract public function close();
    
    abstract public function query($sql);
    
    abstract public function escape($string);
    
    abstract public function insertId();
    
    abstract public function affectedRows();
    
    abstract public function numRows();
    
    public function __construct(array $conf) {
        $conf = array_change_key_case($conf);
        $this->conf = array_merge($this->conf, $conf);
        $this->open();
    }
    
    public function __destruct() {
        $this->close();
    }
    
    public function getConf() {
        return $this->conf;
    }
    
    public function table($name) {
        return $this->conf['prefix'] . $name; 
    }
    
    public function setCharset($charset) {
        $this->query("SET NAMES $charset;");
    }
    
    public function quote($string) {
        return "'" . $this->escape($string) . "'";
    }
    
    public function raw($string) {
        return new DB_Expression($string);
    }
    
    public function filterArray($array) {
        foreach ($array as &$value) {
            if (is_null($value)) {
                $value = 'NULL';
            }
            else if (is_bool($value)) {
                $value = $value ? 'TRUE' : 'FALSE';
            }
            else if (is_string($value)) {
                $value = $this->quote($value);
            }
        }
        
        return $array;
    }
    
    public function valueList($values) {
        $values = $this->filterArray($values);
        $str = implode(', ', $values);
        return $str;
    }
    
    public function fieldList($fields) {
        $array = $this->filterArray($fields);      
        $str = '';
        
        foreach ($fields as $key => $value) {
            $str .= $key . ' = ' . $value . ', ';
        }
        
        $str = substr($str, 0, -2);
        return $str;
    }
    
    protected function replaceHolders($matches) {
        if ($matches[1]) {
            return $this->table($matches[1]);
        }
        else {
            $value = $matches[2] ? $this->temp[$matches[2]] : next($this->temp);
            
            switch ($matches[3]) {
                case '':
                case 's':
                    return $this->quote($value);
                    
                case 'i':
                case 'd':
                    return intval($value);
                    
                case 'j':
                    return implode(', ', $value);

                case 'v':
                    return $this->valueList($value);

                case 'f':
                    return $this->fieldList($value);
                    
                default:
                    throw new Exception("Unknown placeholder ?{$matches[3]}");
            }
        }
    }
    
    /**
     * Производит поиск и замену в SQL-строке плейсхолдеров, возвращает объект DB_Statement.
     *
     * $login = 'tester';
     * $password = 'test';
     * $stmt = $db->prepare('SELECT * FROM :users WHERE login = 2? AND password = 1?s;', $password, $login);
     * {номер_аргумента}?{флаг}
     * :      -> добавит преффикс к таблице
     * ?, ?s  -> экранированная строка в кавычках
     * ?i, ?d -> число
     * ?j     -> значения через запятую без фильтрации
     * ?v     -> значения через запятую c фильтрацие
     * ?f     -> поле = значение, ... с фильтрацией
     */
    public function prepare() {
        $this->temp = func_get_args();
        $pattern = '/:(\w+)|(\d*)\?([a-z]?)/s';
        $callback = array($this, 'replaceHolders');
        $sql = preg_replace_callback($pattern, $callback, $this->temp[0]);
        $stmt = new DB_Statement($this, $sql);
        return $stmt;
    }
    
    public function find($table, $id, $columns = '*') {
        $table = $this->table($table);
        $id = (int) $id;
        $result = $db->query("SELECT $columns FROM $table WHERE id = $id;");
    }
    
    public function insert($table, $row, $return_insert_id = true) {
        $table = $this->table($table);
        $columns = implode(', ', array_keys($row));
        $values = $this->valueList($row);
        $this->query("INSERT INTO $table ($columns) VALUES ($values);");
        
        if ($return_insert_id) {
            return $this->insertId();
        }
    }

    public function update($table, $fields, $id) {
        $table = $this->table($table);
        $set = $this->fieldList($fields);
        $id = (int) $id;
        $this->query("UPDATE $table SET $set WHERE id = $id;");
    }

    public function delete($table, $id) {
        $table = $this->table($table);
        $id = (int) $id;
        $this->query("DELETE FROM $table WHERE id = $id;");
    }
    
    public function count($table, $extra = 1) {
        $table = $this->table($table);
        $result = $this->query("SELECT COUNT(*) FROM $table WHERE $extra;");
        $num = (int) $result->fetchSingle();
        return $num;
    }
}

?>




Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?php

class DB_Expression {
    private $value;
    
    public function __construct($value) {
        $this->value = $value;
    }
    
    public function __toString() {
        return $this->value;
    }
}

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793788
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?php

class DB_Statement {
    private $db, $sql;
    
    public function __construct($db, $sql) {
        $this->db = $db;
        $this->sql = $sql;
    }
    
    public function execute() {
        return $this->db->query($this->sql);
    }
    
    public function __toString() {
        return $this->sql;
    }
}

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793804
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Класс DB_Expression применяется для создания хука при фильтрации. При использовании $db->insert($table, $fields) все значения полей фильтруются, а строки эскейпется. Обходится так:

Код: php
1.
2.
$entry['published'] = $db->raw('CURRENT_TIMESTAMP');
$db->insert('news', $entry);



DB_Statement используется для сокращения кода:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$stmt = $db->prepare("SELECT alias, title FROM :pages;");
$entries = $stmt->execute()->fetchPairs();

// Хотя и так можно
$sql = $db->prepare("SELECT alias, title FROM :pages;");
$entries = $db->query($sql)->fetchPairs(); // правда ф-ии query надо модифицировать

    public function query($sql) {
        $result = mysql_query($sql, $this->link);
        
        if (is_resource($result)) {
            return new MySQL_Result($result);
        }
        
        if ($result === false) {
            throw new Exception('MySQL Error: ' . mysql_error($this->link) . '. Query: ' . $sql);
        }
        
        return $this;
    }
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793808
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bootstrap.php

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?php

function __autoload($class) {
    $path = __DIR__ . '/classes/' . strtolower($class) . '.php';
    if (file_exists($path)) {
        require_once($path);
    }
    else {
        throw new Exception("Class $class not found.");
    }
}

mb_internal_encoding('utf-8');

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793813
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имя_класса.php в папку lib/classes и можно проверять

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?php

require_once('lib/bootstrap.php');

$conf['server'] = 'localhost';
$conf['username'] = 'Пользователь';
$conf['password'] = 'Пароль';
$conf['database'] = 'Имя базы';
$conf['prefix'] = 'prefix_';

$db = new MySQL($conf);
$db->setCharset('utf8');

?>
...
Рейтинг: 0 / 0
[php] Фильтрация переменных в классе-обертке для БД
    #37793831
Няша ррр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public function fetchPairs() {    
        $pairs = array();
        
        while ($row = mysql_fetch_row($this->result)) {
            $pairs[$row[0]] = $row[1];
        }
        
        return $pairs;
    }



Модератор: Топик закрыт за отсутствием обсуждения.
Топикстартеру: впредь воздержитесь от использования форума не по назначению. Считайте это предупреждение последним, далее последует бан.
...
Рейтинг: 0 / 0
90 сообщений из 90, показаны все 4 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [php] Фильтрация переменных в классе-обертке для БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]