Hej eksperter jeg har 4 filer, og tror det er min extends den er gal med!: index.php connection.cls.php query.cls.php user.cls.php
index.php, includer_once user.cls.php connectiion.cls.php, laver database forbindelsen query.cls.php, laver selve forspørgelserne til databasen, og extender fra Connection user.cls.php, mit ikke færdige login system, som extender fra Query
Fejlen jeg modtager: Fatal error: Call to undefined method User::noConnection() in cls/query.cls.php on line 8
public function noConnection($error) { /*if($this->show_errors) $error = "<br />\n<b>".$error."</b>"; else $error = ""; */ exit("<span style=\"font-family: Verdana; font-size: 10px; color: #FF0000;\">Server opgraderes, dette kan tage op til 15 minutter!".stripslashes($error)."</span>"); } // end the function noConnection
function __destruct() { @mysql_close($this->dbhandler); } // ends the function __destruct
} // ens the class connection ?>
query.cls.php ---------------------------------------------------- <?PHP include_once("connection.cls.php"); class Query extends Connetion {
public function returnSQL($sql) { if(!(strstr(strtoupper($sql), "INSERT") || strstr(strtoupper($sql), "DELETE") || strstr(strtoupper($sql), "UPDATE"))) { // ONLY SELECT STATESMENT IS ILLEGAL! $query = @mysql_query($sql, $this->dbhandler) or Die($this->noConnection(mysql_error()));; //if(!$query) //$this->noConnection("There is an error with this sql string. String is: ".$sql."<br />\n".mysql_error()); $lines = array();
while ($row = mysql_fetch_assoc($query)) { $lines[] = $row; } return $lines; } else { $this->noConnection("Illegal sql commando : NO ".substr($sql, 0, 6)."!<br />\n".$sql); } } // end the function returnSQL
public function execSQL($sql) { if(!strstr(strtolower($sql), "SELECT")) { $query = @mysql_query($sql, $this->dbhandler) OR $this->noConnection("There is an error with this sql string. String is: ".$sql."<br />\n".mysql_error()); if($query) return true; else return false; } else { $this->noConnection("Illegal sql commando<br />\n".$sql); } } } // end the class Query ?> user.cls.php ----------------------------------------------------- <?PHP include_once("query.cls.php"); class User extends Query { protected $user; protected $pass;
public function LogMeIn($user, $pass) { $sql = "SELECT COUNT(*) as cnt FROM sn_user WHERE email = '".$user."' AND usr_pass = '".$pass."';"; $query = parent::returnSQL($sql);
if($query[0]['cnt'] == 1) { //setcookie() return "Velkommen"; } else { return "fejl"; } } } // end class User ?>
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
På den pågældende linie, linie 8 i query.cls.php, har du afsluttet med 2 x ; istedet for et. Prøv at rette det til et, og se om det ikke løser problemet. Hvorfor den siger, at du laver en statisk reference til en metode som ikke eksisterer er ikke lige til at forstå, men mit bud er, at det vil løse problemet, hvis du fjerner det ekstra semicolon.
Synes godt om
Slettet bruger
27. september 2007 - 00:08#2
Så er den rettet... men virker ikke... Er det fordi jeg bruger exnteds 2 gange...?
index henter user filen ind, og den extender query filen, som extender connection filen... er det fordi de der include ikke bliver lavet i de på gældende filer?
Synes godt om
Slettet bruger
27. september 2007 - 11:14#3
Andre?
Synes godt om
Slettet bruger
28. september 2007 - 13:58#4
Hmm... da irriterene at den fejl kan gøre så meget!
1) Et ekstra ';' på sådan en plads vil aldrig give anledning til en fejl - det er simpelthen bare en ekstra (tom) linje kode.
2) Jeg forstår ikke lige hvorfor din fejl siger "User::..." eftersom at User-klassen slet ikke er blevet introduceret i query.cls.php. Har du nogen ide?
3) Set fra et OOP-perspektiv børe din User ikke extende Query - en brugere er jo basalt set ikke en database forbindelse. I stedet bør din User-klasse have et (private) Query objekt som det bruger til at slå op i databasen (forholdet mellem User og Query bør ændres fra is-a til has-a som man siger i OOP jargon).
4) På samme måde gælder der faktisk også at Query ikke bør extende Connection. I stedet bør Query bruge en Connection-klasse til at udføre sin forespørgsel.
function __construct() { $conn = new Connection() }
public function returnSQL($sql) { if (!(strstr(strtoupper($sql), "INSERT") || strstr(strtoupper($sql), "DELETE") || strstr(strtoupper($sql), "UPDATE"))) { // ONLY SELECT STATESMENT IS ILLEGAL! $query = @mysql_query($sql, $conn->dbhandler) or die($conn->noConnection(mysql_error()));; // if(!$query) // $this->noConnection("There is an error with this sql string. String is: ".$sql."<br />\n".mysql_error()); $lines = array();
while ($row = mysql_fetch_assoc($query)) { $lines[] = $row; }
return $lines; } else { $this->noConnection("Illegal sql commando : NO ".substr($sql, 0, 6)."!<br />\n".$sql); } } // end the function returnSQL
// Øvelse: tilret selv execSQL() ..............
} // end the class Query ?>
$dbhandler i Connection skal selvfølgelig ændres fre protected til public.
Synes godt om
Slettet bruger
01. oktober 2007 - 08:44#11
Er det ikke lidt farligt sådan en data som $dbhandler, er public og kan tilgås fra alle?
I C# har man en access-modifier som kaldes "internal" - aller helst ville jeg have brugt den, men jeg mener ikke at den ekslistere i PHP.
Det vigtigste når du laver klasser er dog at de bør designes logisk. Hvis en klasse skal arve fra en anden, så bør det være fordi at den nedarvende klasse er en specialisering af super-klassen. En query er ikke en specialisering af en database-forbindelse...
Synes godt om
Slettet bruger
01. oktober 2007 - 09:03#13
Fisk... kan du så forklarer mig hvordan det gøres på den bedste måde? Og ville det være smart at ha, alle sine kald i en samlet fil bare som databasekaldet, uden data fra databasen, hvis man nu skifter database, så kan man bare lige rette alle sammen i et dokument.
Ingen points før at vi har fået løst dit problem :^)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.