Проблема с классом для работы с бд
Код:
<?//Класс для работы с бд (статический) 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);
}
}
?>
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();
?>
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
Вопрос в следующем, что я делаю не так? Раньше вроде код работал.
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. Так что ищите, где-то модифицируете у себя в коде ресурс.
Да я тоже вчера ночью в убитом состоянии читал код и не мог понять, то ли на самом деле класс бесполезный и не делает ничего, то ли пора спать...
Цитата:
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, решил потренироваться. Если не трудно дайте ссылку на нормальный класс для работы с бд.
Хотя я использую свой класс, мне его хватает, хотя он пока что малость перегружен и рефакторится.
Полистайте темы:
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