Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
#3 Du erstatter fejl med fejl. Index-angivelserne i de $_POST's er ganske givet ikke angivet som konstanter.
#0, #1 Udover de fejl som kimsey0 udpeger, lader det ikke til at $mysqli er instancieret. Du siger godt den er, men din klasse viser ikke en instanciering af $mysqli i dit objekts scope.
Variabler - som ikke er defineret som globale - eksisterer kun i det scope de er oprettet i ($_POST, $_GET, $_SESSION og lign. er superglobaler og er en klasse for sig).
Synes godt om
Slettet bruger
02. oktober 2009 - 20:55#5
#4 Undskyld. Der skulle selvfølgelig have været gåseøjne rundt om "userid".
Tak kimsey0, Jeg har vidst lavet en lille dum fejl der som du skriver...
Men fejlen er nu:
Notice: Undefined variable: mysqli in C:\wamp\www\finans\functions\albert\login.php on line 29
Fatal error: Call to a member function query() on a non-object in C:\wamp\www\finans\functions\albert\login.php on line 29
Arne_v: Jeg er ikk god til OOP, og det må jeg indrømme. Men har du et forslag til hvordan strukturen så skal være på min kode?
Synes godt om
Slettet bruger
03. oktober 2009 - 11:40#8
Jeg vil endnu gerne gentage, at jeg ikke er en haj til OOP, og jeg kender heller ikke særligt meget til mysqli, men måske kunne du undgå fejlen ved at oprette MySQLi objektet i Login objekts construktor. Altså:
class Login{
function __construct() { $mysqliInstance = new mysqli; }
...Blah, blah, blah...
$query = $mysqliInstance->query("SELECT * FROM medlemmer where userid='".$uid."' and password='".$pwd."'");
Der er flere ting du kan gøre. I stedet for at kalde header, kan du lave et lille echo som kan fortælle dig hvor langt koden er nået.
Dernæst bør du vise hvordan din kode ser ud nu samt hvordan du bruger din klasse.
Du bør også se på om der kunne være en mysql fejl. Det kan du gøre ved: $query = $mysqli->query("SELECT * FROM medlemmer where userid='".$uid."' and password='".$pwd."'") or die($mysqli->error);
Du bør også se på hvor mange rækker din sql giver dig: printf("Select returned %d rows.\n", $query->num_rows);
Jeg har prøvet alt hvad du har skrevet dkfire. Den siger at der er 0 rækker i posten. Men det ved jeg at der ikke er... Jeg tror at jeg er ved at blive skør på det her...
Men jeg forstår ikke helt hvad det er du mener med at jeg skal vise min kode. for det gør jeg jo oppe i toppen...
#14 Det dkfire vil er at se din kode i sin nuværende form. Du har jo foretaget rettelser siden dit første indlæg. Forhåbentlig vil der også være en snert af indtrængen af de gode råd der er kommet fra både dkfire og arne_v, således du har fået en løsning som er til at arbejde med.
$query = $GLOBALS['mysql']->query("SELECT * FROM medlemmer where userid='".$uid."' and password='".$pwd."'")or die($mysqli->error); $result = mysqli_fetch_array($query);
printf("Select returned %d rows.\n", $query->num_rows); echo "<br />";
Det eneste du har gjort er at gøre din $mysqli variabel global, tilføjet en die() til denne og tilføjet en echo af antal fundne rækker i databasen?
Din klasse er stort set ubrugelig og har ikke nogen værdi, set i forhold til almindelig processuel kode.
Hvis det her er et forsøg på at blive bedre til at skrive objekt orienteret kode, ville det være bedre at få vurderet dit objekt - hvad der kan gøres smartere og hvad der kan gøres bedre - i forhold til hvad man ville ønske at opnå med OOP optimeret kode.
Jeg er altid parat til at lære mere... Jeg mangler bare nogle forslag. Jeg er lige startet med OOP og ja jeg er ikke særlig god til OOP. Men kan du vise mig nogle tricks, til hvordan det kan gøres smartere?
Jeg vil med glæde gerne lave et nyt spørgsmål, så du kan få nogle flere point...
Se det hjalp jo meget. Du bruger din klasse helt forkert.
<?php if(isset($_POST['submit'])){ $LogIn = new LogIn() ; <-- Du opretter et objekt af klassen og samtidig prøver du at logge ind. $LogIn->setUserid($_POST['userid']); <-- Du sætter username $LogIn->setPassword($_POST['password']); <-- du sætter password }; ?>
Dvs du prøver at logge ind med tomme værdier for username og password. Derfor giver den 0 rækker tilbage, da du ikke har en rækker med tomme felter i din tabel i databasen. Du bliver nød til at ændre din klasse, således at din klasse contructor ikke laver database tjekket, men kun initialisere din klasse's objekt. Dernæst skal du lave en ny funktion i klassen som laver dit databasen tjek og logger ind. Den funktion kalder du så efter du har sat brugernavn og kodeord.
Hvis du vil lære mere, skal du også vise at du er villig til at høre efter. arne_v og dkfire kom med nogle konstruktive indlæg, som du tilsyneladende har overset. Om det var i jagten på en løsning fremfor læren, skal jeg ikke kunne sige.
Du kan få et eksempel på et objekt du kan tilpasse som du beskriver det som dkfire og arne_v så venligt har forsøgt at forklare dig: http://php.pastebin.com/m76e2b5d7
Koden er ikke testet, så eventuelle syntaks fejl må du lige berede dig på.
Du bør nok læse lidt på oop, klasser og objekter. Men jeg skal forsøge.
Når din klasse hedder Login, så vil din funktion, metode, i klassen af samme navn være din contructor for denne klasse. ( I PHP5 hedder klassens contructor __constructor() ) Hvis du vil have at objectet af klassen Login skal udføre noget lige så snart det bliver initialiseret, ( ved "new Login()), skal den kode ligge i din contructor af klassen. Men i din tilfælde skal din klasse jo ikke forsøge at logge ind før du har givet et brugernavn og password den skal tjekke i databasen. Derfor skal din kode til login ikke ligge i constructoren af klassen men i en anden funktion, metode, i klassen.
Din klasse kunne jo se ud som følgende:
class Login{
private $userid; private $password; public $mysqli;
public function Login($mysqli){ $this->mysqli = $mysqli; }
public function setUserid($userid){ $this->userid = $userid; }
public function setPassword($password){ $this->password = $password; }
public function getUserid(){ return $this->userid; }
public function getPassword(){ return $this->password; }
$query = $mysqli->query("SELECT * FROM medlemmer where userid='".$uid."' and password='".$pwd."'")or die($mysqli->error); $result = mysqli_fetch_array($query);
printf("Select returned %d rows.\n", $query->num_rows); echo "<br />";
Nu må i endelig ikke forvirre mig... Jeg troede lige at det jeg først lavede var noget rod... Og så kommer der sådan et forslag som ligner meget på den jeg selv lavede. Det er måske ikk helt galt?
dkfires sidste forslag forklarer dig hvordan du kunne få den eksisterende kode til at virke efter hensigten da du havde nogle ret elementære fejl. Dog mener jeg stadig at den klasse har en ringe værdi.
Det forslag jeg kom med er jeg - selvfølgelig - overbevist om er en bedre og mere fleksibel løsning - også set ud fra de kommentarer som både dkfire og arne_v er kommet med.
OOP er meget mere end hvad jeg kan skitsere i så simpelt et eksempel, men nu har du noget at gå ud fra.
Lige et sidste spørgsmål? Kender sådan nogle kloge hoveder som jer, nogle godt steder hvor man evt. kan tage kurser i OOP? Jeg ønsker at lære mere men kan desværre ikke læse mig frem til ret meget. Jeg prøver at læse dokumentationen i php.net's hjemmeside og fatter det halve af hvad der står der inde...
Du opnår ikke meget andet end at lære brugen af OOP og de muligheder med OOP PHP giver dig, ved at læse manualen.
En god resource ville være at gå på google og søge på php design patterns og læse lidt op på det.
Eventuelt kunne du sætte dig et projekt for dagen; det kunne være du ville lave en klasse som kunne en specifik ting du tit har brug for. Lav din egen udgave af klassen, spørg herinde om der er nogen der har kritik/forslag til din kode.
Jeg må nok indrømme at det er meget lang tid siden jeg har haft et kursus i oop, og det var ikke et man sådan bare lige tog, og desværre heller ikke i php men c++.
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.