Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: работа с mysql
 
 автор: nikita2206   (22.06.2009 в 15:08)   письмо автору
 
 

вот накопился у меня класс для работы с mysql, хотелось бы услышать конструктивную критику:
<?php
class MySQL {
    private 
$cacheQueries = array();
    private 
$iterateQueries = array();
    public function 
add_report($mysql_error$query){
        
$report 
            
$mysql_error."\r\n<br />".
            
'SQL Query: «'.$query."»\r\n<br />".
            
'Date: «'.date('c').'»; IP: '.$_SERVER['REMOTE_ADDR'].";\r\n<br />".
            
'Request URI: «'.$_SERVER['REQUEST_URI']."»\r\n<br />\r\n<br />"
        
;
        
$verify = @file_put_contents(ROOT.MYSQL_LOGfile_get_contents(ROOT.MYSQL_LOG).$report);
        return 
$verify == FALSE TRUE;
    }
    private function 
formatString($args$numargs){
        
$query $args[0];
        if(
strpos($query'?') !== FALSE){
            
$query2 explode('?'$query);
            
$query  NULL;
            
$count  count($query2);
            for(
$i 0$i $count$i++){
                
$arg = ($i 1) < count($query2) ? @$args[$i $numargs] : NULL;
                
$arg is_numeric($arg) || empty($arg) ? $arg '\''.mysql_real_escape_string($arg).'\'';
                
$query .= $query2[$i].$arg;
            }
        }
        return 
$query;
    }    
    public function 
query($query){
        
$query  $this->formatString(func_get_args(), 1);
        
$result mysql_query($query) or $this->add_report(mysql_error(), $query);
        return 
$result;
    }
    public function 
insert($tablename$row_value){
        
$rows   '';
        
$values '';
        foreach(
$row_value as $key => $value){
            
$values .= is_numeric($value) ? $value.', ' '\''.mysql_real_escape_string($value).'\', ';
            
$rows   .= '`'.$key.'`, ';
        }
        
$rows mb_substr($rows0, -2);
        
$values mb_substr($values0, -2);
        
$query 'INSERT INTO `'.$tablename.'` ('.$rows.') VALUES ('.$values.')';
        return 
mysql_query($query) or $this->add_report(mysql_error(), $query);
        echo 
$query;
    }
    public function 
update($postquery$row_value$tablename){
        
$postquery $this->formatString(func_get_args(), 3);
        
$sets '';
        foreach(
$row_value as $key => $value)
        
$sets .= '`'.$key.'`='.(is_numeric($value) ? $value '\''.mysql_real_escape_string($value).'\'').', ';
        
$sets  mb_substr($sets0, -2);
        
$query 'UPDATE `'.$tablename.'` SET '.$sets.' '.$postquery;
        return 
mysql_query($query) or $this->add_report(mysql_error(), $query);
    }
    public function 
simpleQuery($query$rows 0){
        
$query $this->formatString(func_get_args(), 2);
        
$result mysql_query($query) or $this->add_report(mysql_error(), $query);
        if(!
mysql_num_rows($result)) return FALSE;
        
$row    mysql_fetch_array($result);
        
$fields NULL;
        
mysql_free_result($result);
        if(
is_array($rows))
            foreach(
$rows as $val)
                
$fields[$val] = @$row[$val];
        else{
            if(!
$rows$fields $row;
            else 
$fields = @$row[$rows];
        }
        return 
$fields;
    }
    public function 
cacheQuery($query){
        
$query $this->formatString(func_get_args(), 1);
        if(
array_key_exists(md5($query), $this->cacheQueries)) $row $this->cacheQueries[md5($query)];
        else{
            
$result mysql_query($query) or $this->add_report(mysql_error(), $query);
            
$this->cacheQueries[md5($query)] = $row mysql_fetch_array($result);
        }
        return 
$row;
    }
    public function 
iterateQuery($query){
        
$query $this->formatString(func_get_args(), 1);
        
$hash  md5($query);
        if(!
array_key_exists($hash$this->iterateQueries))
            
$this->iterateQueries[$hash] = mysql_query($query) or $this->add_report(mysql_error(), $query);
        
$row mysql_fetch_array($this->iterateQueries[$hash]);
        if(!
$row) unset($this->iterateQueries[$hash]);
        return 
$row;
    }
}
?>


примерно так выглядет его использование:
<?
$mysql 
= new MySQL;

$result $mysql->query('SELECT * FROM `table` WHERE `id` = ?'5); // Отправит запрос к базе: SELECT * FROM `table` WHERE `id` = 5
$result $mysql->query('SELECT * FROM `table` WHERE `name` = ?''Имя'); // Отправит запрос: SELECT * FROM `table` WHERE `name` = 'Имя'

$mysql->insert('tableName', array('name' => 'Имя''lastname' => 'Фамилия''age' => 30));
// Делает запрос: INSERT INTO `tableName` (`name`, `lastname`, `age`) VALUES ('Имя', 'Фамилия', 30)

$mysql->update('WHERE `id` = ?', array('name' => 'НовоеИмя''age' => 31), 'tableName'346);
// Сделает запрос: UPDATE `tableName` SET `name`='НовоеИмя', age=31 WHERE `id` = 346

/* tableName:
 * +--+----+---+
 * |id|name|age|
 * +--+----+---+
 * |5 |Влад|30 |
 * +--+----+---+
 * |9 |Ваня|42 |
 * +--+----+---+
 */
echo $mysql->simpleQuery('SELECT * FROM `tableName` ORDER BY `id` LIMIT 1''name');
// Возвратит: "Влад"
$row $mysql->simpleQuery('SELECT * FROM `tableName` WHERE `id` = ? LIMIT 1', array('name''age'), 9);
// Возвратит: Array( 'name' => 'Ваня', 'age' => 42 )

$row $mysql->cacheQuery('SELECT * FROM `tableName` WHERE `id` = ? LIMIT 1'9);
// Делает запрос: SELECT * FROM `tableName` WHERE `id` = 9 LIMIT 1
// Записывает в private массив $cacheQueries ключ>значение
// Где в качестве ключа служит MD5 хэш запроса, а в качестве значения
// Результат этого запроса, обработанный функцией mysql_fetch_array() и его-же возвращает
$row $mysql->cacheQuery('SELECT * FROM `tableName` WHERE `id` = ? LIMIT 1'9);
// Т.к. такой запрос уже был сделан, просто возвращает то, что записали в массив $cacheQueries
// в прошлый раз

while($row $mysql->iterateQuery('SELECT * FROM `tableName`'))
echo 
'<br />Имя: '.$row['name'].', Возраст: '.$row['age'];
// Просто красивая замена этому:
// $result = mysql_query('SELECT * FROM `tableName`');
// while($row = mysql_fetch_array($result))
// echo '<br />Имя: '.$row['name'].', Возраст: '.$row['age'];

  Ответить  
 
 автор: HaJIuBauKa   (22.06.2009 в 17:58)   письмо автору
 
   для: nikita2206   (22.06.2009 в 15:08)
 

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

  Ответить  
 
 автор: nikita2206   (22.06.2009 в 21:46)   письмо автору
 
   для: HaJIuBauKa   (22.06.2009 в 17:58)
 

суть вот в чем: у меня была задача - написать ПАРУ строк, реализующих вывод комментариев, пару строк, как это и бывает - не получилось, но, чтото хоть и вышло:
<?php
for($count 1$comment $mysql->iterateQuery('SELECT * FROM `comments` WHERE `postId` = ?'$_GET['post']); $count++){
    
$templator->replace['comment'] = array(
        
'user'        => $comment['author'],
        
'date'        => $comment['date'],
        
'comment'     => $comment['text'],
        
'avatar_addr' => getArrayVal($mysql->cacheQuery('SELECT `login`, `avatar` FROM `users` WHERE `login` = ?'$comment['author']), 'avatar'),
        
'count'       => $count
    
);
    
$content .= $templator->fetchTpl('comment');
}

проблема была в том, что нужно было выводить не только комментарии, но и информацию о пользователе, оставившем комментарий. Из информации пока только адресс до картинки-аватрки этого юзера, вот здесь то эту функцию я и написал…

  Ответить  
 
 автор: HaJIuBauKa   (04.08.2009 в 08:52)   письмо автору
 
   для: nikita2206   (22.06.2009 в 21:46)
 

Долго не отвечал :)
Если вы используете шаблон, можно было что-то типа этого:

{$user['id'].avatar}
{$user['id'].name}

массив юзеров соотв. из БД, кеша тут и не надо. Это применительно к SMARTY конечно.

  Ответить  
 
 автор: Trianon   (04.08.2009 в 13:50)   письмо автору
 
   для: nikita2206   (22.06.2009 в 15:08)
 

$verify = @file_put_contents(ROOT.MYSQL_LOG, file_get_contents(ROOT.MYSQL_LOG).$report);

Это пожалуй самый феерический сюрр про работу с файлами, которые мне здесь встречались.
Большего формат форума сказать не позволяет.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования