Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] funkcja array_keys i zmienne w klasach
Forum PHP.pl > Forum > Przedszkole
Zdunek
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
Mize
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.
Zdunek
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
nevt
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.
Zdunek
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 ?
nevt
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...
Zdunek
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

...
MWL
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
Mize
W tym kodzie nie ma co poprawiać, lepiej go napisać od nowa bo to kiepska struktura zamknięta w klasie.
Zdunek
no cóż każdy kiedyś zaczynał, z tego powodu piszę w przedszkolu smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.