Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] funkcja array_keys i zmienne w klasach
Zdunek
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

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


Witam

Robię sobie mały portal na bazie IPB
oto funkcja klasy
  1. <?php
  2. public function exist($id){
  3.    $exist=strip_tags($id);
  4.    $idzapytania = mysql_query(&#092;"SELECT `forum_id` FROM `ipb_topics` WHERE `tid`='\".$exist.\"'\");
  5.    $wiersz = mysql_fetch_row($idzapytania);
  6.    if ( array_keys($news[$lang],7) || array_keys($arts[$lang],7))
  7.    {
  8.        echo 'Element istnieje w tablicy!';
  9.    }
  10.    else
  11.    {
  12.    echo &#092;"nie ma takiego elementu\";
  13.    }
  14.    return $wiersz[0];
  15.    }
  16. ?>

przy wywołaniu funkcji wywala mi taki błąd
Warning: array_keys() [function.array-keys]: The first argument should be an array in C:\xampp\htdocs\test\poziomkaciecie\php\model\classes\class.np.php on line 61

Warning: array_keys() [function.array-keys]: The first argument should be an array in C:\xampp\htdocs\test\poziomkaciecie\php\model\classes\class.np.php on line 61
nie ma takiego elementu6

tablica asocjacyjna dwuwymiarowa $news i $arts jest stworzona poza klasą i jest wczytana przed wywołaniem funkcji
podobnie jak zmienna $lang

Z góry dzięki za pomoc

Ten post edytował Zdunek 19.11.2008, 19:43:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
Mize
post
Post #2





Grupa: Zarejestrowani
Postów: 84
Pomógł: 6
Dołączył: 26.03.2008
Skąd: Łódź

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


http://php.net.pl/manual/pl/function.array-keys.php - zwraca tablicę zawierającą klucze tablicy macierzystej.
A nie wartość BOOLEAN. Jeśli chcesz sprawdzić czy element znajduję się w tablicy użyj...

http://php.net.pl/manual/pl/function.in-array.php
http://php.net.pl/manual/pl/function.array-key-exists.php

Pozdrawiam.

Ten post edytował Mize 19.11.2008, 19:53:23


--------------------
NULL;
Go to the top of the page
+Quote Post
Zdunek
post
Post #3





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

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


zmieniłem na
if (array_key_exists(7,$news[$lang]) || array_key_exists(7,$arts[$lang]))
i teraz wywala błąd
Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in C:\xampp\htdocs\test\poziomkaciecie\php\model\classes\class.np.php on line 61

Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in C:\xampp\htdocs\test\poziomkaciecie\php\model\classes\class.np.php on line 61

tablice $news i $arts są takie
$news = array(array());
$arts = array(array());
$news["pl"][0]=6;
$arts["pl"][0]=7;


Edit:
Wcześniej sobie robiłem w jednym pliku php bez klasy
  1. <?php
  2. $news = array(array());
  3. $arts = array(array());
  4. $lang=&#092;"en\";
  5. $news[&#092;"pl\"][0]=6;
  6. $news[&#092;"en\"][0]=7;
  7. $arts[&#092;"en\"][0]=7;
  8.  
  9.    $array = Array('' => 'abc', 'b' => 'bcd');
  10.  
  11.    if ( array_keys($news[$lang],7) )
  12.    {
  13.        echo 'Element istnieje w tablicy!';
  14.    }
  15.    else
  16.    {
  17.    echo &#092;"nie ma takiego elementu w tablicy\";
  18.    }
  19. ?>

i dobrze sprawdzało czy jest w tablicy asocjacyjnej, dwuwymiarowej, z indexem pierwszym o zmiennej $lang jest gdzieś 7
przy array_key_exists to już niestety nie działa

więc array_keys jest dobrą w tym przypadku metodą, lecz niestety jest coś nie tak z odwołaniem do zmiennych z poza klasy...

Edit2: przy użyciu in_array w jednym pliku php działa jak array_keys lecz przy klasie także wywala błąd
Warning: in_array() [function.in-array]: Wrong datatype for second argument in C:\xampp\htdocs\test\poziomkaciecie\php\model\classes\class.np.php on line 61

Ten post edytował Zdunek 20.11.2008, 13:41:08
Go to the top of the page
+Quote Post
nevt
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


twoje zmienne globalne $news, $arts i $lang nie są widoczne w ciele klasy. musisz je zadeklarować wewnątrz metody klauzulą global:
  1. <?php
  2. public function exist($id){
  3.  global $news;
  4.  global $arts;
  5.  global $lang;
  6.  $exist=strip_tags($id);
  7.  ...
  8. }
  9. ?>

ale to jest "obejście" nie w duchu OOP. najlepiej gdybyś te trzy zmienne (lub referencje do nich) przekazywał do konstruktora swojej klasy, a tam przepisał je do właściwości klasy - wtedy wszystkie metody będą miały do nich dostęp przez operator $this-> w zgodzie z zasadami OOP.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
Zdunek
post
Post #5





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

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


Cytat(nevt @ 20.11.2008, 14:29:38 ) *
twoje zmienne globalne $news, $arts i $lang nie są widoczne w ciele klasy. musisz je zadeklarować wewnątrz metody klauzulą global:
  1. <?php
  2. public function exist($id){
  3.  global $news;
  4.  global $arts;
  5.  global $lang;
  6.  $exist=strip_tags($id);
  7.  ...
  8. }
  9. ?>

zrobiłem tak i wywala mi taki błąd:
Fatal error: Cannot use object of type news_arts as array in C:\xampp\htdocs\test\poziomkaciecie\php\model\classes\class.np.php on line 64
linia 64:
if( array_keys($news[$lang],7) || array_keys($arts[$lang],7))

Cytat
ale to jest "obejście" nie w duchu OOP. najlepiej gdybyś te trzy zmienne (lub referencje do nich) przekazywał do konstruktora swojej klasy, a tam przepisał je do właściwości klasy - wtedy wszystkie metody będą miały do nich dostęp przez operator $this-> w zgodzie z zasadami OOP.

można jakiś link opisujący to ?
Go to the top of the page
+Quote Post
nevt
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


Cytat
Fatal error: Cannot use object of type news_arts as array in C:\xampp\htdocs\test\poziomkaciecie\php\model\classes\class.np.php on line 64

czyli twoje zmienne $news i $arts nie są tablicami a instancjami klasy news_arts...
jednym słowem - pokazujesz nam jeden kod - a testujesz zupełnie inny i dziwisz się, że nasze podpowiedzi nie działają... pokaż cały kod - może wtedy da się wywnioskować coś rozsądnego.

co do OOP - widzę, że nie kojarzysz o co chodzi. na wrzuć w google 'podstawy OOP' i poczytaj coś na ten temat...


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
Zdunek
post
Post #7





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

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


klasa news_arts
  1. <?php
  2. class news_arts{
  3. public $all_id=array();
  4. public $dane=array();
  5.  public function __construct($host, $dbname, $user,  $pass = ''){ // 1
  6.        $sql_conn = mysql_connect($host, $user, $pass)
  7.        // w przypadku niepowodzenia połączenia zakoĹ„cz aplikacjÄ™
  8.        or die('Nie mogĹ‚em poĹ‚aczyć siÄ™ z  bazÄ… danych');
  9.        mysql_select_db($dbname)or die("WystÄ…piĹ‚ błąd podczas wybierania bazy danych");
  10.    }
  11.  public function __destruct(){ // 2
  12.        mysql_close();
  13.         }
  14. public function exist($id){
  15.    global $news;
  16.    global $arts;
  17.    global $lang;
  18.    $exist=strip_tags($id);
  19.    $idzapytania = mysql_query("SELECT `forum_id` FROM `ipb_topics` WHERE `tid`='".$exist."'");
  20.    $wiersz = mysql_fetch_row($idzapytania);
  21.    if( array_keys($news[$lang],7) || array_keys($arts[$lang],7))
  22.    {
  23.        echo 'Element istnieje w tablicy!';
  24.    }
  25.    else
  26.    {
  27.    echo "element nie istnieje w tablicy";
  28.    }
  29.    return $wiersz[0];
  30.    }
  31.  
  32. }
  33. ?>

plik z tablicami
  1. <?php
  2. $news = array(array());
  3. $arts = array(array());
  4. $news["pl"][0]=6;
  5. $arts["pl"][0]=7;
  6. $news["en"][0]=6;
  7. $arts["en"][0]=7;
  8. $lang=$_COOKIE[lang];
  9. ?>


w indexie
  1. <?php
  2. $news=new news_arts($INFO['sql_host'],$INFO['sql_database'],$INFO['sql_user'],$INFO['sql_pass']);
  3. echo $news->exist($_GET["id"]);
  4. ?>


wszystko jest na pewno połączone i wczytuje się w odpowiedniej kolejności

...
Go to the top of the page
+Quote Post
MWL
post
Post #8





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

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


może poużywaj $this->news zamiast zmiennych global. Jesli chcesz ja wysłać dalej mozesz przecież przesłać to przez funkcję lub użyć singleatona


--------------------
Wpadaj na mój kanał o PHP. Dużo mięsa 🥩!
Go to the top of the page
+Quote Post
Mize
post
Post #9





Grupa: Zarejestrowani
Postów: 84
Pomógł: 6
Dołączył: 26.03.2008
Skąd: Łódź

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


W tym kodzie nie ma co poprawiać, lepiej go napisać od nowa bo to kiepska struktura zamknięta w klasie.


--------------------
NULL;
Go to the top of the page
+Quote Post
Zdunek
post
Post #10





Grupa: Zarejestrowani
Postów: 57
Pomógł: 2
Dołączył: 29.08.2008

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


no cóż każdy kiedyś zaczynał, z tego powodu piszę w przedszkolu smile.gif
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 20:57