Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> klasa i zmienne, pytanie
Memberek
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


Witam, ostatnio się uczyłem klas, w miarę ogarniam i teraz potrzebuje pomocy, ponieważ nie mogę dojść do tego, jak tworzyć zmienne automatycznie, abym mógł je pobrać.

mam np.
  1. $cos = new cos;
  2. $arr = array(
  3. "Kot" => "perski",
  4. "Pies"=> "bullterier",
  5. );
  6. $cos->tablica($arr);
  7. echo $cos->Pies; // zwraca bullterier
  8.  
  9. class cos {
  10.  
  11. public function tablica ($array) {
  12. foreach($array as $index => $wartosc) {
  13. // jak tutaj?
  14. }
  15.  
  16. }
  17.  
  18. }

mam nadzieje, że zrozumiecie o co chodzi i z góry dziękuję za pomoc, lub chociaż próbę pomocy!
Go to the top of the page
+Quote Post
mat-bi
post
Post #2





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

Ostrzeżenie: (0%)
-----


Eee, chyba wiem.

Aby odnieść się do klasy w niej samej, użyj $this, ale powie ci to pierwszy lepszy kurs
Go to the top of the page
+Quote Post
Memberek
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


Cytat(mat-bi @ 1.08.2011, 19:07:38 ) *
Eee, chyba wiem.

Aby odnieść się do klasy w niej samej, użyj $this, ale powie ci to pierwszy lepszy kurs

probowalem
  1. foreach($array as $index => $wartosc) {
  2. $this->$index = $wartosc
  3. }

ale potem nie mogłem pobrać $cos->pies...
Go to the top of the page
+Quote Post
Spawnm
post
Post #4





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Daj $this->{$index} = $wartosc;
Btw. pomysł beznadziejny.
Go to the top of the page
+Quote Post
Memberek
post
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


Cytat(Spawnm @ 1.08.2011, 19:31:05 ) *
Daj $this->{$index} = $wartosc;
Btw. pomysł beznadziejny.

dzięki działa.

btw. czemu beznadziejny? to co napisałem tylko przykład, funkcja wyciąga dane z bazy danych i używam tego tak:
  1. $player->loadPlayer('Name');
  2. echo "Level: ".$player->level;

mi się wydaje, że to ułatwia (IMG:style_emoticons/default/smile.gif)


a jeszcze jedno pytanie teraz mam tak:
  1.  
  2. function loadPlayer($name) {
  3. $query = $sql->query("SELECT * FROM `players` WHERE `name`='".mysql_real_escape_string($name)."' LIMIT 1");
  4. foreach($sql->fetch($query) as $index => $value){
  5. $this->{$index} = $value;
  6. }
  7. }

a chciałbym np. ułatwić sobię tym sposobem:
  1. $sql->query("SELECT * FROM `players` WHERE `name`='".mysql_real_escape_string($name)."' LIMIT 1")->fetch();

co muszę zrobić? bo wyskakuje, non-object...

Ten post edytował Memberek 1.08.2011, 18:50:12
Go to the top of the page
+Quote Post
buliq
post
Post #6





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


$sql jest globalne?
daj:

  1. function loadPlayer($name) {
  2. global $sql;
  3. $query = $sql->query("SELECT * FROM `players` WHERE `name`='".mysql_real_escape_string($name)."' LIMIT 1");
  4. foreach($sql->fetch($query) as $index => $value){
  5. $this->{$index} = $value;
  6. }
  7. }


Ten post edytował buliq 1.08.2011, 18:53:13
Go to the top of the page
+Quote Post
Memberek
post
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


#up
mam wyżej $sql = new SQL;
ale to nie jest odpowiedzią na moje pytanie, gdyż to akurat działa bez zarzutów, w 4 poście zadałem kolejne pytanie (IMG:style_emoticons/default/tongue.gif)

Ten post edytował Memberek 1.08.2011, 18:54:32
Go to the top of the page
+Quote Post
buliq
post
Post #8





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


daj error_reporting(E_ALL); pokaże coś tam że nie zdefiniowałeś $sql,
$sql zdefiniowane jest w danej metodzie?
Go to the top of the page
+Quote Post
Memberek
post
Post #9





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


  1. <?PHP
  2. class MySQL {
  3.  
  4. private $config,$connection,$lQuery;
  5.  
  6. public function __construct() {
  7. require_once("modules/Config.php");
  8. $this->config = new Config;
  9. $this->connection = MySQL_Connect($this->config->value("dbHost"), $this->config->value("dbUser"), $this->config->value("dbPass")) or die("Cannot connect to MySQL");
  10. MySQL_Select_DB($this->config->value("dbName"));
  11. }
  12.  
  13. public function __destruct(){
  14. if($this->connection) MySQL_Close($this->connection);
  15. }
  16.  
  17. public function query($query){
  18. return $this->lQuery = MySQL_Query($query);
  19. }
  20.  
  21. public function numRows($query = null) {
  22. if($query == null && !$this->lQuery) die ("No MySQL Query in MySQL::numRows()");
  23. return MySQL_Num_Rows(($query == null)?$this->lQuery:$query);
  24. }
  25.  
  26. public function fetch($query = null) {
  27. if($query == null && !$this->lQuery) die ("No MySQL Query in MySQL::fetch()");
  28. foreach(MySQL_Fetch_Array(($query == null)?$this->lQuery:$query) as $index => $value){
  29. $this->{$index} = $value;
  30. }
  31. }
  32.  
  33. public function getQuery(){
  34. return $this->lQuery;
  35. }
  36.  
  37. public function insert($table=null, $data=array()){
  38. if($table == null || gettype($data) != "array") die("Wrong param in MySQL::insert(table name, array data)");
  39. $keys = ""; $values = ""; $c=false;
  40. foreach($data as $key => $value){
  41. $keys.= (($c==true)?", ":"")."`$key`";
  42. $values.=(($c==true)?", ":"")."'$value'";
  43. if($c==false) $c=true;
  44. }
  45. return $this->query("INSERT INTO `$table` ($keys) VALUES ($values)");
  46. }
  47.  
  48. public function update($table=null, $data=array(), $param=null){
  49. if($table == null || gettype($data) != "array") die("Wrong param in MySQL::update(table name, array data)");
  50. $d = ""; $c=false;
  51. foreach($data as $key => $value){
  52. $d.= (($c==true)?", ":"")."`$key`='$value'";
  53. if($c==false) $c=true;
  54. }
  55. return $this->query("UPDATE `$table` SET $d $param");
  56. }
  57.  
  58. }
  59. ?>

tu jest moja klasa

Ten post edytował Memberek 1.08.2011, 19:04:13
Go to the top of the page
+Quote Post
buliq
post
Post #10





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Nie zrozumiałeś mojego przesłania. W metodzie loadPlayer nie masz dostępu do zmiennej $sql ponieważ jej nie zdefiniowałeś. Nie wątpię iż zdefiniowałeś ją wyżej przed wywołaniem metody jednak metoda nie ma dostępu do zmiennej z przypisaną klasą. Błąd non-object informuje ze chcesz użyć zmiennej jako obiektu która de facto obiektem nie jest. Daj global $sql; w metodzie loadPlayer aby miała ona dostęp do obsługi bazy danych. Lub jeżeli nie będzie działać ustaw $sql jako $this->sql - będzie dostęp w całej klasie.
Go to the top of the page
+Quote Post
Memberek
post
Post #11





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


dobrze, wiem, ale to co napisałem to przykład i pisałem go podczas pisania postu, uwierz, że mam w moim pliku.

chodzi mi o to, że chce teraz zrobić tak:
$sql->query("TUTAJ ZAPYTANIE DO SQL")->fetch();

i tutaj z fetch() się pojawia non-object. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Przeciez query() zwraca wynik mysql_query czyli resource a to jest dalekie od Twojego obiektu. Zastanów się chwilę co query() ma zwracac by było Twoim obiektem (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Memberek
post
Post #13





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


hmm
  1. public function query($query){
  2. $this->lQuery = MySQL_Query($query);
  3. return new MySQL;
  4. }

tak?

Ten post edytował Memberek 1.08.2011, 19:16:22
Go to the top of the page
+Quote Post
buliq
post
Post #14





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Ok. Teraz jasne.

zrób tak:

  1. public function query($query){
  2. return $this->lQuery = MySQL_Query($query);
  3. }


zamień na:

  1. public function query($query){
  2. $this->lQuery = MySQL_Query($query);
  3. return $this;
  4. }


Oczywiście to przykład. Powinieneś w ten sposób przerobić każdą metodę tej klasy który pracuje na danchh z mysql w celu tworzenia takich łańcuchów.

Chodzi o to że $sql->query gdzie $sql jest obiektem. metoda query musi zwrócić obiekt $sql aby można było wykonać metodę tej klasy. Zwracało non-object ponieważ $sql->query zwracało resource z zapytania.

Ten post edytował buliq 1.08.2011, 19:17:34
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




hmm.... nie (IMG:style_emoticons/default/wink.gif)
po co new? Po co tworzyc nowy obiekt? Zwracaj ten co już jest. A co w obiekcie jest Twoim obiektem? Hm?

i buliq zepsuł myślenie :/
Go to the top of the page
+Quote Post
Memberek
post
Post #16





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 1.08.2011

Ostrzeżenie: (0%)
-----


dzięki Buliq, wszyscy macie +!

Ten post edytował Memberek 1.08.2011, 19:18:11
Go to the top of the page
+Quote Post
buliq
post
Post #17





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Sorry nospor (IMG:style_emoticons/default/smile.gif)

Memberek nadal źle.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 16:53