Я схожу с ума здесь, и я знаю, что задавал один и тот же вопрос раньше - но я планирую сохранить остальную часть моих волос.
Чтобы обрисовать мою проблему: у меня есть класс, который запрашивает базу данных (QueryDB
) и сохраняет результаты в виде ассоциативного массива с именем $data
, а другой класс (DisplayTable
) должен отображать таблицу на основе этих результатов.
I могу print_r($data)
из самого класса, но как мне получить доступ к переменной $data
из дочернего класса в отдельном файле? Я провел последнюю неделю, пытаясь почти все - с или без $this->
, делая методы получения и установки, возвращает / не возвращает, но массив в DisplayTable
либо выходит пустым, либо просто возвращает NULL.
Если я жестко закодирую массив ($defined
) в QueryDB, который идентичен результатам, которые я получаю из массива $data
, я могу просто передать его в дочерний класс, используя $this->defined
, так что единственное очевидное отличие между $data
$defined
означает, что $data
генерируется динамически. Относятся ли они к совершенно другим, чем к stati c, или я пропускаю некоторые базовые c вещи в классе (ах) моего родителя или ребенка?
И, если вы могли бы кратко объяснить мою ошибку (ы) вместо того, чтобы просто сказать «вам нужно то или иное в строке X» . Это не помогает мне учиться, и я действительно хочу стать лучше в этом:)
querydb. php:
class QueryDB extends DBCon {
public $q;
public $result;
public $data = array();
public $defined = array(
array(
"id" => 1,
"user" => "user1",
"pass" => "pass1"),
array(
"id" => 2,
"user" => "user2",
"pass" => "pass2")
);
public function __construct($q) {
$result = $this->connect()->query($q) or die("Database error");
$numRows = $result->num_rows;
if ( $numRows > 0 ) {
while ($row = $result->fetch_assoc()) {
$this->data[] = $row;
}
return $this->data;
} else {
echo 'No rows found.';
}
}
}
displaytable. php:
<code>class DisplayTable extends QueryDB {
public function __construct() {
echo '<pre>';
print_r($this->defined); // Returns the hardcoded array
print_r($this->data); // Returns an empty array
echo '
'; }}
РЕДАКТИРОВАТЬ Jan 18: Хорошо, немного повозившись, я неожиданно заставил его работать. Возможно, это не оптимальный или правильный способ сделать это, но мой код выглядит следующим образом:
querydb. php:
class QueryDB extends DBCon {
public $q;
public $result;
public $data = array();
public function __construct() {
}
public function query($q) {
$result = $this->connect()->query($q) or die("Database error");
$numRows = $result->num_rows;
if ( $numRows > 0 ) {
while ($row = $result->fetch_assoc()) {
$this->data[] = $row;
}
return $this->data;
} else {
echo 'No rows found.';
}
}
}
displaytable. php:
<code>class DisplayTable extends QueryDB {
public $foo;
public function __construct() {
parent::__construct();
}
public function getTable($foo) {
echo '<pre>';
print_r($foo->data);
echo '
'; }}
index. php:
$res = new QueryDB();
$res->query("SELECT * FROM `testdb`");
$tab = new DisplayTable();
$tab->getTable($res);
Я правильно понимаю?:
$res = new QueryDB();
// Я создаю экземпляр Объект QueryDB как $res
в index.php
$res->query("SELECT * FROM 'testdb'");
// Я передаю запрос в качестве аргумента - В
QueryDB
классе возвращается массив $data
: return $this->data;
$res
теперь содержит массив $data
, верно? - Я создаю экземпляр объекта
DisplayTable()
как $tab
в index.php
- Я вызываю
getTable()
метод с использованием $res
в качестве аргумента getTable()
метод принимает $foo
в качестве аргумента-заполнителя (который на самом деле $res
) - Теперь у меня есть доступ к
$foo->data
/ ($res->data
)
Возможно, это слишком много назад и вперед, но это единственное решение, которое я могу найти прямо сейчас. Предложения по упрощению (если возможно) по-прежнему очень ценятся:)