Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с классом для работы с бд

1.2K
03 сентября 2010 года
PAVEL BASIC
171 / / 24.07.2006
Здравствуйте вот мой класс для работы с бд.

Код:
<?//Класс для работы с бд (статический) MySQL

class C_DATABASE{
static public $db_host;
static public $db_user;
static public $db_password;
static public $db_database;
static public $prefix;
static public $results;
static private $cur_connect;

       
    static public function connect(){
        self::$cur_connect=mysql_connect(self::$db_host,self::$db_user,self::$db_password);
        mysql_select_db(self::$db_database, self::$cur_connect);
        return self::$cur_connect;
    }
   
    static public function disconnect(){
        mysql_close(self::$cur_connect);
        return self::$cur_connect;
    }

    static public function cQuery($query){
        $q=str_replace("#__", self::$prefix,$query);
        self::$results=mysql_query($q,self::$cur_connect);
        return self::$results;
    }
   
    static public function c_farray($res=0){
        if ($res==0){
            return mysql_fetch_array(self::$results, MYSQL_BOTH);
        }else{
            return mysql_fetch_array($res, MYSQL_BOTH);
        }
    }
   
    static public function c_affected_rows(){
        return mysql_affected_rows();
    }
   
    static public function get_last_id(){
        $k=mysql_query("select last_insert_id()",self::$cur_connect);
        return mysql_result($k,0,0);
    }
}
?>


А вот тут производится вызов другого класса, который использует класс для работы с бд.

Код:
<?
session_start();
//Пользовательское ядро
include "lib/cdatabase.php";
include "lib/cuser.php";


C_DATABASE::$db_host="cyber.com";
C_DATABASE::$db_user="root";
C_DATABASE::$db_password="";
C_DATABASE::$db_database="Cybertronica";
C_DATABASE::$prefix="c_";

$conn=C_DATABASE::connect();

$USER = new C_USER();
//echo $USER->Authorization("first","2") ? "Авторизация успешна." : "Авторизация ПРОВАЛЕНА!";

//echo "<br/> ".$USER->get_UID();
//C_DATABASE::cQuery("insert into `#__Users` set `Login`='second'");

//echo C_DATABASE::get_last_id();
C_DATABASE::disconnect();

?>


При исполнении этого скрипта появляется ошибка: Warning: mysql_query(): 5 is not a valid MySQL-Link resource in Z:\home\cyber.com\www\lib\cdatabase.php on line 26

Вопрос в следующем, что я делаю не так? Раньше вроде код работал.
244
03 сентября 2010 года
UAS
2.0K / / 19.07.2006
О ужас, удалите вообще этот класс и забудьте о его существовании.

1) Нафига переменные static? Только ради доступа ::? Это бессмысленно, сделайте, хотя бы, как обычные свойства (доступ через -> т.е.)
2) Параметры коннекта лучше указывать аргументами в connect(), а connect() уже сам пусть их записывает в свойства и т.д.
3) Я в любой момент могу вызвать disconnect(), что вызовет ошибку. Должна быть проверка на null
4) select last_insert_id прекрасно заменяется на mysql_insert_id (или типа того)
5) Зачем хранить результаты запроса во внутренней static-переменной? В худшем случае (учитывая кривизну реализации), возвращайте из метода сразу полученный ресурс, в лучшем случае - для результата надо сделать свой класс, который и будет его обрабатывать, тем самым c_fetch_array и прочее вынесутся в отдельный класс, который будет заниматься только обработкой результата.
6) Зачем всякие префиксы "c"?
7) Не используйте <?
8) Из чего следует вывод, что класс УГ, а полностью static-класс возводит степень ужаности в квадрат.

Не вижу смысла делать это чудо. Только если ради #__ и str_replace, то смысла все равно нет. Вы, по сути, обернули mysql_* функции в методы класса, но смысла от этой обертки никакой, т.к. получилось все ещё запутаней и непонятней.

Вообщем, где-то тут у нас была тема, где мы [SIZE="1"][COLOR="Silver"]мерялись мпх[/COLOR][/SIZE] расписывали прелести классов (своих) и как лучше сделать.

По теме вопроса:
У меня все нормально (только connect/discoonect), при disconnect var_dump выдает mysql resource. Так что ищите, где-то модифицируете у себя в коде ресурс.
13
03 сентября 2010 года
RussianSpy
3.0K / / 04.07.2006
Да я тоже вчера ночью в убитом состоянии читал код и не мог понять, то ли на самом деле класс бесполезный и не делает ничего, то ли пора спать...
1.2K
03 сентября 2010 года
PAVEL BASIC
171 / / 24.07.2006
[QUOTE=UAS]select last_insert_id прекрасно заменяется на mysql_insert_id (или типа того)[/QUOTE]

Цитата:
mysql_insert_id() конвертирует возвращаемый функцией MySQL C API тип значения функции mysql_insert_id() в тип long int (называемый int в PHP). Если ваша колонка AUTO_INCREMENT имеет тип BIGINT, значение, возвращаемое функцией mysql_insert_id(), будет искажено. Вместо него используйте функцию SQL LAST_INSERT_ID().


Вот тут прочитал

[QUOTE=UAS]Зачем всякие префиксы "c"?[/QUOTE]

В цмс Joomla такая штука есть. Решил сделать на подобии.

По поводу остального. Только начал постигать ооп в Php, решил потренироваться. Если не трудно дайте ссылку на нормальный класс для работы с бд.

244
03 сентября 2010 года
UAS
2.0K / / 19.07.2006
Охохо, ну я хз, поищите в сети. Их там много. Из мне известных - AdoDB.
Хотя я использую свой класс, мне его хватает, хотя он пока что малость перегружен и рефакторится.

Полистайте темы:
http://forum.codenet.ru/showthread.php?t=61143&highlight=%E8%ED%F2%E5%F0%F4%E5%E9%F1
http://forum.codenet.ru/showthread.php?t=62364&highlight=%E8%ED%F2%E5%F0%F4%E5%E9%F1&page=2
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог