[PHP] błąd przy fetch_array,nie mam juz pomyslu

Witam was serdecznie,ostatnio znów zacząłem bawić się php.

Jako ze interesuje się fotografia postanowiłem napisać sobie prosta galerie.

Wykorzystuje OPT 1.1.4 + wamp5(localhost) do testowania i pisania skryptu.

Przy wykorzystaniu mojej klasy dostaje jak na razie takie 2 błędy,przeczesałem cały kod,literówek raczej nie ma(korzystam z Eclipse + pdt):

Błąd:

Rozumiem co ten błąd oznacza,ale za chiny nie mogę doszukać się w tym miejscu błędu…sądzę ze gdzieś indziej pies jest pogrzebany ;/

Część kodu wygląda mniej więcej tak:

Klasa Galerii:

class galeria{

//-----konfiguracja

	private $max_rozmiar;	

	private	$fn;

	private	$upload ;

	private	$uploadthumb;

	private $link;

	const host = 'ppp';

	const haslo = '1234';

	const user = 'ppp';

	const baza = 'homesite';

//---------------------------------------


	public function __construct(){

		$this -> link=mysql_connect('$this ->host','$this-> user','$this ->haslo');

		    if(!is_resource($this -> link)){

            die('Brak połączenia z bazą!');

         }


		$this->max_rozmiar = 1024*1024*8;

	}

/*	public function __destruct(){

		if(is_resource($this -> link)){

            mysql_close($this -> link);


	}

	}

*/

	public function dodaj($catid,$opis,$tytul,$tagi){

		//--konfiguracja nazw plikow

			$this->fn = $this->genname($_FILES['plik']['name']).'.jpg' ;

			$this->upload = $_SERVER['DOCUMENT_ROOT'].'homesite/photos/'.$this->fn;

			$this ->uploadthumb = $_SERVER['DOCUMENT_ROOT'].'homesite/photos/thumbs/'.$this->fn;

		//---obsluga pliku

			if (is_uploaded_file($_FILES['plik']['tmp_name'])) {

  				if ($_FILES['plik']['size'] > $max_rozmiar) {

  					echo 'Za duzy plik !!';

  				} else {

			        echo 'Odebrano plik. Początkowa nazwa: '.$_FILES['plik']['name'];

			        echo '
';

        		if (isset($_FILES['plik']['type'])) {

          			echo 'Typ: '.$_FILES['plik']['type'].'
';

         		}

  				move_uploaded_file($_FILES['plik']['tmp_name'],$this->upload);

  				}

				} else {

     				echo 'Błąd przy przesyłaniu danych!';

				}

		//---plik odebrany dalsze dzialania

		$this->resizeImage($upload,480,640,$this->uploadthumb,90);

		$query = "INSERT INTO `photos` (`id` ,`cat_id` ,`filename` ,`date` ,`description` ,`title` ,`tags`) VALUES (NULL , '$catid', '$this->fn', CURDATE( ) , '$opis', '$tytul', '$tagi')";

        mysql_query($query,$this ->link);


	}

	public function usun($pid){

		$query = "DELETE FROM `photos` WHERE `photos`.`id` = $pid ";

	    mysql_query($query,$this->link);

	}

	public function wyswietl($od,$do,$cat_id){

			$query = "SELECT * FROM `photos` WHERE `cat_id` =$cat_id ORDER BY `date` DESC LIMIT'$od','$do'";

	        $result = mysql_query($query);

		    while ($wiersz = mysql_fetch_array($odp)){

   			$dane[] = array(

                'nazwa' => $wiersz['filename'],

                'tytul' => $wiersz['title'],

                'opis' => $wiersz['description'],

   				'dodano'=>$wiersz['date']

   			);

   			return $dane; 

		}

	}

	public function kat($id){

		$query = "SELECT * FROM `cat` WHERE `cat_id`='$id'";

		$result = mysql_query($query,$this->link);

		$row = mysql_fetch_row($result);


		return $row[1]; 



	}

A tak wywołuje i używam owa klasę:

<?php

    define('OPT_DIR', './lib/');

    require('./lib/opt.class.php');

	require('./lib/gal_class.php'); 

    try

    {    

        $tpl = new optClass;

        $tpl -> root = './templates/';

        $tpl -> compile = './templates_c/';

        $tpl -> gzipCompression = false;

        $tpl -> httpHeaders(OPT_HTML);


        $galeria = new galeria();



        $tpl -> assign('album',$galeria->wyswietl(0,100,1));

        $tpl -> assign('kategoria',$galeria->kat(1));    


        $tpl -> parse('index.tpl'); 

    }

    catch(optException $exception)

    { 

        optErrorHandler($exception); 

    }



?>

To oznacza że masz błędy w zapytaniu…

Wklej zapytania i zweryfikuj je…

Zobacz czy dadzą poprawny wynik w phpMyAdmin

Wyświetl sobie $result po query za pomocą np. print_r i sprawdź czy jakiś błąd nie został zwrócony, zanim wywołasz fetch_*

A w tym konkretnym przypadku na pewno sam zauważysz błąd, jeśli dokładnie przyjrzysz się linii wskazanej przez php…

$result = mysql_query($query);

while ($wiersz = mysql_fetch_array($odp)){

Stosowanie “error_reporting(E_ALL);” gdzieś na początku programu pozwala łatwiej zauważyć takie błędy

tak,tak w tej konkretnej lini faktycznie głupiutki błąd :oops: Sprobowalem print_r,no ni chu-chu nic nie pokazuje. Same zapytania w phpmyadmin dzialaja,no wiadomo nie ma tam zmiennych php…może tu błąd gdzies jest,tylko ze go nie widze,usuwanie apostrofow,zmienianie ich nic nie daje…ehh Zapytania wygladają tak:

$query = "SELECT * FROM `photos` WHERE `cat_id` =$cat_id ORDER BY `date` DESC LIMIT'$od','$do'";

$query = "SELECT * FROM `cat` WHERE `cat_id`='$id'";

Zmienne w zapytaniach sa pobierane jako argument funkcji…o tak:

public function wyswietl($od,$do,$cat_id){

			$query = "SELECT * FROM `photos` WHERE `cat_id` =$cat_id ORDER BY `date` DESC LIMIT'$od','$do'";

	        $result = mysql_query($query);

	        print_r($result); 

		    while ($wiersz = mysql_fetch_array($result)){

   			$dane[] = array(

                'nazwa' => $wiersz['filename'],

                'tytul' => $wiersz['title'],

                'opis' => $wiersz['description'],

   				'dodano'=>$wiersz['date']

   			);


   			return $dane; 

		}

	}

$tpl -> assign('album',$galeria->wyswietl(0,100,1));
$result = mysql_query($query);

while ($wiersz = mysql_fetch_array($result)){

http://pl2.php.net/mysql_fetch_array

Chodzi Ci o to ze nie ma 2 argumentu w fetch_array ?? On jest przeciez opcjonalny…jesli to nie to,to naprowadz mnie bardziej…bo patrze sie w ten kod i nie widze co mam poprawic :wink:

Brak zmienej odwolujacej sie do polczenia do bazy tez nic nie zmienia…

Z tego co się dopatrzyłem to błąd leży tu:

$this -> link=mysql_connect('$this ->host','$this-> user','$this ->haslo');

Apostrofy niepotrzebne.

tak,tak…na szybko zmieniłem przy pisaniu posta…jak mam te wartości wpisane ręcznie,bez odwołania na stale tez nie działa :evil: .

Piwo temu kto roziwaze ten problem :smiley:

podstawowe techniki debugingu kazały by sprawdzić jakie błędy może powodować aplikacja, dlatego też zamiast

$result = mysql_query($query);

należało by zastosować

$result = mysql_query($query) or die(mysql_error());

i na tej podstawie dalej szukać błędu

Aj, troszkę źle napisałem, za dużo używam PEAR::DB. Zgodnie z manualem powinno się zrobić coś w stylu

$result = mysql_query("SELECT kolumna FROM tabela")

or die(mysql_error())

Swoją drogą Print_r wartości logicznych nie wyświetla, muszę się w końcu zmusić żeby var_dump używać :slight_smile:

No to może jeszcze raz w formie porównania:

Było

$result = mysql_query($query);

while ($wiersz = mysql_fetch_array($odp)){

Ja napisałem:

$result = mysql_query($query);

while ($wiersz = mysql_fetch_array($result)){

Tak znalazłem ten błąd…dobra rada dla wszystkich,jeśli szukasz błędu przez długi czas…idź zrobić sobie herbatkę,15 minut spaceru z psem i od razu lepiej człowiekowi myślenie idzie !!

Dzięki wszystkim za cenne rady,przydadzą się na przyszłość :smiley:

Jeszcze tu do was trafie pewnie :wink:

Miłego dnia Życzę !!