Класс для безопасной работы с MySQL

Спасибо за ответ. Да, $db передал через global. CMS паблик, естественно косяков много, для начала хотя бы основной функционал работы с бд перенести.
Да, но проблема в том, что работа с БД не стала безопаснее.
То есть, такой перенос попросту не имеет смысла.
 
Т.е. даже если по логике должна вернуться одна строка, все равно нужно использовать limit?
Лимит здесь совсем не при чем.
Речь о данных, передаваемых в запрос.
просто заменить все вызовы mysql_query на $db->query() не сделает код безопаснее ни на йоту
 
Лимит здесь совсем не при чем.
Речь о данных, передаваемых в запрос.
просто заменить все вызовы mysql_query на $db->query() не сделает код безопаснее ни на йоту
Я конечно практически новичек в этом деле, но зачем статические данные выносить на фильтрацию?
Динамические естественно передаю на фильтрацию ?i, ?s и т.д.
К примеру в этом запросе одна динамическая переменная, все остальное статика. Да и запрос выполняется напрямую из скрипта и с POST-GET запроса его не выполнить, что бы изменить второе условие u.time_zone = t.id. Расскажите в чем я ошибаюсь если не трудно.
PHP:
$db->getRow("SELECT * FROM users AS u JOIN time AS t ON u.site = ?s AND u.time_zone = t.id", $site)
 
Я конечно практически новичек в этом деле, но зачем статические данные выносить на фильтрацию?
Статические не нужно.
Динамические естественно передаю на фильтрацию ?i, ?s и т.д.
если так - то да ,все правильно. Просто я не увидел, чтобы функция paginate() поддерживала передачу параметров. Соответственно, предполагаю, что запрос в нее пердедается по-старинке, вместе с данными. Ведь это же функция общего назначения, не только для этого одного статического запроса?
 
Последнее редактирование:
Статические не нужно.

Но если функция paginate() не поддерживает передачу параметров, то я и предполагаю, что запрос в нее пердедается по-старинке, вместе с данными. Ведь это же функция общего назначения, не только для этого одного статического запроса?
Вырезка из paginate.

Передается через GET одна переменная - номер страницы.
Устанавливаем номер страницы по дефолту 1. Т.е. если ошибка, вернет данные первой страницы.
Далее узнаем количество записей всего, делим на нужно количество записей на стр., получаем количество страниц.
Используется статический запрос.
Далее выборка из бд. Даже тут по идее данные для лимита можно было не выносить на фильтрацию,
так как единственная числовая переменная уже фильтровалась выше. На этом работа с mysql в paginate закончена.
PHP:
var $turn = 1;
        if (isset($_GET['turn'] )) {
            $turn = intval($_GET['turn'] );
            if ($turn){$this->turn = $turn;}
        }
$all_rs = $db->query($this->sql );
$this->total_rows = $db->numRows($all_rs );

        if ($this->turn > $this->max_pages || $this->turn <= 0) {
            $this->turn = 1;
        }
$this->offset = $this->rows_per_page * ($this->turn - 1);
        $rs = $db->query($this->sql .' LIMIT ?i, ?i',$this->offset, $this->rows_per_page);
        if (! $rs) {
            if ($this->debug)
                echo "Pagination query failed. Check your query.<br /><br />Error...";
            return false;
        }
        return $rs;
 
Передается через GET одна переменная - номер страницы.
Для этого запроса - да.
А для других этот класс не используется?
PHP:
$this->total_rows = $db->numRows($all_rs );
я уже писал выше, что выбирать все записи в таблице только для того, чтобы посчитать их - это АДЪ и убьет тебе сервер
 
Для этого запроса - да.
А для других этот класс не используется?

я уже писал выше, что выбирать все записи в таблице только для того, чтобы посчитать их - это АДЪ и убьет тебе сервер
Для других не используется. Согласен, нагрузка большая будет если записей много. Другого варианта пока не нашел.. По даннной ссылке почитал, но с трудом пока представляю как перейти на выборку с лимитом, что бы показать общее число страниц.
 
Для других не используется. Согласен, нагрузка большая будет если записей много. Другого варианта пока не нашел.. По даннной ссылке почитал, но с трудом пока представляю как перейти на выборку с лимитом, что бы показать общее число страниц.
Непонятно тогда, зачем класс городить.

Не понимаю, о каком лимите ты все время говоришь.
Задача - запросить количество строк у базы. Не лимит добавить, а количество строк запросить. Неужели непонятно?
 
Непонятно тогда, зачем класс городить.

Не понимаю, о каком лимите ты все время говоришь.
Задача - запросить количество строк у базы. Не лимит добавить, а количество строк запросить. Неужели непонятно?
Ход мыслей верный?) SQL_CALC_FOUND_ROWS вернет общее количество строк, в след. запросе забираем общее количество строк.
Далее уже будет запрос с лимитом для получения записей с 1-й страницы по дефолту и вывод разбивки по страницам.

PHP:
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM  table where DATE(date) = DATE(NOW()) ORDER BY date DESC";
///
$all_rs = $db->query($this->sql );
///
$this->total_rows = $db->getOne("SELECT FOUND_ROWS()");

Зачем написан отдельный класс, не знаю.
 
Я тут использую библиотеку @Фанат'а, запрос чё-то тормозит, индексов может быть не хватает, помогите мне.
 
Ход мыслей верный?) SQL_CALC_FOUND_ROWS вернет общее количество строк, в след. запросе забираем общее количество строк.
Далее уже будет запрос с лимитом для получения записей с 1-й страницы по дефолту и вывод разбивки по страницам.
да, ход верный, отлично идет, жаль, конечно, что ошибка в генах немного сбила направление эволюции
 
В зенде пагинация, в смысле количество строк запроса реализованно через
select count(*) from ( $query ) аs t

Какие плюсы минусы кроме простоты реализации? И возможности подставить любой запрос
 
В зенде пагинация, в смысле количество строк запроса реализованно через
select count(*) from ( $query ) аs t

Какие плюсы минусы кроме простоты реализации? И возможности подставить любой запрос
Плюсы ты более-менее описал.
Главный минус тут в том, что в $query может быть куча join'ов, подзапросов и т.п., которые нужны для выборки данных, но не влияют на количество возвращаемых строк.
 
ну да, так и делаю, наджойнил билдером запрос и отдал его на пагинацию. и мне совсем не хочется думать о 2м простом запросе где нужен только count(*). думаешь криво?
 
Да ваще забить на всякие count(). Или все id выбирать и их потом в пагинацию, и кешировать удобнее, или тупо на количество забить, "последняя страница" нафих никому не нужна. В крайнем случае оценку использовать из статистики.
 
Да ваще забить на постраничник, выводить подряд одним списком, индексировать поисковикам удобнее, или тупо выводить первые 100 позиций, последние нафих никому не нужны. В крайнем случае давать ссылку на страницу с полным списком.
 
Да не, все посетители каталогов получая список на 534 страниц обязательно хотят с первой перейти на 532-ю. Британские ученые доказали.
 
или тупо выводить первые 100 позиций
это как раз совсем не глупо, но далеко не всегда возможно, убери пагинацию с форума... но тема исчерпана, я было ожидал услышать что это хреновый способ select в select заворачивать
 
Сверху