Autor Zpráva
selektorX
Profil *
Mám problém s mysql_fetch_array. Nějak mi nefunguje, pokud to bere argumenty z třídy:
class db {

	var $server;
	var $user;
	var $password;
	var $database;

		function connect() {
			$this->spojeni = mysql_connect($this->server, $this->user, $this->password);
			$this->query("SET NAMES `utf8`");
		}

		function close() {
			mysql_close();
		}
		function query($qry) {
			return mysql_db_query($this->database , $qry, $this->spojeni) or die(mysql_error());
		}
		function fetch_query($qry) {
			$qr2 = mysql_db_query($this->database , $qry, $this->spojeni) or die(mysql_error());
			return mysql_fetch_row($qr2);
		}

}

class sys {

		function userslist($limit1=0,$limit2=30) {
			global $db;
			return $db->query("SELECT * from `users` LIMIT ".$limit1.", ".$limit2);
		}
		
}

while($userprint = mysql_fetch_array($sys->userslist())) {
	echo $userprint['username'];
}

echo $sys->userslist() vrátí 1 takže to něco vrací, ale je problém že tato má konsturkce mi vrací "mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ..". Kde dělám chybu?
Majkl578
Profil
Kód je to opravdu příšerný. Doufám (ano, opravdu), že to běží někde kde je jen PHP4, protože kdyby i 5, tak bych se asi styděl. :) Přijde mi to jako pokus OOP bez znalosti jeho myšlenky. Jen aby byly v kódu šipečky. To raději piš procedurálně... :)
V rychlosti:
mysql_db_query() je deprecated
použití "global" je opravdu nepěkné
"var" se nepožívá, na to je public/protected/private

K problému: Nevolá se náhodou ta metoda při každém průchodu while? Řekl bych, že ano.

Nevím, jestli něco z toho co jsem napsal problém řeší, ale nemohl jsem si pomoct.
selektorX
Profil *
To problém opravdu neřeší. Taky bych řekl, že se volá při každém průchodu while, ale pokud nic z toho není v třídách tak to funguje). K těm třídám: jsou napsané pro PHP4, v současnosti běží na PHP5. Nemyslím si že jsou šílené. Je to pro specifické použití pro správu uživatelů. Dotazy ve funkcích v třídě sys jsou někdy až 4 řádky dlouhé + v třídě db potom definuju jednotlivá pravidla, omezení proti útoky na db(i když je je fakt, že už jsem to v php5 odstranil). Jak byste to teda řešil vy? Celá aplikace funguje takto: index.php načte třídy a config, pak includuje login.php, ten login_class.php. Pokud je přihlášení úspěšné, tak login.php načte logged.php. Jednoduchý a fuknční princip. Co se vám na tom nelíbí?
Majkl578
Profil
Asi jsem zkažený z MVP, Nette a dibi... :) Například jsem zvyklý na automatické fetchování dotazů. Jinak mimochodem, když se pokaždé volá ta metoda z while znovu, nevolá se náhodou i ten dotaz znovu a nevrací nový resource? ;)

Poloobjektový přístup k práci s databází je opravdu divný. Třeba tohle bych udělal jinak.
Mimojiné nevidím žádný logický význam třídy sys.
AM_
Profil
echo $sys->userslist() vrátí 1
tak to je zřejmě bug PHP, protože fce mysql_db_query může vracet jedině boolean nebo objekt mysqli_result.
selektorX
Profil *
Tak jsem se přinutil přepsat ten starý php4 kód do php5 a mimo to že je to jednodušší to funguje :)

class sys {

		function __construct($server,$user,$password,$database) {
			mysql_connect($server, $user, $password);
			mysql_select_db($database);
			mysql_query("SET NAMES `utf8`");
		}

		function __destruct() {
			mysql_close();
		}

		function fetch($qry) {
			$fer=mysql_query($qry) or die(mysql_error());
			return mysql_fetch_row($fer);
		}
		function userslist($limit1=0,$limit2=30) {
			$mfq = mysql_query("SELECT * from `users` LIMIT ".$limit1.", ".$limit2);
			for($i=0; $userprint=mysql_fetch_array($mfq); $i++) {
				$retuser[$i]=$userprint;
			}
			return $retuser;
		}
		
}
foreach ($sys->userslist() as $value) {
    echo ">".$value['username']."<<br>";
}
AM_
Profil
selektorX:
or die(mysql_error());
tohle hlavně nezapomeň vyhodit, než web budeš publikovat - je to "dobrý tahák pro hackery".

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: