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

Фанат

oncle terrible
Команда форума
Спасибо за ответ. Да, $db передал через global. CMS паблик, естественно косяков много, для начала хотя бы основной функционал работы с бд перенести.
Да, но проблема в том, что работа с БД не стала безопаснее.
То есть, такой перенос попросту не имеет смысла.
 

Фанат

oncle terrible
Команда форума
Т.е. даже если по логике должна вернуться одна строка, все равно нужно использовать limit?
Лимит здесь совсем не при чем.
Речь о данных, передаваемых в запрос.
просто заменить все вызовы mysql_query на $db->query() не сделает код безопаснее ни на йоту
 

karnas

Новичок
Лимит здесь совсем не при чем.
Речь о данных, передаваемых в запрос.
просто заменить все вызовы 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)
 

Фанат

oncle terrible
Команда форума
Я конечно практически новичек в этом деле, но зачем статические данные выносить на фильтрацию?
Статические не нужно.
Динамические естественно передаю на фильтрацию ?i, ?s и т.д.
если так - то да ,все правильно. Просто я не увидел, чтобы функция paginate() поддерживала передачу параметров. Соответственно, предполагаю, что запрос в нее пердедается по-старинке, вместе с данными. Ведь это же функция общего назначения, не только для этого одного статического запроса?
 
Последнее редактирование:

karnas

Новичок
Статические не нужно.

Но если функция 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;
 

Фанат

oncle terrible
Команда форума
Передается через GET одна переменная - номер страницы.
Для этого запроса - да.
А для других этот класс не используется?
PHP:
$this->total_rows = $db->numRows($all_rs );
я уже писал выше, что выбирать все записи в таблице только для того, чтобы посчитать их - это АДЪ и убьет тебе сервер
 

karnas

Новичок
Для этого запроса - да.
А для других этот класс не используется?

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

Фанат

oncle terrible
Команда форума
Для других не используется. Согласен, нагрузка большая будет если записей много. Другого варианта пока не нашел.. По даннной ссылке почитал, но с трудом пока представляю как перейти на выборку с лимитом, что бы показать общее число страниц.
Непонятно тогда, зачем класс городить.

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

karnas

Новичок
Непонятно тогда, зачем класс городить.

Не понимаю, о каком лимите ты все время говоришь.
Задача - запросить количество строк у базы. Не лимит добавить, а количество строк запросить. Неужели непонятно?
Ход мыслей верный?) 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()");
Зачем написан отдельный класс, не знаю.
 

Вурдалак

Продвинутый новичок
Я тут использую библиотеку @Фанат'а, запрос чё-то тормозит, индексов может быть не хватает, помогите мне.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ход мыслей верный?) SQL_CALC_FOUND_ROWS вернет общее количество строк, в след. запросе забираем общее количество строк.
Далее уже будет запрос с лимитом для получения записей с 1-й страницы по дефолту и вывод разбивки по страницам.
да, ход верный, отлично идет, жаль, конечно, что ошибка в генах немного сбила направление эволюции
 

WMix

герр M:)ller
Партнер клуба
В зенде пагинация, в смысле количество строк запроса реализованно через
select count(*) from ( $query ) аs t

Какие плюсы минусы кроме простоты реализации? И возможности подставить любой запрос
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
В зенде пагинация, в смысле количество строк запроса реализованно через
select count(*) from ( $query ) аs t

Какие плюсы минусы кроме простоты реализации? И возможности подставить любой запрос
Плюсы ты более-менее описал.
Главный минус тут в том, что в $query может быть куча join'ов, подзапросов и т.п., которые нужны для выборки данных, но не влияют на количество возвращаемых строк.
 

WMix

герр M:)ller
Партнер клуба
ну да, так и делаю, наджойнил билдером запрос и отдал его на пагинацию. и мне совсем не хочется думать о 2м простом запросе где нужен только count(*). думаешь криво?
 

MiksIr

miksir@home:~$
Да ваще забить на всякие count(). Или все id выбирать и их потом в пагинацию, и кешировать удобнее, или тупо на количество забить, "последняя страница" нафих никому не нужна. В крайнем случае оценку использовать из статистики.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Да ваще забить на постраничник, выводить подряд одним списком, индексировать поисковикам удобнее, или тупо выводить первые 100 позиций, последние нафих никому не нужны. В крайнем случае давать ссылку на страницу с полным списком.
 

MiksIr

miksir@home:~$
Да не, все посетители каталогов получая список на 534 страниц обязательно хотят с первой перейти на 532-ю. Британские ученые доказали.
 

WMix

герр M:)ller
Партнер клуба
или тупо выводить первые 100 позиций
это как раз совсем не глупо, но далеко не всегда возможно, убери пагинацию с форума... но тема исчерпана, я было ожидал услышать что это хреновый способ select в select заворачивать
 
Сверху