| 1 2 3 4 5 6 7 8 | { echo "boe"; } elseif($_POST['submit'] AND $_POST["code"] AND $_POST["mail"]) { echo "boe"; } |
| 1 2 3 4 5 6 | if( ( isset($_GET['activatie']) && isset($_GET['mail']) ) || ( isset($_POST['submit']) && isset($_POST['code']) && isset($_POST['mail']) ) ) { // w00t } ?> |
Het is niet mysql_connect, maar $con = mysql_connect(), en dan mysql_select_db("db", $con). voor de rest zitten er geen fouten in je codequote:Op maandag 15 september 2008 16:55 schreef Sitethief het volgende:
Ik kon, ooit, in een ver verleden php scriptjes schrijven.
Nu wou ik laatst een simpele php pagina schrijven maar nu lukt het me niet meer.
[ code verwijderd ]
Nee, lol is niet het echte wachtwoord
Ik krijg deze foutmelding:
[ code verwijderd ]
Waarschijnlijk heb ik de verkeerde functies gebruikt om te doen wat ik wil.
isset() is hier overbodigquote:Op zaterdag 27 september 2008 13:54 schreef aardappel het volgende:
Ik heb even snel een grote dummie vraagik heb nu dit:
[ code verwijderd ]
nou wil ik deze bij elkaar voegen, dus in de vorm van: "GETactivatie and GETmail moeten aanwezig zijn" OF "POSTsubmit en POSTcode en POSTmail moeten aanwezig zijn"
nou is het heel makkelijk om dat in een if te zetten, maar ik ben het gewoon kwijt en kan het niet vinden op de phpsite. Wie helpt
| 1 2 | } |
Wat als iemand code 0 invoert, of het e-mailadresveld leeglaat? Zoiets check je in het algemeen later pas, en dan heb je nu wel isset nodig.quote:Op zaterdag 27 september 2008 14:48 schreef illusions het volgende:
[..]
isset() is hier overbodig
[ code verwijderd ]
Als je 0 invoert of leeg laat is de $_POST of $_GET nog steeds true bij isset, aangezien deze nog wel meegegeven worden. Check dan op empty of hetgeen je er denkt te verwachten.quote:Op zaterdag 27 september 2008 14:54 schreef GlowMouse het volgende:
[..]
Wat als iemand code 0 invoert, of het e-mailadresveld leeglaat? Zoiets check je in het algemeen later pas, en dan heb je nu wel isset nodig.
Dat is ook ongeveer wat ik wil, maar ook wil ik middels de plugins bepaalde gegevens kunnen achterhalen van de hoofdmodule en bepaalde acties kunnen triggeren (bv data validatie, data streams aanpassen etc)quote:Op vrijdag 26 september 2008 19:32 schreef GVRuud het volgende:
Heel simpel gezegd heb ik een database waarin een aantal plugin-namen staan opgeslagen (welke geinstalleerd zijn zegmaar). Er bestaat een map/php bestand met diezelfde naam, en bij het inladen van de plugins word dat bestand geincluded. Dezelfde pluginnaam is ook de daadwerkelijke klasse-naam die je dus kunt aanroepen.
Aan het begin van je script zou je dus alle bestanden kunnen includen die in de plugin-tabel staan, maar in mijn eigen CMS wordt dat pas gedaan wanneer dit daadwerkelijk nodig is zodat ik niet teveel onnodige zooi in hoef te laden.
| 1 2 3 4 5 | FROM PRES_HOBBY P1, PRES_HOBBY P2 WHERE (SELECT COUNT(*) FROM PRES_HOBBY WHERE P1.PRES_NAME = PRES_NAME) = (SELECT COUNT(*) FROM PRES_HOBBY WHERE P2.PRES_NAME = PRES_NAME) AND NOT P1.PRES_NAME = P2.PRES_NAME AND (SELECT HOBBY FROM PRES_HOBBY WHERE PRES_NAME = P1.PRES_NAME) =ALL (SELECT HOBBY FROM PRES_HOBBY WHERE PRES_NAME = P2.PRES_NAME) |
Ondanks de argumenten van GlowMouse en mij? Heb je daar een reden voor?quote:Op zondag 28 september 2008 07:36 schreef Likkende_Lassie het volgende:
Ik vind dat hele vereiste van die isset functie maar onzin!
Uiteraard maar in de opdracht (is voor school), staat dat niet naar efficientie/performance wordt gekeken.quote:Op zondag 28 september 2008 11:36 schreef GlowMouse het volgende:
Er staat vaak PRES_NAME zonder tabelaanduiding in je queries. Het is mij onduidelijk op welke tabel dat slaat.
Die laatste where zou ik doen met verzamelingen. De ene MINUS de ander, en de ander MINUS de ene moet leeg zijn. Hier je een MINUS implementeert staat hier uitgelegd.
Ik hoop dat je wel doorhebt dat een query als deze de performance sterk beïnvloedt.
| 1 2 3 4 5 | FROM PRES_HOBBY P1, PRES_HOBBY P2 WHERE (SELECT COUNT(*) FROM PRES_HOBBY P4 WHERE P1.PRES_NAME = P4.PRES_NAME) = (SELECT COUNT(*) FROM PRES_HOBBY P5 WHERE P2.PRES_NAME = P5.PRES_NAME) AND NOT P1.PRES_NAME = P2.PRES_NAME AND (SELECT HOBBY FROM PRES_HOBBY P6 WHERE P6.PRES_NAME = P1.PRES_NAME) =ALL (SELECT HOBBY FROM PRES_HOBBY P7 WHERE P7.PRES_NAME = P2.PRES_NAME) |
Ik heb zelf een soort van basisplugin-klasse gemaakt via welke alle cms-brede onderdelen/gegevens (zoals db toegang, settings ed) toegankelijk zijn. Op het moment dat ik een nieuwe plugin schrijf, wordt deze afgeleid van de basisklasse en heb ik dus standaard alle basisfunctionaliteit beschikbaar zodat ik meteen aan de daadwerkelijke plugin kan beginnen.quote:Op zondag 28 september 2008 10:39 schreef Chandler het volgende:
[..]
Dat is ook ongeveer wat ik wil, maar ook wil ik middels de plugins bepaalde gegevens kunnen achterhalen van de hoofdmodule en bepaalde acties kunnen triggeren (bv data validatie, data streams aanpassen etc)
Ik was ook eens aan het kijken, wat ik hier o.a. lees over plugins, waarin alles in een database gekwakt wordt..quote:Op maandag 29 september 2008 11:19 schreef Chandler het volgende:
Maar heb je ook wat leesvoer m.b.t. een plugin systeem te maken? een opzet vanwaaruit ik iets kan proberen te maken?
| 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 | abstract class BasePlugin { protected $db; public function __construct() { $this->db = DatabaseSingleton::getInstance(); // Etc... } abstract public function execute(); } class BlaatPlugin extends BasePlugin { public function execute() { // Via $this->db kan ik vanalles op de database querien echo "BlaatPlugin wordt uitgevoerd!"; } } class SchaapPlugin extends BasePlugin { public function execute() { // Via $this->db kan ik vanalles op de database querien echo "SchaapPlugin wordt uitgevoerd!"; } } $plugins = array(); $plugins[] = new BlaatPlugin(); $plugins[] = new SchaapPlugin(); foreach( $plugins as &$plugin ) { $plugin->execute(); } ?> |
| 1 2 | SchaapPlugin wordt uitgevoerd! |
| 1 2 3 4 | $plugin = $pluginManager->getPluginInstance("VerifyContent"); $content = $plugin->execute($content); ?> |
| 1 2 3 4 5 6 7 8 | DISTINCT(keyword) as keyword, SUM(clicks) AS clicks, SUM(accounts) AS accounts, SUM(trials) AS trials, SUM(sales) AS sales FROM sales ORDER BY sales ASC;"; |
| 1 |
thanks het werktquote:Op dinsdag 30 september 2008 11:11 schreef DionysuZ het volgende:
SUM() is een group by functie. Als je deze zonder GROUP BY gebruikt krijg je uiteraard 1 resultaat terug
Daar voor heb je de manager.quote:Op dinsdag 30 september 2008 09:18 schreef Chandler het volgende:
Dat snap ik, maar stel ik wil plugins gebruiken op bepaalde plaatsen, bv om content te veriferen, of data uit te lezen, dan is het niet handig om het zo te executen..
Ik heb zelf nog weer een poging gedaan om hier wat over te vinden qua stof om te lezen maar helaas
Dat zou ik idd kunnen doen, denk dat ik wordpress maar eens ga doornemen qua code, deze gebruikt namelijk ook plugins die echt overal in te gebruiken zijnquote:Op dinsdag 30 september 2008 11:00 schreef GVRuud het volgende:
Je zou dan zo iets kunnen doen?
[ code verwijderd ]
In getPluginInstance laad je de betreffende plugin in met een include, en return je een instance van de betreffende class.
Als je dat eens wilt doen, super!quote:Op dinsdag 30 september 2008 12:51 schreef super-muffin het volgende:
Daar voor heb je de manager.Als ik thuis ben zal ik eens een voorbeeld posten.
En probeer zelf ook eens wat uit intussen
Bij het doorgeven van id's vooraf controleren of het daadwerkelijk een getal is, is al een prima oplossing.quote:Op dinsdag 30 september 2008 21:17 schreef Likkende_Lassie het volgende:
elke mysql query voorzien van addslashes() (magic quotes kan dan op off toch), verhelpt dat het gehele mysql injectie probleem? Of zijn er nog meer dingen om rekening mee te houden?
Als je weet dat ergens een getal in moet dan kun met idd met bijvoorbeeld intval() zorgen dat er een getal in gaat. Maar als ergens een string in moet dan heb je mysql_real_escape_string nodig. Als je strings niet controleert maakt het nauwelijks nog uit hoe goed je integers controleert, een ketting maar zo sterk als de zwakste schakel.quote:Op dinsdag 30 september 2008 21:48 schreef NikkelCobalt het volgende:
[..]
Bij het doorgeven van id's vooraf controleren of het daadwerkelijk een getal is, is al een prima oplossing.
Nee, blind addslashes() gebruiken is niet genoeg. Dat helpt alleen bij strings, niet bij numerieke waarden.quote:Op dinsdag 30 september 2008 21:17 schreef Likkende_Lassie het volgende:
elke mysql query voorzien van addslashes() (magic quotes kan dan op off toch), verhelpt dat het gehele mysql injectie probleem? Of zijn er nog meer dingen om rekening mee te houden?
| 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 | PHP function quote_smart($value, $type = false, $NULL = false) { if ($NULL AND (!$value OR $value == '')){ return NULL; }else{ if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return ''; } }else{ if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if(version_compare(phpversion(),"4.3.0") == "-1") { return mysql_escape_string($value); } else { return mysql_real_escape_string($value); } } } } ?> |
| 1 2 3 | mysql_query("INSERT INTO blabla ('name') VALUES ('".quote_smart($_POST['name'])."')"); ?> |
| 1 2 3 | mysql_query("SELECT name FROM blabla WHERE id = '".quote_smart($id, 'num')."' LIMIT 1"); ?> |
Ik zeg ook niet dat je strings niet moet controleren. Als je het verhaal gelezen had wat ik quotte dan stond daar ook in dat hij naar meer aanvullingen zocht bovenop het escapen.quote:Op dinsdag 30 september 2008 21:56 schreef Light het volgende:
[..]
Als je weet dat ergens een getal in moet dan kun met idd met bijvoorbeeld intval() zorgen dat er een getal in gaat. Maar als ergens een string in moet dan heb je mysql_real_escape_string nodig. Als je strings niet controleert maakt het nauwelijks nog uit hoe goed je integers controleert, een ketting maar zo sterk als de zwakste schakel.
| 1 2 3 | function quote_smart($value, $type, $NULL) { ?> |
| 1 2 3 | function quote_smart($value, $type = false, $NULL = false) { ?> |
True. Maar je moet die gegevens er ook een keer instoppen.quote:Op dinsdag 30 september 2008 22:15 schreef NikkelCobalt het volgende:
Overigens zijn mijn ervaringen met databasegestuurde applicaties zijn dat in 90% van de gevallen je gegevens ophaalt (!) aan de hand van een id.
| 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 | PHP function quote_smart($value, $type = false, $NULL = false) { if ($NULL AND (!$value OR $value == '')){ return NULL; }else{ if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return ''; } }else{ if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if(version_compare(phpversion(),"4.3.0") == "-1") { return mysql_escape_string($value); } else { return mysql_real_escape_string($value); } } } } ?> |
| 1 2 3 | mysql_query("INSERT INTO blabla ('name') VALUES ('".quote_smart($_POST['name'])."')"); ?> |
| 1 2 3 | mysql_query("SELECT name FROM blabla WHERE id = '".quote_smart($id, 'num')."' LIMIT 1"); ?> |
Als ik verwacht een numerieke waarde terug te krijgen, verwacht ik geen lege string.quote:Op woensdag 1 oktober 2008 11:25 schreef Chandler het volgende:
Omdat dat de type moet weergeven als in de functie die er boven staat weergegeven
| 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 | PHP function quote_smart($value, $type = false, $NULL = false) { if ($NULL AND (!$value OR $value == '')){ return NULL; }else{ if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return 0; } }else{ if (get_magic_quotes_gpc()) { $value = stripslashes($value); } if(version_compare(phpversion(),"4.3.0") == "-1") { return mysql_escape_string($value); } else { return mysql_real_escape_string($value); } } } } ?> |
| 1 2 3 | mysql_query("INSERT INTO blabla ('name') VALUES ('".quote_smart($_POST['name'])."')"); ?> |
| 1 2 3 | mysql_query("SELECT name FROM blabla WHERE id = '".quote_smart($id, 'num')."' LIMIT 1"); ?> |
quote:Op woensdag 1 oktober 2008 11:10 schreef GlowMouse het volgende:
Waarom zet je in je tweede query een integer tussen quotes?
Het gaat om dit blokje code:quote:Op woensdag 1 oktober 2008 11:25 schreef Chandler het volgende:
Omdat dat de type moet weergeven als in de functie die er boven staat weergegeven :)
| 1 2 3 4 5 6 7 8 | if ($type == 'num'){ if (is_numeric($value)){ return $value; }else{ return ''; } ?> |
| 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 | function quote_smart($value, $type = false, $NULL = false) { $value = trim($value); if (strlen($value)) { # We have something if ($type == 'num'){ if (is_numeric($value)){ return $value; } else { trigger_error(sprintf("%s: '%s' is not a number!", __FUNCTION__, $value), E_USER_ERROR); return null; } } } else { if ($NULL) { return null; } } return $value; } var_dump(quote_smart(0, 'num', true)); # Hier breekt je huidige code blok op var_dump(quote_smart("Bla", 'string', true)); var_dump(quote_smart(" ", 'string')); var_dump(quote_smart("Bla", 'num', true)); # Error ?> |
De functie heet "quote_smart", maar er wordt niets ge-quote. Het is een encoding functie.quote:
| 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 | function secureValue($value, $html){ if (!$html){ $value = strip_tags($value, '<b>,<a>,<i>,<u>,<img>'); }else{ $value = htmlnumericentities($value); } if (!$value){ $value = NULL; } switch (gettype($value)) { case 'boolean': return $value ? '1' : '0'; case 'integer': case 'double': return (string)$value; case 'string': return "'".addslashes($value)."'"; case 'array': case 'object': return "'".addslashes($value)."'"; default: //'resource', 'NULL', 'unknown type' return 'NULL'; die(); } } ?> |
Niet alleen integers zijn numeriek. Ook floats zijn dat, om eens een voorbeeld te noemen.quote:Op woensdag 1 oktober 2008 12:06 schreef slacker_nl het volgende:
Ik zou een trigger_error gebruiken, aangezien er duidelijk wat mis is als je een integer verwacht, maar het er geen is.
Dat het mag en dat het werkt wil niet zeggen dat het good programming practice is en ook niet dat we er geen opmerkingen over mogen maken.quote:En je mag een integer gewoon binnen quotes plaatsen, dus op zich is er niks aan de hand.
Goed punt. Al vraag ik me af of alle hosters PDO ondersteunen.quote:Overigens zou ik PDO gebruiken voor dit soort shit, maar iedereen leest gewoon over SR's post heen. Dan heb je een deel van deze code niet nodig..
Wat doe je dan bij een float?quote:Ik zou je functie zo schrijven..
[ code verwijderd ]
https://devzone.zend.com/(...)revent-SQL-Injection
http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html
In reactie op je nieuwe code, ipv if is_numeric else return 0, dan kan je gelijk intval gebruiken, zie de documentatie hiervan: The integer value of var on success, or 0 on failure.
Dan gebruik je is_int().. of je retouneert intval($value);quote:Op woensdag 1 oktober 2008 17:01 schreef Light het volgende:
Niet alleen integers zijn numeriek. Ook floats zijn dat, om eens een voorbeeld te noemen.
Dit punt vervalt als je PDO gebruikt (en dat gebruik ik alleen maar icm prepared statements). Of ik nou id = '1' of id = 1 invul, zal me verder jeuken.. En je mag er wat van zeggen, maar ik mag toch ook zeggen dat het niet zo hinderlijk is als iemand het doet aangezien het gewoon verwerkt wordt (zonder warning of wat dan ook..).quote:Dat het mag en dat het werkt wil niet zeggen dat het good programming practice is en ook niet dat we er geen opmerkingen over mogen maken.
Andere hoster zoeken die wel met de tijd meegaat.quote:Goed punt. Al vraag ik me af of alle hosters PDO ondersteunen.
Zie hierboven, desnoods breidt is z'n functie uit zodat ie alle verschillende datatypes kan checken..quote:Wat doe je dan bij een float?
| 1 2 | $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12); |
Oe.. dat zou wel flex wezen.. Ben ik ook wel benieuwd naar..quote:Op donderdag 2 oktober 2008 13:05 schreef Chandler het volgende:
Weet iemand een tootlje om 2 databases met elkaar te vergelijken en dan de verschillen in een statement kan zetten die ik kan gebruiken om een database aan te passen?
Ik ben altijd wel huiverig met software waarbij de laatste release datum al erg lang geleden is..quote:Op zaterdag 4 oktober 2008 20:21 schreef spaceninjapirate het volgende:
Ik weet niet of het om de inhoud van de tabel of om de structuur gaat, maar ik heb ver in het verleden deze wel eens gebruikt:
http://www.mysqldiff.org/index.php
quote:Version 1.5.0 (10/01/2004)
http://mirrors.kernel.org/gnu/patch/quote:Op zondag 5 oktober 2008 00:05 schreef ursel het volgende:
[..]
Ik ben altijd wel huiverig met software waarbij de laatste release datum al erg lang geleden is..
[..]
Je kunt je natuurlijk afvragen of het nog wel doet wat het moet doen. MySQL is in de afgeloen vier jaar ook behoorlijk veranderd.quote:Op zondag 5 oktober 2008 00:20 schreef GlowMouse het volgende:
[..]
http://mirrors.kernel.org/gnu/patch/
Als het doet wat het moet doen, is er weinig reden om het versienummer maar te verhogen om maar een nieuwe versie te hebben.
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |