Wat werkt er precies niet?quote:Op donderdag 9 januari 2014 13:29 schreef n8n het volgende:
Ik heb een class::functie() die een return geeft van een array of null. Nu werkt het alleen niet als ik if (empty(class::functie()) doe. Waarom is dat?
Zowel null als een lege array zijn empty. Kun je wat meer info geven?quote:Op donderdag 9 januari 2014 13:29 schreef n8n het volgende:
Ik heb een class::functie() die een return geeft van een array of null. Nu werkt het alleen niet als ik if (empty(class::functie()) doe. Waarom is dat?
quote:
helaasquote:Op donderdag 9 januari 2014 14:30 schreef ViPeRII het volgende:
quote van php.net
Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)). Instead, use trim($name) == false.
Ik doe een email query dmv een functie, als deze niet gevonden wordt return ik een null. ik maak nu een variabele van de functie die ik later gebruik. Was achteraf sowieso handiger omdat ik anders bij meerdere if statements de functie (en dus query) moet laten lopen en dat leek me onnodige overhead geven.quote:Op donderdag 9 januari 2014 14:07 schreef zoem het volgende:
[..]
Zowel null als een lege array zijn empty. Kun je wat meer info geven?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php // check email input if (empty($email)) { $error['email'] = 'empty'; } elseif (filter_var($email, FILTER_VALIDATE_EMAIL) == false) { $error['email'] = 'invalid'; } elseif (isset(user::check($email)) && (isset($register))) { $error['email'] = 'taken'; } elseif (empty(user::check($email)) && (isset($login))) { $error['email'] = 'absent'; } ?> |
| 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 | <?php // check email input if (empty($email)) { $error['email'] = 'empty'; } elseif (filter_var($email, FILTER_VALIDATE_EMAIL) == false) { $error['email'] = 'invalid'; } else { // check if email input exists $user = user::check($email); if (isset($user['email']) && (isset($register))) { // registration: email already exists in database $error['email'] = 'taken'; } elseif (empty($user['email']) && (isset($login))) { // login: email address not in database $error['email'] = 'absent'; } } ?> |
| 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 | <?php class user { static function check($email) { global $connect; $query = $connect->prepare("select id, email, userkey, password from user where email = :email"); $query->bindParam(':email', $email, PDO::PARAM_STR); $query->execute(); $user = $query->fetch(); if (empty($user)) { return null; } else { return $user; } } } ?> |
| 1 2 3 4 | $query = $connect->prepare("select id, email, userkey, password from user where email = :email"); $query->bindParam(':email', $email, PDO::PARAM_STR); $query->execute(); $user = $query->fetch(); |
| 1 2 3 4 5 6 7 8 | user::getUserByEmailAdress(email) implementatie: checkEmailAdress(email) true: getUserbyEmailAdress(email) false: null |
| 1 2 3 4 5 6 7 8 9 | function assert_valid_email($meuk) { # $VALID_EMAIL_REGEXP is dan gewoon een constante, maar ik weet niet hoe dat eruit ziet in php if (preg_match($VALID_EMAIL_REGEXP, $meuk)) { return 1; } else { throw Exception("Invalid e-mail"); } } |
Je kan een exceptie afvangen. Een invalide e-mailadres moet niet opgegeven zijn door je front-end en dient dus te klappen. De frontend kan ook wat met je Exception doen en klaar. Plus het test makkelijk.quote:Op vrijdag 10 januari 2014 22:23 schreef zoem het volgende:
Het heeft inderdaad wel zo zijn voordelen, omdat je minder logic hoef te schrijven in het daadwerkelijke proces. Echter betwijfel ik of het gebruik van exceptions in elke validatie/conditionele case wel the way to go is. Ik zet ze zelf pas in bij de wat kritischere functies of externe aanroepen/services. Een vrij basale true/false case lijkt het me wel wat overkill.
| 1 2 3 4 5 | sub get_user_by_email { my $args = check({email => {allow => VALID_EMAIL_REGEXP, required => 1},},{@_}); $db->resultset('User')->search({%$args})->single(); } |
Eens.quote:Op vrijdag 10 januari 2014 22:26 schreef slacker_nl het volgende:
[..]
Je kan een exceptie afvangen. Een invalide e-mailadres moet niet opgegeven zijn door je front-end en dient dus te klappen. De frontend kan ook wat met je Exception doen en klaar. Plus het test makkelijk.
Als fout: dan klappen, als goed, dan doorgaan.
Tuurlijk kan je ook een boolean value checken, maar als je get_user_by_email($email) doet en je mailadres is fout dan ga je geen null returnen omdat je mogelijk geen users vind en dan is een exception echt wel een betere oplossing. Daarom is het ook een assert_
Bij het gebruik van asserts ben ik het volledig met je eens. Je beweert (assert) dan dat iets waar is. Zo niet: bam, exception!quote:Op vrijdag 10 januari 2014 22:26 schreef slacker_nl het volgende:
[..]
Je kan een exceptie afvangen. Een invalide e-mailadres moet niet opgegeven zijn door je front-end en dient dus te klappen. De frontend kan ook wat met je Exception doen en klaar. Plus het test makkelijk.
Als fout: dan klappen, als goed, dan doorgaan.
Tuurlijk kan je ook een boolean value checken, maar als je get_user_by_email($email) doet en je mailadres is fout dan ga je geen null returnen omdat je mogelijk geen users vind en dan is een exception echt wel een betere oplossing. Daarom is het ook een assert_
In sommige gevallen is het wel degelijk een Exception als je naar iets zoekt en je vind er geen of meer dan een. Je database kan dan vervuild zijn en wat moet je dan geloven? In dit geval zouden er nul of een resultaten moeten zijn, je kan niet meerdere users met hetzelfde adres hebben. Vind je meer dan twee users dan moet je m.i. een exceptie rond gaan gooien.quote:Op vrijdag 10 januari 2014 22:53 schreef zoem het volgende:
Bij het gebruik van asserts ben ik het volledig met je eens. Je beweert (assert) dan dat iets waar is. Zo niet: bam, exception!
Maar stel: een admin zoekt naar een user op e-mailadres, dan heb je geen zekerheid dat het adres bestaat. In zo'n geval zou ik eerder een false/null/leeg iets verwachten ipv een exception. Het zit hem ook in de naam: een exception gaat om een uitzonderingsgeval of een onverwachte situatie. Zolang het proces binnen het verwachtingskader verloopt verwacht je geen exception. En in mijn voorbeeld kśn je verwachten dat er geen user matcht op het ingegeven e-mailadres.
Uiteindelijk maakt het niet uit tot welk niveau je exceptions inzet, zolang je maar consequent bent want dat is veel waardevoller
| 1 2 3 4 5 | getuser_by_email { assert_valid_email($email); my @res = $db->search('User', email => $email); throw("Multiple users found where one or less expected") if @res > 1; } |
omdat ik de informatie wil gebruiken om het wachtwoord te validerenquote:Op vrijdag 10 januari 2014 17:26 schreef Chandler het volgende:
waarom NULL? waarom niet gewoon false? if (($value == class::function()) != false) { // do dit } oid..
hoop dat ik het goed geschreven heb, want met deze syntax zit ik nog wel eens fout...
-edit-
dit gaat ook nergens over, waarom niet gewoon functies gebruiken die specifiek geschreven zijn om te kijken of er een resultaat is?
[ code verwijderd ]
http://nl1.php.net/manual/en/pdostatement.rowcount.php
in principe kan het toch niet voorkomen, sowieso is elk email adres in de tabel uniek.quote:Op zaterdag 11 januari 2014 14:19 schreef xzaz het volgende:
Ik gooi altijd dat Exceptions in situaties die eigenlijk niet mogen voorkomen.
Dat er een gebruiker niet kan worden gevonden op een e-mail adres is prima. Dat kan voorkomen, bijvoorbeeld bij een check als de gebruiker al eens in aangemeld. De hoeveelheid e-mail adressen mogen niet meerdere keren voorkomen omdat dit als PK / ID wordt gezien. In het geval dat er 2 gebruikers worden geretourneerd door de methode getUserByEmail() is er iets mis met 1) de DB (itegriteit) en 2) de Code. In dat geval zal ik echt, boem een Exception gooien. Hence de naam 'Exception'.
Assumption is the mother of all fuckups. Juist dat 'in principe' is waarom je een exception gooit.quote:Op zaterdag 11 januari 2014 19:21 schreef n8n het volgende:
[..]
in principe kan het toch niet voorkomen, sowieso is elk email adres in de tabel uniek.
duidelijk, als ik eigenwijs klink is dat omdat ik het nog onduidelijk heb. Schrijf je die exception dan in de functie if als else statement na de if?quote:Op zaterdag 11 januari 2014 19:43 schreef xzaz het volgende:
[..]
Assumption is the mother of all fuckups. Juist dat 'in principe' is waarom je een exception gooit.
nee probeer eerst standaard php te leren. Over een week stage, daar werken ze met lavarel oid. Vandaag proberen homebrew aan te praat te krijgen ipv mamp en heb volgens mij m'n apache config file verneuktquote:Op zondag 12 januari 2014 16:41 schreef KomtTijd... het volgende:
Iedere class in een file is vrij gebruikelijk, zelf includen niet. Gebruik je een framework? Meeste frameworks hebben dat geautoriseerd.
Nice, over sql gesproken, deze kerel is echt een baas: http://code.openark.org/blog/mysql/sql-pie-chartquote:Op maandag 13 januari 2014 10:33 schreef Aether het volgende:
Vond dit wel een aardige verzameling, misschien heeft iemand er nog iets aan:
Artful Common MySQL Queries.
Wat een monsterqueryquote:Op maandag 13 januari 2014 10:44 schreef raptorix het volgende:
[..]
Nice, over sql gesproken, deze kerel is echt een baas: http://code.openark.org/blog/mysql/sql-pie-chart
Ik heb keer een stored procedure van iets van 600 regels geschrevenquote:
599 Regels commentaar?quote:Op maandag 13 januari 2014 13:13 schreef raptorix het volgende:
[..]
Ik heb keer een stored procedure van iets van 600 regels geschreven
Was iets met een grote huizensite zeg maar
Nee was de searchquery maar daarin ook nog eens het hele paging en parameter mechanisme, pfffff hoofdpijn van dat ding.quote:
https://github.com/Shandem/Examine ?quote:Op maandag 13 januari 2014 13:17 schreef raptorix het volgende:
[..]
Nee was de searchquery maar daarin ook nog eens het hele paging en parameter mechanisme, pfffff hoofdpijn van dat ding.
We spreken hier over 2001, toen waren dat soort technieken nog niet zo gebruikelijk, wat we wel deden was de database readonly maken, dat scheelt ongeveer 40 procent. Tegenwoordig gebruik je voor dit soort zaken gewoon een noSql server of anders wel een ORM mapper.quote:
Ah, dat plaatst het wat in de context, als je een sp van 600 regels maakt moet er toch een lampje gaan branden. The horror!quote:Op maandag 13 januari 2014 13:20 schreef raptorix het volgende:
[..]
We spreken hier over 2001, toen waren dat soort technieken nog niet zo gebruikelijk, wat we wel deden was de database readonly maken, dat scheelt ongeveer 40 procent. Tegenwoordig gebruik je voor dit soort zaken gewoon een noSql server of anders wel een ORM mapper.
| 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 | <?php // fictieve $_POST array $post = array('email' => 'hoi', 'password' => 'test'); function get_variables($data) { $key = 0; do { $keys = array_keys($data); $var = (array_keys($data)[$key]); global $$var; if (!empty($data[$var])) { $$var = $data[$var]; } else { $$var = null; } $key++; } while (array_key_exists($key, $keys)); } // hier wil ik $_POST gaan gebruiken get_variables($post); // variabelen komen uit de functie echo "$email<br>$password"; ?> |
Global vind ik zelf niet zo netjes. Ik zou het via een class (service) doen.quote:Op maandag 13 januari 2014 18:59 schreef n8n het volgende:
Ben ik weer. Om in een functie specifieke $_POST input te krijgen moest ik of telkens voluit $_POST['name'] schrijven, er een variabele van maken of variabelen global aanroepen. Heb nu een functie die je overal kan aanroepen die de $_POST data omzet in losse variabelen die je lokaal kan gebruiken.
[ code verwijderd ]
het maakt van elke key in een array een variable met de naam en waarde van de key. dus $_POST[email] wordt omgezet naar $email = 'waarde van email'. Als een waarde leeg is heeft de variabele een null waarde.
Op of aanmerkingen? Kom net kijken dus heb vaak het idee dat ik metideeėn kom
global is toch nodig om de variabele überhaupt te kunnen definiėren buiten de scope van de function (of class)?quote:Op maandag 13 januari 2014 19:01 schreef bondage het volgende:
[..]
Global vind ik zelf niet zo netjes. Ik zou het via een class (service) doen.
Bij een class heb je global niet nodig. Als je het object eenmaal hebt aangemaakt kun je dat meegeven aan je functies. Ook kun je op jouw manier variabelen per ongeluk overschrijven als je dezelfde namen ergens anders gebruikt.quote:Op maandag 13 januari 2014 19:02 schreef n8n het volgende:
[..]
global is toch nodig om de variabele überhaupt te kunnen definiėren buiten de scope van de function (of class)?
dus variabelen die je binnen je class (maar buiten een functie aanmaakt) kan je binnen die class in elke functie gebruiken? Ga dat even proberen. Zou wel mooi zijn met het oog op overschrijven van bestaande waarden.quote:Op maandag 13 januari 2014 19:05 schreef bondage het volgende:
[..]
Bij een class heb je global niet nodig. Als je het object eenmaal hebt aangemaakt kun je dat meegeven aan je functies. Ook kun je op jouw manier variabelen per ongeluk overschrijven als je dezelfde namen ergens anders gebruikt.
Dit is niet echt een goede oplossing. Veel te onveilig, je kunt zelf post variabelen toevoegen en die worden dan als variabele gebruikt. Dit is een paar jaar geleden een grote overstap geweest voor mensen. register_globals stond vaak aan en gaf superveel beveiligingslekken. Je hebt nu een zelfde soort functie geschreven.quote:Op maandag 13 januari 2014 18:59 schreef n8n het volgende:
Ben ik weer. Om in een functie specifieke $_POST input te krijgen moest ik of telkens voluit $_POST['name'] schrijven, er een variabele van maken of variabelen global aanroepen. Heb nu een functie die je overal kan aanroepen die de $_POST data omzet in losse variabelen die je lokaal kan gebruiken.
[ code verwijderd ]
het maakt van elke key in een array een variable met de naam en waarde van de key. dus $_POST[email] wordt omgezet naar $email = 'waarde van email'. Als een waarde leeg is heeft de variabele een null waarde.
Op of aanmerkingen? Kom net kijken dus heb vaak het idee dat ik metideeėn kom
niet eens aan gedachtquote:Op maandag 13 januari 2014 19:08 schreef totalvamp het volgende:
[..]
Dit is niet echt een goede oplossing. Veel te onveilig, je kunt zelf post variabelen toevoegen en die worden dan als variabele gebruikt. Dit is een paar jaar geleden een grote overstap geweest voor mensen. register_globals stond vaak aan en gaf superveel beveiligingslekken. Je hebt nu een zelfde soort functie geschreven.
Alles wat je in een class buiten de functie zet is beschikbaar binnen de functies die in die class staan.quote:Op maandag 13 januari 2014 19:08 schreef n8n het volgende:
[..]
dus variabelen die je binnen je class (maar buiten een functie aanmaakt) kan je binnen die class in elke functie gebruiken? Ga dat even proberen. Zou wel mooi zijn met het oog op overschrijven van bestaande waarden.
ah in 1 keer snap ik $this, heb ik meteen m'n prefix te pakkenquote:Op maandag 13 januari 2014 19:13 schreef bondage het volgende:
[..]
Alles wat je in een class buiten de functie zet is beschikbaar binnen de functies die in die class staan.
Voorbeeld:
private $variable_1 = 'test';
private $variable_2 = 'test2';
public function testFunctie() {
echo $this->$variable_1 . '<br /> . $this->$variable_2';
}
$this is de referentie naar de class waar je momenteel in zit (of inherit).quote:Op maandag 13 januari 2014 19:14 schreef n8n het volgende:
[..]
ah in 1 keer snap ik $this, heb ik meteen m'n prefix te pakken
Zie editquote:Op maandag 13 januari 2014 19:14 schreef n8n het volgende:
[..]
ah in 1 keer snap ik $this, heb ik meteen m'n prefix te pakken
ze maken het wel makkelijkquote:Op maandag 13 januari 2014 19:15 schreef totalvamp het volgende:
[..]
$this is de referentie naar de class waar je momenteel in zit (of inherit).
Voor statische vars is dit self::
ja precies, nu weer uitdokteren hoe ik m'n idee alsnog werkend krijg want het is niet echt DRY als ik overal globals moet definiėren.quote:Op maandag 13 januari 2014 19:15 schreef bondage het volgende:
[..]
Zie edit![]()
$this->variable_1 (dollarteken hoort niet voor de var)
Zoiets zou je mee kunnen beginnen:quote:Op maandag 13 januari 2014 19:17 schreef n8n het volgende:
[..]
ja precies, nu weer uitdokteren hoe ik m'n idee alsnog werkend krijg want het is niet echt DRY als ik overal globals moet definiėren.
| 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 | <?php class cRequest { private $request_vars; public function __construct() { $this->request_vars = $_REQUEST; } public function setRequestVar($v_key, $v_val) { $this->request_vars[$v_key] = $v_val; } public function getRequestVar($key, $ret_nonexisting = '') { if(isset($this->request_vars[$key])) { return $this->request_vars[$key]; } return $ret_nonexisting; } public function getRequestArray() { return $this->request_vars; } } ?> <?php $obj_request = new cRequest(); // print de var, als deze niet bestaat dan krijg je 'ik_was_undefined' terug. echo $obj_request->getRequestVar('bla', 'ik_was_undefined'); ?> |
| 1 2 3 4 5 6 7 | <?php echo testFunction($obj_request); function testFunction($request_object) { return $request_object->getRequestVar('bla', 'ik_was_undefined'); } ?> |
Dit is niet de beste oplossing, je classe is een beetje ouderwets en je kunt dan beter gebruik maken van de magic get en set methoden. Dat scheelt ook gelijk in wat je moet typen.quote:Op maandag 13 januari 2014 19:28 schreef bondage het volgende:
[..]
Zoiets zou je mee kunnen beginnen:
[ code verwijderd ]
| 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 | <?php class cRequest { private $request_vars; public function __construct() { $this->request_vars = $_REQUEST; } public function __set($v_key, $v_val) { $this->request_vars[$v_key] = $v_val; } public function __get($key) { if(isset($this->request_vars[$key])) { return $this->request_vars[$key]; } return false; } public function getRequestArray() { return $this->request_vars; } } ?> <?php $obj_request = new cRequest(); // krijg een var of false echo $obj_request->bla; ?> |
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |