Давид П.
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 сообщений
#13 лет назад
Оффтопик
Цитата ("PerfectoWeb"):
Доброго времени суток.
Помогите пожалуйста разобраться в одной проблеме.

Ух ты, какая занятная юридическая проблема...
Давид П.
828 сообщений
#13 лет назад
Цитата ("frig"):
frig
Спасибо БОЛЬШОЕ!

Цитата ("voron_76"):
voron_76
и Вам за ответ спасибо!
Роман Беляев
16382 сообщения
#13 лет назад
PerfectoWeb, не за что.
Давид П.
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 лет назад
Спасибо большое ребята! Очень и очень помогли! и перенаправили самого на урок того материала, который искал но не знал что ищу..