Помогите с PHP-классами
828 сообщений
#13 лет назад
Доброго времени суток.Помогите пожалуйста разобраться в одной проблеме.
Расположение файлов такое:
../classes/mysql.php
../classes/func.php
../config.php
../mysql.php
1) в ../classes/mysql.php - находится класс MYSQL
2) в ../mysql.php - данные от базы и сам коннект к базе(вызов класса)
$username="root";
$password="root";
$database="db";
$mysql = new MYSQL("localhost",$username,$password,$database);
$mysql->connect();
3) в ../config.php
include("classes/mysql.php");
include("classes/functions.php");
include_once("mysql.php");
4) в ../classes/func.php
class System extends MYSQL {
..
ПРОБЛЕМА: Никак не могу заставить в func.php чтоб работал класс MYSQL с коннектом к базе (т.е. сам класс + запуск).
Допустим в классе System будет функция showUser($id) чтоб он сконектился к базе взял юзера и показал и все это шло как
$sys->showUser(2);
Помогите пожалуйста с решением, буду ОЧЕНЬ благодарен!
16382 сообщения
#13 лет назад
PerfectoWeb, Цитата ("PerfectoWeb"):
в классе System будет функция showUser($id) чтоб он сконектился к базе взял юзера
Вот это вот - это плохо. Класс mysql у вас понятно чем занимается - работает с БД. А класс System чем? Всем остальным? Так не должно быть.
Не надо класс System наследовать от класса mysql.
Покажите больше кода, так сложно понять чем можно вам помочь.
828 сообщений
#13 лет назад
Понимаете, вот допустим $sys->showUser(2) так более коротно и приятней чтоб во всем коде было, вместо того чтоб сделать запрос к базе взять таблицу и передать функции.1) в ../classes/mysql.php
class MYSQL {
private $server;
private $user;
private $passwd;
private $dbname;
private $link;
private $count = 0;
function __construct($server = "", $user = "", $pass = "", $dbname = "") {
$this->server=$server;
$this->user =$user;
$this->pass =$pass;
$this->dbname=$dbname;
}
function connect() {
$this->link = mysql_connect($this->server, $this->user, $this->pass) or $this->error(mysql_error());
mysql_select_db ($this->dbname, $this->link) or $this->error(mysql_error());
mysql_query("SET NAMES `utf8`");
}
function error($message) {
echo("<strong>Error:</strong> ".$message);
exit;
}
function close() {
return (mysql_close($this->link));
}
function query($query) {
$this->rs = mysql_query($query, $this->link);
if (!$this->rs) {
echo("Error: Invalid query \"<b>".$query."</b>\"<br>");
die("Error: ".mysql_error()."<br>");
}
else {
$this->count++;
return $this->rs;
}
}
function data_seek($row = "") {
if ($row == "") {
$row = 0;
}
mysql_data_seek($rs, $row);
return true;
}
function fetch_array($rs = "") {
if ($rs == "") {
$rs = $this->rs;
}
$this->row = mysql_fetch_array ($rs, MYSQL_BOTH);
return $this->row;
}
function num_rows($rs = "") {
if ($rs == "") {
$rs = $this->rs;
}
return mysql_num_rows($rs);
}
function affected_rows(){
return mysql_affected_rows();
}
function count(){
return intval($this->count);
}
function free_result($rs = "") {
if ($rs == "") {
$rs = $this->rs;
}
return mysql_free_result($rs);
}
function __destruct() {
}
}
4) в ../classes/func.php
class System extends MYSQL {
function langTabs($module) {
$result = "";
$lng_query = $this->query("SELECT * FROM `languages`");
while ($lng_array = $this->fetch_array($lng_query)) {
$result .= '<a href="javascript: module_ajax(\''.$module.'/'.$lng_array.'\')"><li>'.$lng_array.'</li></a>';
}
return $result;
}
}
Данной функцией хочется сделать так
к каждому новостю прелогается 3языка (сайт 3х язычный)
Хочется куском минимального кода вызвать 3 таба, что то по типу этого:
$system = new System();
$system->langTabs("news");
Заранее благодарен за ответ!
16382 сообщения
#13 лет назад
Можно как-то так
class System
{
private $db;
public function __construct()
{
$this->db = new MYSQL();
$this->db->connect();
}
function langTabs($module) {
$result = "";
$lng_query = $this->db->query("SELECT * FROM `languages`");
while ($lng_array = $this->db->fetch_array($lng_query)) {
$result .= '<a href="javascript: module_ajax(\''.$module.'/'.$lng_array.'\')"><li>'.$lng_array.'</li></a>';
}
return $result;
}
}
6970 сообщений
828 сообщений
#13 лет назад
Цитата ("frig"):frigСпасибо БОЛЬШОЕ!
Цитата ("voron_76"):
voron_76и Вам за ответ спасибо!
828 сообщений
#13 лет назад
Роман извините пожалуйста за утраченное мною Ваше время.вот а если сами конфиги базы в файле config.php
каким методом правильно их взять из класса? (чтоб брать один раз а не при каждом вызове функции )
config.php
$username="root";
$password="root";
$database="db";
$mysql = new MYSQL("localhost",$username,$password,$database);
$mysql->connect();
т.е. в Вашем коде надо указать вместо: Цитата ("frig"):
$this->db = new MYSQL();
следующее чтоб работало:
$this->db = new MYSQL("localhost","root", "root", "db");
16382 сообщения
#13 лет назад
PerfectoWeb, вообще из класса mysql лучше сделать синглтон.
class MYSQL {
private $server;
private $user;
private $passwd;
private $dbname;
private $link;
private $count = 0;
private function __construct()
{
}
private function __clone()
{
}
public function getNew()
{
if (self::$instance == NULL)
{
self::$instance = new MYSQL;
}
return self::$instance;
}
function init($server = "", $user = "", $pass = "", $dbname = "") {
$this->server=$server;
$this->user =$user;
$this->pass =$pass;
$this->dbname=$dbname;
}
function connect() {
$this->link = mysql_connect($this->server, $this->user, $this->pass) or $this->error(mysql_error());
mysql_select_db ($this->dbname, $this->link) or $this->error(mysql_error());
mysql_query("SET NAMES `utf8`");
} ...
Тогда где-то в том же конфиге делаете
$db = MYSQL::getNew();
$db->init("localhost",$username,$password,$database);
$db->connect();
А в system вот так
public function __construct()
{
$this->db = MYSQL::getNew();
}
И все. Когда вы подключаете конфиг - создается экземпляр MYSQL и при каждом вызове MYSQL::getNew() вам будет возвращаться именно этот экземпляр. Подключение к базе будет одно. Ну а дальше все остается как и было.
Надеюсь все понятно расписал.
2817 сообщений
#13 лет назад
Предложу свой вариант:создаете экземпляр класса мускл:
$username="root";
$password="root";
$database="db";
$mysql = new MYSQL("localhost",$username,$password,$database);
$mysql->connect();
Наследовать System из MySQL перестаем делать
Просто в класс System добавляем переменную $db которая будет указателем на созданный ранее $mysql
private $db = null;
public function setDB(& $db){
$this->db = $db;
}
и после коннекта к БД и создание экземпляра $System делаем:
$system->setDB($mysql);
и теперь метод langTabs будет иметь вид:
function langTabs($module) {
$result = "";
$lng_query = $this->db->query("SELECT * FROM `languages`");
while ($lng_array = $this->db->fetch_array($lng_query)) {
$result .= '<a href="javascript: module_ajax(\''.$module.'/'.$lng_array.'\')"><li>'.$lng_array.'</li></a>';
}
return $result;
}
Если я не ступил нигде - должно работать.
828 сообщений
#13 лет назад
Спасибо большое, всем кто помог!Буду рад в любое время помочь Вам чем могу и чем не смогу - все равно помогу!

828 сообщений
#13 лет назад
Спасибо большое ребята! Очень и очень помогли! и перенаправили самого на урок того материала, который искал но не знал что ищу..