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

Форум PHP

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

 

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

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

тема: Как вам мой велосипед?
 
 автор: Ури Геллер   (07.08.2010 в 12:25)   письмо автору
 
 



<?php

/* Небольшой класс для работы с MySQL */

class MySQL {
    static public function 
init($db_host$db_user$db_name$db_pass) {
        
$link mysql_connect($db_host$db_user$db_pass);
        if (!
$link) {
            die(
mysql_error());
        }
        if (!
mysql_select_db($db_name)) {
            die(
mysql_error());
        }
        return 
$link;
    }
    static public function 
query($query) {
        
$result mysql_query($query);
        if (!
$result) {
            die(
mysql_error());
        }
        return 
$result;
    }
    
// Аргументы: имя таблицы, ассоциативный массив, ключами которого являются
    // названия колонок, а значениями данные
    
static public function insert($table_name$params) {
        
$column_list array_keys($params);
        
$values array_values($params);
        
$q "insert into ".$table_name." (".implode(","$column_list).") values (".implode(","$values).");";
        
$result self::query($q);
        
mysql_free_result($result);
    }
    static public function 
update($table_name$params$where) {
        
$items = array();
        foreach (
$params as $k => $v) {
            
$items[] = $k."=".$v;
        }
        
$q "update ".$table_name." set ".implode(","$items)." where $where;";
        
$result self::query($q);
        
mysql_free_result($result);
    }
    static public function 
delete($table_name$where) {
        
$q "delete from ".$table_name." where $where;";
        
$result self::query($q);
        
mysql_free_result($result);
    }
}

/*
 * require 'classes/MySQL.php';
 * $link = MySQL::init("localhost", "root", "database", "");
 * MySQL::insert("users", array("id" => "NULL", "name" => "'test'", "pass" => "'test'"));
 * mysql_close($link);
 */

?>




<?php

// по мне очень удобно

?>

   
 
 автор: neadekvat   (07.08.2010 в 12:31)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 12:25)
 

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

   
 
 автор: Ури Геллер   (07.08.2010 в 12:39)   письмо автору
 
   для: neadekvat   (07.08.2010 в 12:31)
 

я думал по началу такое приделать но, ведь не всегда, не все и не везде нужно обрабатывать mysql_real_escape_string()



<?php

// ...

// можно конечно везде писать так

$q "insert into table_name (col_name1, col_name2) values ($value1$value2);";
$result mysql_query($q);
if (!
$result) {
die(
mysql_error());
}
mysql_free_result($result);

// а вот по мне проще написать так
MySQL::insert("table_name", array("col_name1" => "$value1""col_name2" => "$value2"));



В массив сложить. Так есть же готовый массив POST, так что складывать ничего не надо.
Я думал ещё select добавить, но у него слишком сложный синтаксис. А так можно любой запрос сделать через MySQL::query();

   
 
 автор: neadekvat   (07.08.2010 в 13:04)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 12:39)
 

Ну, вот у меня есть функция-обработчик, без класса. Она выводит на экран страницу дескать у нас ошибка, и кладет подробную информацию в логи.
А у вас тупо в die улетает. Разве это правильно? Тем более, класс делаете.

А с обработкой - что сложного то? Если число - (int), все остальное - mysql_real_escape_string()

   
 
 автор: Ури Геллер   (07.08.2010 в 13:13)   письмо автору
 
   для: neadekvat   (07.08.2010 в 13:04)
 

ну да а как быть например с разными SQL константами типа DEFAULT, CURRENT_TIMESTAMP, NULL

   
 
 автор: neadekvat   (07.08.2010 в 13:16)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 13:13)
 

Ну, можно составить список констант и не обрабатывать их.
В противном случаи ваш класс совершенно теряет смысл. Он должен облегчать жизнь - а он просто предлагает альтернативу имеющейся рутины. Шило на мыло.

   
 
 автор: Ури Геллер   (07.08.2010 в 13:21)   письмо автору
 
   для: neadekvat   (07.08.2010 в 13:04)
 

Насчёт логов можно переписать вот так :


<?php

/* Небольшой класс для работы с MySQL */

class MySQL {

    static public function 
init($db_host$db_user$db_name$db_pass) {
        
$link mysql_connect($db_host$db_user$db_pass);
        if (!
$link) {
            die(
mysql_error());
        }
        if (!
mysql_select_db($db_name)) {
            die(
mysql_error());
        }
        return 
$link;
    }

    static public function 
query($query$return_result true$log false) {
        
$result mysql_query($query);
        if (!
$result and $log) {
            
$f fopen($log"a+b");
            
flock($fLOCK_EX);
            
fwrite($fmysql_error()."\r\n");
            
flock($fLOCK_UN);
            
fclose($f);
        }
        if (
$return_result) {
            return 
$result;
        }
        else {
            
mysql_free_result($result);
        }
    }

    static public function 
insert($table_name$params) {
        
$column_list array_keys($params);
        
$values array_values($params);
        
$q "insert into ".$table_name." (".implode(","$column_list).") values (".implode(","$values).");";
        
self::query($qfalse);
    }

    static public function 
update($table_name$params$where) {
        
$items = array();
        foreach (
$params as $k => $v) {
            
$items[] = $k."=".$v;
        }
        
$q "update ".$table_name." set ".implode(","$items)." where ".$where.";";
        
self::query($qfalse);
    }

    static public function 
delete($table_name$where) {
        
$q "delete from ".$table_name." where ".$where.";";
        
self::query($qfalse);
    }
    
}

?>


   
 
 автор: neadekvat   (07.08.2010 в 13:23)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 13:21)
 

Я бы советовал использовать file_put_contents, меньше кода.

   
 
 автор: Ури Геллер   (07.08.2010 в 13:26)   письмо автору
 
   для: neadekvat   (07.08.2010 в 13:23)
 

а там все равно ерунда написана чтобы журнал логов сделать придётся объект создавать чтобы сохранять настройки

   
 
 автор: neadekvat   (07.08.2010 в 13:28)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 13:26)
 

Не понял мысли поста.

   
 
 автор: Ури Геллер   (07.08.2010 в 13:31)   письмо автору
 
   для: neadekvat   (07.08.2010 в 13:28)
 



<?php

/* Небольшой класс для работы с MySQL */

class MySQL {

    public 
$show_errors false;
    public 
$error_log false;
 
    public function 
init($db_host$db_user$db_name$db_pass) {
        
$link mysql_connect($db_host$db_user$db_pass);
        if (!
$link) {
            die(
$this->error_handler());
        }
        if (!
mysql_select_db($db_name)) {
            die(
$this->error_handler());
        }
        return 
$link;
    }

    private function 
error_handler() {
        if (
$this->error_log) {
            
$f fopen($this->error_log"a+b");
            
flock($fLOCK_EX);
            
fwrite($fmysql_error()."\r\n");
            
flock($fLOCK_UN);
            
fclose($f);
        }
        if (
$this->show_errors == true) {
            die(
mysql_error());
        }
    }

    public function 
query($query$return_result true) {
        
$result mysql_query($query);
        if (!
$result) {
            die(
$this->error_handler());
        }
        else if (
$return_result) {
            return 
$result;
        }
        else {
            
mysql_free_result($result);
        }
    }

    public function 
insert($table_name$params) {
        
$column_list array_keys($params);
        
$values array_values($params);
        
$q "insert into ".$table_name." (".implode(","$column_list).") values (".implode(","$values).");";
        
$this->query($qfalse);
    }

    public function 
update($table_name$params$where) {
        
$items = array();
        foreach (
$params as $k => $v) {
            
$items[] = $k."=".$v;
        }
        
$q "update ".$table_name." set ".implode(","$items)." where ".$where.";";
        
$this->query($qfalse);
    }

    public function 
delete($table_name$where) {
        
$q "delete from ".$table_name." where ".$where.";";
        
$this->query($qfalse);
    }
    
}

?>


   
 
 автор: neadekvat   (07.08.2010 в 13:42)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 13:31)
 

А словами сказать? Вы уже три раза код выложили - я его весь должен помнить, чтобы сравнить?

   
 
 автор: Ури Геллер   (07.08.2010 в 13:43)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 13:31)
 



<?php

/* Небольшой класс для работы с MySQL */

class MySQL {

    public 
$link;
    private 
$show_errors true;
    private 
$error_log false;
    private 
$q false;

    
// $db = new MySQL($db_host, $db_user, $db_name, $db_pass);
    
public function  __construct($db_host$db_user$db_name$db_pass) {
        
$this->link mysql_connect($db_host$db_user$db_pass);
        if (
$this->link === false) {
            
$this->error_handler();
        }
        if (
mysql_select_db($db_name) === false) {
            
$this->error_handler();
        }
    }

    
// $db->display_errors(0); // отключить вывод ошибок
    
public function display_errors($bool) {
        
$this->show_errors $bool;
    }

    
// $db->error_log('mysql_errors.log'); // записываем сообщения об ошибках в журнал
    
public function error_log($filename) {
        
$this->error_log $filename;
    }
    

    private function 
error_handler() {
        if (
$this->error_log) {
            
$error mysql_error();
            if (
$this->q) {
                
$error.". Query: ".$this->q;
                
$this->false;
            }
            
$f fopen($this->error_log"a+b");
            
flock($fLOCK_EX);
            
fwrite($f$error."\r\n");
            
flock($fLOCK_UN);
            
fclose($f);
        }
        if (
$this->show_errors == true) {
            die(
mysql_error());
        }
    }

    
// $result = $db->($query);
    
public function query($query$return_result true) {
        
$result mysql_query($query);
        if (!
$result) {
            if (
$this->error_log !== false) {
                
$this->$query;
            }
            
$this->error_handler();
        }
        else if (
$return_result == true) {
            return 
$result;
        }
        else {
            
mysql_free_result($result);
        }
    }

    
// $db->insert("users", array("id" => "NULL", "name" => "'test'", "password" => "'test'",));
    
public function insert($table_name$params) {
        
$column_list array_keys($params);
        
$values array_values($params);
        
$q "insert into ".$table_name." (".implode(","$column_list).") values (".implode(","$values).");";
        
$this->query($qfalse);
    }

    
// $db->update("users", array("password" => "'new_password'",), "name = 'test'");
    
public function update($table_name$params$where) {
        
$items = array();
        foreach (
$params as $k => $v) {
            
$items[] = $k."=".$v;
        }
        
$q "update ".$table_name." set ".implode(","$items)." where ".$where.";";
        
$this->query($qfalse);
    }

    
// $db->delete("users", "name = 'test'")
    
public function delete($table_name$where) {
        
$q "delete from ".$table_name." where ".$where.";";
        
$this->query($qfalse);
    }

    
// unset($db);
    // можно и так
    // mysql_close($db->link);
    
public function  __destruct() {
        
mysql_close($this->link);
    }
    
}

?>

   
 
 автор: Саня   (07.08.2010 в 12:41)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 12:25)
 

Непонятно зачем тут класс. Всё равно он используется в процедурном стиле.

   
 
 автор: Ури Геллер   (07.08.2010 в 12:42)   письмо автору
 
   для: Саня   (07.08.2010 в 12:41)
 

чтобы избежать конфликта имён

   
 
 автор: nikita2206   (07.08.2010 в 23:18)   письмо автору
 
   для: Ури Геллер   (07.08.2010 в 12:25)
 

Есть такая штука - active record, позволяет избежать мешанины скл с похапе

   
Rambler's Top100
вверх

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