| Autor | Zpráva | ||
|---|---|---|---|
| selektorX Profil * |
#1 · Zasláno: 3. 12. 2009, 23:25:11
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 |
#2 · Zasláno: 4. 12. 2009, 00:08:06
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 * |
#3 · Zasláno: 4. 12. 2009, 08:52:29
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 |
#4 · Zasláno: 4. 12. 2009, 12:54:44
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 |
#5 · Zasláno: 4. 12. 2009, 14:09:41
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 * |
#6 · Zasláno: 4. 12. 2009, 19:16:44
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 |
#7 · Zasláno: 4. 12. 2009, 23:02:12
selektorX:
„or die(mysql_error());“ tohle hlavně nezapomeň vyhodit, než web budeš publikovat - je to "dobrý tahák pro hackery". |
||
|
Časová prodleva: 16 let
|
|||
0