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

BMW M6

Новичок
Фанат
index.php
PHP:
<?php
	require_once('includes/init.php');
	$db = new SafeMySQL();
	$data = $db->getAll("SELECT id, type, type_image, name, ip, price FROM storage");
	include('templates/main.tpl');
?>
main.tpl
PHP:
<td width='250' align='left' class='qwe sorting_1'><a href='buy.php?id='<?=foreach ($data as $row){ echo $row[id];}?>'><?=foreach ($data as $row){ echo $row[name];}?></a></td>
Сделал вот так и не работает что то всё ровно(
У меня одна надежда на вас!
 

Фанат

oncle terrible
Команда форума
ты бы хоть открыл HTML исходник этого ужаса.
Что, по-втоему, должна означать ссылка
PHP:
buy.php?id=идальшевсеименаизбазы
?
Вот же, есть пример, как выводить ссылки в шаблоне:
http://www.phpfaq.ru/tpl#example
 

BMW M6

Новичок
Большое вам спасибо за такой класс для работы с mysql.
Чуть по чуть потыкав я добился работы.
Ещё раз спасибо!
 

BMW M6

Новичок
Вот, что было.
PHP:
$query = $db->query("INSERT INTO users_premium (tariff_id,server_id,steamid,wmid,purse) VALUES ('$tariffid','$serverid','$steamid','$wmid','$purse')");
Вот, что стало
PHP:
$query = $db->query("INSERT INTO users_premium (tariff_id,server_id,steamid,wmid,purse) VALUES (?i,?i,?s,?s,?s)", $tariffid, $serverid, $steamid, $wmid, $purse);
 

Ilya_Nsk

Новичок
Отличная работа. Имеется вопрос простой: как-то при изучении документации не отложилась обработка ошибок. Не фатальных падений, хотя и их на начальном этапе надо бы ловить, а, например, попыток записать повторяющееся значение в поле уникальных данных. Кусочек бы кода..
P.S. а товарищу BMW помог бы еще плейсхолдер ?n (важная вещь при написании универсального в рамках базы редактора записей)
 

Фанат

oncle terrible
Команда форума
Отличная работа. Имеется вопрос простой: как-то при изучении документации не отложилась обработка ошибок. Не фатальных падений, хотя и их на начальном этапе надо бы ловить, а, например, попыток записать повторяющееся значение в поле уникальных данных. Кусочек бы кода..
PHP:
$db = new safeMysql(['errmode' => 'exception']);
собственно, достаточно

Но вот конкретно для случая с дублимрующимся уникальным значением я бы как раз делал
INSERT IGNORE
и проверял таки affectedRows
 

Ilya_Nsk

Новичок
Ух ты, как Вы оперативно!!!
В классе ведь подхватываются сообщения от MySQL? getStat спасет начинающего пыхапэшника?
 

Фанат

oncle terrible
Команда форума
Ух ты, как Вы оперативно!!!
В классе ведь подхватываются сообщения от MySQL? getStat спасет начинающего пыхапэшника?
Вряд ли.
getStat - это чисто для статистики.

сообщения от MySQLтранслируются в ошибки РНР.
Но если нружно какое-то особенное сообщение, то можно дописать
 

BMW M6

Новичок
Не могу понять как посчитать кол-во записий id в базе?

Я делаю вот так:
PHP:
$db = MySQL::getInstance();

$result = $db->getRow("SELECT id FROM shop_players ORDER BY id DESC LIMIT 1");

return $result['id'];
Но это не правильно.
Как посчитать с помощью COUNT?
Точнее помогите составить правильный запрос для этого класса!
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Что за изврат? А если удалят один из рядов? Счетчик будет уже неверный.

Как посчитать с помощью COUNT?
Так же как и без класса.
 

Фанат

oncle terrible
Команда форума
vasinsky, рекомендую подушку на стул подкладывать. Не так сильно болеть будет.
 

karnas

Новичок
Здравствуйте. Перевожу небольшую CMS на работу через SafeMySQL. Встал вопрос с пагинацией, не могу понять где косяк.
В общем пока писал пост, попутно вносил изменения и все заработало. Если не трудно, ткните если что то не так сделал.
PHP:
$conn = mysql_connect($localhost, $username, $password) or die('Error connecting to mysql');
Оригинал вывод:
PHP:
<div id="statistic">
    <?
        $sql = "SELECT * FROM stat where DATE(date) = DATE(NOW()) ORDER BY date DESC";
        $res = mysql_query($sql) or die(mysql_error());
        $numRows = mysql_num_rows($res);
        if ((mysql_num_rows($res)) > 0){
        $pager = new PS_Pagination($conn, $sql, 20, 20, "");
      ?>
        <div>Всего записей - <?=$numRows;?></div>
        <div>
    <table>
    //html
            <?
              $countLoop = 0;
              $rs = $pager->paginate();
                if(!$rs) die(mysql_error());
                    while($row = mysql_fetch_array($rs)){
            echo "<tr><td>{$row['id']}</td>........</tr>";
            $countLoop++; } ?>
        </table>
        </div>
<?= $pager->renderFullNav();?>   
            <? } else {    echo "<div>За данный период времени статистики нет!</div>";} ?>
    </div>
Скрипт пагинации:
PHP:
    function PS_Pagination($connection, $sql, $rows_per_page = 10, $links_per_page = 5, $append = "") {
        $this->conn = $connection;
        $this->sql = $sql;
        $this->rows_per_page = (int)$rows_per_page;
        if (intval($links_per_page ) > 0) {
            $this->links_per_page = (int)$links_per_page;
        } else {
            $this->links_per_page = 5;
        }
        $this->append = $append;
        $this->php_self = htmlspecialchars($_SERVER['PHP_SELF'] );
        if (isset($_GET['turn'] )) {
            $this->turn = intval($_GET['turn'] );
        }
    }

    function paginate() {
        if (! $this->conn || ! is_resource($this->conn )) {
            if ($this->debug)
                echo "MySQL connection missing<br />";
            return false;
        }
       
        $all_rs = @mysql_query($this->sql );
        if (! $all_rs) {
            if ($this->debug)
                echo "SQL query failed. Check your query.<br /><br />Error Returned: " . mysql_error();
            return false;
        }
        $this->total_rows = mysql_num_rows($all_rs );
        @mysql_close($all_rs );
       
        if ($this->total_rows == 0) {
            if ($this->debug)
                echo "Query returned zero rows.";
            return FALSE;
        }
       
        $this->max_pages = ceil($this->total_rows / $this->rows_per_page );
        if ($this->links_per_page > $this->max_pages) {
            $this->links_per_page = $this->max_pages;
        }
       
        if ($this->turn > $this->max_pages || $this->turn <= 0) {
            $this->turn = 1;
        }
       
        $this->offset = $this->rows_per_page * ($this->turn - 1);
       
        $rs = @mysql_query($this->sql . " LIMIT {$this->offset}, {$this->rows_per_page}" );
        if (! $rs) {
            if ($this->debug)
                echo "Pagination query failed. Check your query.<br /><br />Error Returned: " . mysql_error();
            return false;
        }
        return $rs;
    }

// Дальше вывод
Что я сделал.
Вывод:
Плюс убрал проверку подключения к бд из $pager = new PS_Pagination($sql, 20, 20, "");
PHP:
<div id="statistic">
    <?
        $sql = "SELECT * FROM stat where DATE(date) = DATE(NOW()) ORDER BY date DESC"; 
        $res = $db->query($sql);
        $numRows = $db->numRows($res);
        if ($numRows > 0){
        $pager = new PS_Pagination($sql, 20, 20, "");
      ?>
        <div>Всего записей - <?=$numRows;?></div>
        <div>
    <table>
    //html
            <?
              $countLoop = 0;
              $rs = $pager->paginate();
                    while($row = $db->fetch($rs)){
            echo "<tr><td>{$row['id']}</td>........</tr>";
            $countLoop++; } ?>
        </table>
        </div>
<?= $pager->renderFullNav();?>   
            <? } else {    echo "<div>За данный период времени статистики нет!</div>";} ?>
    </div>
Скрипт пагинации:
PHP:
    function PS_Pagination($sql, $rows_per_page = 10, $links_per_page = 5, $append = "") {
        $this->sql = $sql;
        $this->rows_per_page = (int)$rows_per_page;
        if (intval($links_per_page ) > 0) {
            $this->links_per_page = (int)$links_per_page;
        } else {
            $this->links_per_page = 5;
        }
        $this->append = $append;
        $this->php_self = htmlspecialchars($_SERVER['PHP_SELF'] );
        if (isset($_GET['turn'] )) {
            $this->turn = intval($_GET['turn'] );
        }
    }
   

    function paginate() {
        $db = new SafeMysql();
        //Find total number of rows
        $all_rs = $db->query($this->sql );
        if (! $all_rs) {
            if ($this->debug)
                echo "SQL query failed. Check your query.<br /><br />Error";
            return false;
        }
        $this->total_rows = $db->numRows($all_rs );
       
        if ($this->total_rows == 0) {
            if ($this->debug)
                echo "Query returned zero rows.";
            return FALSE;
        }
       
        $this->max_pages = ceil($this->total_rows / $this->rows_per_page );
        if ($this->links_per_page > $this->max_pages) {
            $this->links_per_page = $this->max_pages;
        }
       
        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
Команда форума
Здравствуйте. Перевожу небольшую CMS на работу через SafeMySQL. Встал вопрос с пагинацией, не могу понять где косяк.
В коде очень много косяков, не связанных напрямую с библиотекой
Так что для начала надо посмотреть, как делается базовая пагинация через SafeMysql
И в первую очередь навсегда забыть про запрос всех строк без лимита - это адская жесть.

Вторым пунктом убрать создание экземпляра класса в каждой функции. Объект $db надо создавать ровно 1 раз и потом передвать пусть хоть через global
 

karnas

Новичок
В коде очень много косяков, не связанных напрямую с библиотекой
Так что для начала надо посмотреть, как делается базовая пагинация через SafeMysql
И в первую очередь навсегда забыть про запрос всех строк без лимита - это адская жесть.

Вторым пунктом убрать создание экземпляра класса в каждой функции. Объект $db надо создавать ровно 1 раз и потом передвать пусть хоть через global
Спасибо за ответ. Да, $db передал через global. CMS паблик, естественно косяков много, для начала хотя бы основной функционал работы с бд перенести.
 
Сверху