|
|
|
| вот накопился у меня класс для работы с 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_LOG, file_get_contents(ROOT.MYSQL_LOG).$report);
return $verify == 0 ? 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($rows, 0, -2);
$values = mb_substr($values, 0, -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($sets, 0, -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'];
|
| |
|
|
|
|
|
|
|
для: nikita2206
(22.06.2009 в 15:08)
| | Смысл кеша немного теряется.
Если скрипт делает какой-то запрос, то по-идее (если он оптимизирован), уникальный запрос и так сохраняется в какой-то переменной для последующего использования. Хотя тут можно и поспорить о полезности данной реализации.
Надо попробовать реализовать кеш на основе таблицы-кеша в БД. Прикрутить его для "тяжелых" запросов типа статистики доступа, или обработки каких-либо стат-данных.
А может это уже есть и изобретать велосипед не нужно... это так мысли вслух. | |
|
|
|
|
|
|
|
для: 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');
}
|
проблема была в том, что нужно было выводить не только комментарии, но и информацию о пользователе, оставившем комментарий. Из информации пока только адресс до картинки-аватрки этого юзера, вот здесь то эту функцию я и написал… | |
|
|
|
|
|
|
|
для: nikita2206
(22.06.2009 в 21:46)
| | Долго не отвечал :)
Если вы используете шаблон, можно было что-то типа этого:
{$user['id'].avatar}
{$user['id'].name}
массив юзеров соотв. из БД, кеша тут и не надо. Это применительно к SMARTY конечно. | |
|
|
|
|
|
|
|
для: nikita2206
(22.06.2009 в 15:08)
| |
$verify = @file_put_contents(ROOT.MYSQL_LOG, file_get_contents(ROOT.MYSQL_LOG).$report);
|
Это пожалуй самый феерический сюрр про работу с файлами, которые мне здесь встречались.
Большего формат форума сказать не позволяет. | |
|
|
|
|