Problemen met functie
1. Bij het aanmaken van een gebruiker krijg ik de volgende melding:
Notice: Trying to get property of non-object in C:\Webserver\Apache2.2\htdocs\kb\class\admin.class.php on line 46.
Na mijn wete is $obj-username toch echt een opbject in mijn ogen.
2. Ik heb op verschillende stukken van de functie iets gedeclareerd aan $message;, echter in welk stuk dan ook print hij niets op het scherm wanneer ik echo $message; doe op de pagina waar ik de functie aanroep.
Iemand een idee? Code hieronder.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
// Aanmaken van een nieuwe gebruiker
function createNewUser($uname, $vnaam, $anaam, $pass1, $pass2, $lvl, $locked) {
include ('../cfg/conf.php');
try {
$sel = $conn->prepare("SELECT username FROM users WHERE username=:username");
$sel->bindParam (':username', $uname, PDO::PARAM_STR, 5);
$sel->execute();
$obj = $sel->fetch(PDO::FETCH_OBJ);
if ($obj->username == $uname) {
$message = '<span style="text-align: center; color:rood; ">Deze gebruikersnaam bestaat al.</span>';
$conn = null;
header ('Location: ../admin/createUser.php');
}
}
catch (PDOException $e) {
echo $e->getMessage();
}
if ($pass1 === $pass2) {
$data = $uname;
$data .= $pass1;
$hashpass = hash ('sha256', $data);
} else if ($pass1 != $pass2) { $message = '<span style="text-align: center; color:red;">Wachtwoorden komen niet overeen.</span>';
} else { $message = '';}
if ($lvl == '0') {
$lvlDes = 'Gebruiker';
} else if ($lvl == '22') {
$lvlDes = 'Redacteur';
} else if ($lvl == '44') {
$lvlDes = 'Administrator';
}
try {
$sel = $conn->prepare("INSERT INTO users (username, psswd, vnaam, anaam, gdatum, ulevel, ulevelDescription, locked) VALUES (:uname, :psswd, :vnaam, :anaam, :gdatum, :ulevel, :ulevelDescription, :locked) ");
$sel->bindParam (':uname', $uname, PDO::PARAM_STR, 5);
$sel->bindParam (':psswd', $hashpass, PDO::PARAM_STR, 5);
$sel->bindParam (':vnaam', $vnaam, PDO::PARAM_STR, 5);
$sel->bindParam (':anaam', $anaam, PDO::PARAM_STR, 5);
$sel->bindParam (':gdatum', date('d-m-Y H:i:s'), PDO::PARAM_STR, 5);
$sel->bindParam (':ulevel', $lvl, PDO::PARAM_STR, 5);
$sel->bindParam (':ulevelDescription', $lvlDes, PDO::PARAM_STR, 5);
$sel->bindParam (':locked', $locked, PDO::PARAM_STR, 5);
$sel->execute();
$message = '<span style="text-align: center; color:green; ">De gebruiker is succesvol aangemaakt</span>';
}
catch (PDOException $e) {
echo $e->getMessage();
}
}
?>
// Aanmaken van een nieuwe gebruiker
function createNewUser($uname, $vnaam, $anaam, $pass1, $pass2, $lvl, $locked) {
include ('../cfg/conf.php');
try {
$sel = $conn->prepare("SELECT username FROM users WHERE username=:username");
$sel->bindParam (':username', $uname, PDO::PARAM_STR, 5);
$sel->execute();
$obj = $sel->fetch(PDO::FETCH_OBJ);
if ($obj->username == $uname) {
$message = '<span style="text-align: center; color:rood; ">Deze gebruikersnaam bestaat al.</span>';
$conn = null;
header ('Location: ../admin/createUser.php');
}
}
catch (PDOException $e) {
echo $e->getMessage();
}
if ($pass1 === $pass2) {
$data = $uname;
$data .= $pass1;
$hashpass = hash ('sha256', $data);
} else if ($pass1 != $pass2) { $message = '<span style="text-align: center; color:red;">Wachtwoorden komen niet overeen.</span>';
} else { $message = '';}
if ($lvl == '0') {
$lvlDes = 'Gebruiker';
} else if ($lvl == '22') {
$lvlDes = 'Redacteur';
} else if ($lvl == '44') {
$lvlDes = 'Administrator';
}
try {
$sel = $conn->prepare("INSERT INTO users (username, psswd, vnaam, anaam, gdatum, ulevel, ulevelDescription, locked) VALUES (:uname, :psswd, :vnaam, :anaam, :gdatum, :ulevel, :ulevelDescription, :locked) ");
$sel->bindParam (':uname', $uname, PDO::PARAM_STR, 5);
$sel->bindParam (':psswd', $hashpass, PDO::PARAM_STR, 5);
$sel->bindParam (':vnaam', $vnaam, PDO::PARAM_STR, 5);
$sel->bindParam (':anaam', $anaam, PDO::PARAM_STR, 5);
$sel->bindParam (':gdatum', date('d-m-Y H:i:s'), PDO::PARAM_STR, 5);
$sel->bindParam (':ulevel', $lvl, PDO::PARAM_STR, 5);
$sel->bindParam (':ulevelDescription', $lvlDes, PDO::PARAM_STR, 5);
$sel->bindParam (':locked', $locked, PDO::PARAM_STR, 5);
$sel->execute();
$message = '<span style="text-align: center; color:green; ">De gebruiker is succesvol aangemaakt</span>';
}
catch (PDOException $e) {
echo $e->getMessage();
}
}
?>
Gewijzigd op 10/08/2013 21:01:39 door Chris PHP
De variabele conn is nog leeg in jouw functie
Nee die komt uit de conf.php include daar wordt de connectie gemaakt.
Overigens heb ik punt 2 al opgelost. Vergeten buiten de laatste try/catch echo $mesaage; in de functie te zetten. Eigenlijk alweer te lang bezig vandaag ;-)
Overigens als ik zo kijk naar je query, dan heb ik het idee dat je die query uitvoert om te controleren of die gebruiker al bestaat. Dan is bovenstaande situatie dus zeer realistisch en is de kans groot dat je dus nooit een object terugkrijgt. Volgens mij kan je beter gewoon een unieke index op je username zetten en dan gewoon de user invoeren. Geen check vooraf. Gaat de query goed, dan bestond die user nog niet. Gaat de query fout dan (afhankelijk van de foutcode) bestond de username al.
Tja wat je zegt Erwin, ik denk idd dat ik deze 'notice' blijf houden. Is natuurlijk niet erg wanneer hij live gaat staat error reporting op 0, en komt deze niet meer omhoog.
Probleem met $message is opgelost, bij elke if die nu fout kan gaan heb ik de header weggehaald want dit werkt niet en geeft hij de $message niet door. Nu zit er in elke if waar hij hem op kan afbreken (dubbele username en wachtwoord komt niet overeen) een exit(); met daarvoor de $message = 'juiste melding hier'.
Nu geeft hij bij elke fout netjes de juiste melding in beeld.
@Erwin,
Ik zal eens kijken naar de optie kijken voor de unique optie op de gebruikersnaam, neem aan dat ik dit met een if query == false kan opvangen en een juiste melding kan aangeven.
Bedankt voor het meedenken.
Als je een unieke key op je kolom zet dan zou je het helemaal correct kunnen checken door eerst te controleren of de query is gelukt. Zo nee, dan uitlezen welke error is gegeven met pdo.errorinfo en als het error nummer 23000 is (als ik het goed heb) dan heb je een dubbele invoer voor een unieke key. Dan weet je dus dat de user al bestond.
Alleen checken op of de query gelukt is zal in 99% van de gevallen wel correct werken, maar als er een keer iets anders mis gaat dan weet je dat natuurlijk niet meer.
Dank je voor de update, als ik het dus op de unique key doe dan moet ik even gaan kijken hoe ik daar het beste een foutmelding voor kan generen. Dit is mijn eerste project waar ik volledig gebruik ga maken van PDO ipv mysql_ of mysqli_.
Het is allemaal nog wat nieuw als je begrijpt wat ik bedoel ;-)
Toevoeging op 12/08/2013 12:35:14:
P.S.
Ik neem aan dat de pdo.errorinfo in de catch moet komen? Aangezien daar de error wordt opgehaald, of komt dit nog gewoon in de try te staan?
Ik dacht 1062. maar misschien dat pdo 23000 de sql state teruggeeft. Ik controleer altijd de error message op de aanwezigheid van 'duplicate'. Die errorno's verschillen per database systeem.
Heb de object notice nu tijdelijk opgelost door eerst te kijken of $obj een opbject is met is_object(). Als dit een object is gaat hij verder en geeft een melding dat de naam al bestaat, is het geen object dan bestaat de naam nog niet (query fail) en gaat hij verder.
Tevens wist ik niet dat je dit niet mocht van strict standards
$sel->bindParam (':gdatum', date('d-m-Y H:i:s'), PDO::PARAM_STR, 5);
Er mogen volgens de strict standard alleen maar variabelen gegeven worden in de binds
Waarom zou je daar overigens een parameter voor gebruiken? Gewoon NOW() bij de values heeft hetzelfde effect.
Waarom eigenlijk alles naar objecten ipv array's? Dan krijg je stuk minder problemen ook.. Althans, ik heb _never_ problemen met FETCH_ASSOC..
Omdat ik een duidelijk nederlands formaat/notatie wil bij het uitlezen van deze data. Er wordt niets mee gedaan anders dan door mensen gelezen, vandaar dat ik voor deze optie heb gekozen.
@Chris,
Omdat mijn doel is zoveel mogelijk over te gaan naar OOP waar mogelijk, dit werkt perfect om te beginnen en het OOP te leren.
Objecten of arrays ophalen maakt niets uit, zolang je maar de juiste test uitvoert. Verder is het gewoon een keuze.
Chris NVT op 12/08/2013 19:51:56:
@Ger,
Omdat ik een duidelijk nederlands formaat/notatie wil bij het uitlezen van deze data. Er wordt niets mee gedaan anders dan door mensen gelezen, vandaar dat ik voor deze optie heb gekozen.
Omdat ik een duidelijk nederlands formaat/notatie wil bij het uitlezen van deze data. Er wordt niets mee gedaan anders dan door mensen gelezen, vandaar dat ik voor deze optie heb gekozen.
Mijn keuze zou het niet zijn, maar dan blijft nog steeds die parameter zinloos.
Het is namelijk geen gebruikers invoer maar iets wat je met PHP genereert.
Ger van Steenderen op 12/08/2013 20:06:29:
Mijn keuze zou het niet zijn, maar dan blijft nog steeds die parameter zinloos.
Het is namelijk geen gebruikers invoer maar iets wat je met PHP genereert.
Chris NVT op 12/08/2013 19:51:56:
@Ger,
Omdat ik een duidelijk nederlands formaat/notatie wil bij het uitlezen van deze data. Er wordt niets mee gedaan anders dan door mensen gelezen, vandaar dat ik voor deze optie heb gekozen.
Omdat ik een duidelijk nederlands formaat/notatie wil bij het uitlezen van deze data. Er wordt niets mee gedaan anders dan door mensen gelezen, vandaar dat ik voor deze optie heb gekozen.
Mijn keuze zou het niet zijn, maar dan blijft nog steeds die parameter zinloos.
Het is namelijk geen gebruikers invoer maar iets wat je met PHP genereert.
Ik gebruik een prepare statement met Binds waarom zou ik dan dat ene niet escapen ondanks het door php gegenereerd wordt?
Gewijzigd op 12/08/2013 21:33:12 door Chris PHP
Wie ow wie kan er iets veranderen aan date('d-m-Y')?
houdt er wel rekening mee dat het een variabel is, iets wat wel gewijzigd kan worden. Dus waarom zou ik dan op een onveilige manier mijn query zo beschikbaar stellen? Ik ben zelf nooit voorstander om php functies rechtstreeks in een string te zetten.
Je maakt een user aan, en dan vraag je de huidige datum/tijd op.
Met een enkel insert statement is die datum weinig variabel.
Ik plaats geen php functies direct in mijn query strings, dit is tegen mijn principe in. date() is een functie en plaats ik dus ten alle tijden buiten de queries, wat resulteert in een variabel x die gedeclareerd wordt aan date().
Daarom wordt deze bij mij net als alle andere inputs ge-escaped omdat deze gedelcareerd staat aan een variabel.