Problemen met functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Chris PHP

Chris PHP

10/08/2013 20:57:23
Quote Anchor link
Ik ben bezig met verschillende functies te schrijven en deze aan te roepen, ik heb echter twee punten waar ik nu op vastloop.

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
    }
}

?>
Gewijzigd op 10/08/2013 21:01:39 door Chris PHP
 
PHP hulp

PHP hulp

30/11/2024 20:40:35
 
Frank Nietbelangrijk

Frank Nietbelangrijk

10/08/2013 21:13:23
Quote Anchor link
De variabele conn is nog leeg in jouw functie
 
Chris PHP

Chris PHP

10/08/2013 21:15:16
Quote Anchor link
Frank,

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 ;-)
 
Erwin H

Erwin H

10/08/2013 22:47:02
Quote Anchor link
Ik neem aan dat regel 46 in probleem regel 12 is in de code. Als de query geen resultaten heeft opgeleverd, dan kan er geen regel worden uitgelezen en heb je dus ook geen object na je fetch. Dan is die foutmelding niet zo vreemd. Zou er wel een resultaat moeten zijn dan kan je altijd even met een var_dump checken wat er in obj zit.

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.
 
Chris PHP

Chris PHP

12/08/2013 12:10:10
Quote Anchor link
Problemen zijn verholpen,

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.
 
Erwin H

Erwin H

12/08/2013 12:19:59
Quote Anchor link
Notices wegdrukken met error_reporting is wat mij betreft een no-no, feit blijft dat er iets niet goed gaat dat je simpel kan voorkomen, maar dat is aan jou.

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.
 
Chris PHP

Chris PHP

12/08/2013 12:23:47
Quote Anchor link
@Erwin,

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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/08/2013 12:38:02
Quote Anchor link
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.
 
Chris PHP

Chris PHP

12/08/2013 18:57:16
Quote Anchor link
@Erwin,

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/08/2013 19:03:19
Quote Anchor link
Waarom zou je daar overigens een parameter voor gebruiken? Gewoon NOW() bij de values heeft hetzelfde effect.
 
Chris -

Chris -

12/08/2013 19:16:13
Quote Anchor link
Waarom eigenlijk alles naar objecten ipv array's? Dan krijg je stuk minder problemen ook.. Althans, ik heb _never_ problemen met FETCH_ASSOC..
 
Chris PHP

Chris PHP

12/08/2013 19:51:56
Quote Anchor link
@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.

@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.
 
Erwin H

Erwin H

12/08/2013 19:55:17
Quote Anchor link
Objecten of arrays ophalen maakt niets uit, zolang je maar de juiste test uitvoert. Verder is het gewoon een keuze.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/08/2013 20:06:29
Quote Anchor link
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.

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 PHP

Chris PHP

12/08/2013 21:30:44
Quote Anchor link
Ger van Steenderen op 12/08/2013 20:06:29:
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.

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/08/2013 21:46:11
Quote Anchor link
Omdat het niet nodig is!!
Wie ow wie kan er iets veranderen aan date('d-m-Y')?
 
Chris PHP

Chris PHP

12/08/2013 21:51:54
Quote Anchor link
Ger,

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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/08/2013 22:16:31
Quote Anchor link
Wat is er variabel dan?
Je maakt een user aan, en dan vraag je de huidige datum/tijd op.
Met een enkel insert statement is die datum weinig variabel.
 
Chris PHP

Chris PHP

15/08/2013 09:14:30
Quote Anchor link
@Ger,

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.