PDO wrapper wil geen values binden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

C# .NET Developer

Dit ga je doen Als developer nieuwe gave features implementeren; Werken met technieken als C# .NET en (REST) API's webservices; Ontwikkelen van koppelingen middels API's; Maken van technische keuzes en beslissingen over de architectuur; Junior collega's coachen; Initiatief nemen voor nieuwe technische mogelijkheden; Je bent een belangrijke schakel - en vindt het leuk - om te schakelen met de business. Hier ga je werken In een klein team van professionals ben je als C# .NET Developer verantwoordelijk voor het ontwikkelen van één van de applicaties voor het grootste inhouse product: een applicatie voor alles omtrent hypotheken. De programmeertaal die je

Bekijk vacature »

Technisch Applicatie ontwikkelaar

Functie omschrijving Ben jij op zoek naar een nieuwe uitdaging en zoek jij een informele werkgever waar je zelfstandig kunt werken binnen een leuk IT team, lees dan snel verder want wie weet zijn wij op zoek naar jou! In deze functie werk jij voornamelijk aan: Het onderhouden en ontwikkelen van de IT systemen; Het opzetten van Azure Cloud systemen, denk aan interfaces, hardware op de Cloud, webportalen of BI functies; Werk je aan scripts binnen verschillende software applicaties, denk aan ERP en CAD; Ontwikkel en implementeren je MS PowerApps en Power BI. Bedrijfsprofiel Je komt terecht bij een familiair

Bekijk vacature »

Medior PHP Developer

Bij Getnoticed doen wij wat we leuk vinden, websites bouwen en online marketing. Voor veel van onze klanten doen we dan ook allebei. Wel zo fijn om campagnes te draaien voor conversiegerichte website die in eigen beheer zijn. In onze vestiging in Nederweert zitten onze development afdelingen en worden de websites gebouwd. Op dit moment zijn we op zoek naar jou: dé PHP/Back-end developer die net als wij, het hoofd boven het maaiveld durft uit te steken! In het kort Even een paar punten die omschrijven wat deze toffe baan inhoudt: Het bedenken van nieuwe functionaliteiten Het verbeteren van het

Bekijk vacature »

Junior .NET developer

Functie Als junior .NET developer begint jouw dag na een bak koffie met een stand up. De vorderingen worden tijdens de stand up besproken en de doelen worden opgesteld waar jullie als team in de volgende sprint naartoe gaan werken. Onze backend is geschreven in .NET Core en onze Front-end in Angular. Bij ons ga jij dan ook Fullstack aan de slag. Jij wordt hier opgeleid om zelfstandig te kunnen programmeren en applicaties te kunnen implementeren. Er wordt op projectbasis gewerkt, dit bied leuke uitdagingen omdat elke klant een andere visie heeft over de applicatie die wij maken. Je gaat

Bekijk vacature »

Front-end Developer (HTML/CSS, Angular/React/Vue,

Functie Je zal aan de slag gaan in een klein, hecht team met front-end development experts die de ambitie delen mooi werk te leveren. Samen met hen zal je werken aan het gebruiksvriendelijk en interactief maken van complexe webapplicaties, websites en mobile apps. Je levert klanten wat ze nodig hebben terwijl je actief aan jezelf blijft werken met de ondersteuning vanuit je werkplek. Talen als Javascript programmeer jij vloeiend en je hebt kennis van frameworks als React en Angular. Je zou je het liefst nog veel meer ontwikkelen in verschillende front-end talen. Deze kennis deel je graag met je collega’s,

Bekijk vacature »

C++ Ontwikkelaar

Functieomschrijving Ben jij als software ontwikkelaar toe aan een nieuwe uitdaging? Dan zoeken wij jou! Voor het maken van de procesbesturingssoftware gebruiken onze projectteams een in C++ en C# geschreven tool. Dit is een gedistribueerd object framework wat alle kernfuncties biedt voor een procesautomatisering. Verder zullen jouw werkzaamheden o.a. bestaan uit: Ontwerpen, programmeren en testen van product aanpassingen; Analyseren van vragen en wensen van gebruikers en deze vertalen naar een functioneel ontwerp; Inzichtelijk maken van voortgang omtrent softwarewerkzaamheden, o.a. door middel van SCRUM; Continu toetsen van het effect van nieuwe releases op andere tools en processen; Implementeren van nieuwe product

Bekijk vacature »

Full Stack .NET Developer

Dit ga je doen Als developer nieuwe gave features ontwikkelen; Werken met technieken als C#, Angular 12 en Javascript,; Maken van technische keuzes en beslissingen over de architectuur; Junior collega's coachen; Initiatief nemen voor nieuwe technische mogelijkheden; Je bent een belangrijke schakel - en vindt het leuk - om te schakelen met de business. Hier ga je werken In een team van 7 professionals ben je als Full Stack .NET Developer verantwoordelijk voor het ontwikkelen van applicaties voor het grootste inhouse product: een applicatie voor alles omtrent hypotheken. De programmeertaal die je hierbij beheerst is C#. Wil je van meerwaarde

Bekijk vacature »

PHP Developer - Draag bij aan de maatschappij!

Bedrijfsomschrijving Wil jij als applicatieontwikkelaar deel uitmaken van een gedreven ontwikkelteam en werken aan innovatieve producten? Dan hebben wij dé uitdaging voor jou! Wij zijn op zoek naar een enthousiaste collega die samen met ons de technische ondergrond van onze producten verder wil ontwikkelen met behulp van PHP. Met jouw expertise geef je de finishing touch aan onze producten om jezelf steeds opnieuw weer te verrassen. Functieomschrijving Bij ons staan innovatie en creativiteit centraal. Wij zijn op zoek naar een enthousiaste PHP ontwikkelaar die nieuwe ideeën en inzichten kan inbrengen en daarmee zichzelf en het team verder kan laten groeien.

Bekijk vacature »

.NET developer

Functie Als .NET ontwikkelaar start jij in een multidisciplinair team met 7 ontwikkelaars. Dit team is verdeeld onder Front-end ontwikkelaars en backend developers. De backend developers werken voornamelijk aan desktop applicaties in combinatie met backend systemen. Hier ga jij dus ook mee aan de slag! Hierbij wordt voornamelijk gebruik gemaakt van C# .NET, WPF, UWP, XAML en MVVM. WPF, UWP, .NET Core, Azure Devops en Entity Framework. WPF en UWP worden dan ook voornamelijk gebruikt voor de user interface van de desktop applicatie. Het development team is dan ook erg gedreven m.b.t. het ontwikkelen van vooruitstrevende en innovatieve horeca automatiseringsoplossingen.

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Ambitieuze Junior/Medior Low-code Developers gezoc

Bedrijfsomschrijving Transformeer bedrijven met jouw expertise in innovatieve technologie Ben je een bedreven softwareontwikkelaar met ervaring in Low-code platformen, of sta je te popelen om je in deze baanbrekende oplossing te verdiepen? Wij zijn op zoek naar jou! Ons klantenbestand groeit en we willen ons team uitbreiden met deskundige en leergierige Low-code specialisten. Is het jouw passie om organisaties te ondersteunen in hun digitale transformatie en maatwerkoplossingen te bieden met behulp van geavanceerde software? Wij zijn een vooruitstrevend bedrijf dat dagelijks werkt aan het oplossen van complexe vraagstukken om de digitale ambities van onze klanten te realiseren. Functieomschrijving Ontwikkel op

Bekijk vacature »

Low Code Ontwikkelaar

In het kort Als Low Code Developer werk je aan projecten bij en voor onze klanten, waarbij je voor het ontwikkelen van de oplossingen een technisch low-code platform gebruikt. Samen met het team streef je naar de beste oplossing en bepalen jullie de juiste aanpak. Je rol is divers en je bent van begin tot eind betrokken bij de ontwikkeling zowel de back-end en de front-end van de applicatie. Naast de ontwikkeling en oplevering, breng je ook advies uit aan de klant waarom bepaalde keuzes worden gemaakt. Je bent dan ook communicatief sterk en kunt je keuzes goed (inhoudelijk) onderbouwen.

Bekijk vacature »

Full stack ontwikkelaar Laravel, Vue.js

Functie Als ontwikkelaar binnen deze organisatie hou jij je voornamelijk met lopende projecten voor de verschillende klanten. Zo bouw je de ene dag aan prijsschifting systemen en de andere dag onderzoek je crawlers en stel je ze zo in dat de data goed binnen komt binnen het systeem. Daarnaast bouw je mee aan dashboards en ben je dus constant bezig met het verbeteren van het platform. Er is een vaste werkwijze, zo werken ze met Trello kaarten en onderverdelen ze deze aan het begin van iedere week onder de developers. Dit wordt door de lead developer gedaan, maar in samenspraak

Bekijk vacature »

Software Developer / .NET / Azure

Dit ga je doen Als Lead .NET Software Developer zal je je bezig houden met: Het vertalen van bedrijfswensen naar een technische roadmap; Uitwerken van nieuwe architectuur / designs; Het team aansturen en motiveren; Toezien op de kwaliteit van de code; Mee ontwikkelen van nieuwe features en applicaties. Hier ga je werken Deze organisatie is op dit momenteel marktleider in het ontwikkelen van productielijnen voor de voedselindustrie en heeft een wereldwijd klantnetwerk. Binnen deze organisatie is het team van software developers dagelijks bezig met het ontwikkelen van maatwerk oplossingen om alle productiemachines aan te sturen, maar ook bedrijf kritische applicaties

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »
Johan K

Johan K

27/05/2015 09:06:58
Quote Anchor link
Ik ben nu al een paar uurtjes bezig om iets werkend te krijgen maar ik waarschijnlijk is het zo iets knulligs dat ik het zelf niet zie en hoop dat iemand dat even aan kan wijzen.

Waarom een wrapper over PDO heen is omdat ik:
- van korte inline codes hou.
- beter compatibility met andere drivers.
- .. de PDO constants echt bagger vind.

Waar het fout gaat is in de function Database->execute(...).
De type variable word herkend in de switch case, dan moet er een waarde aan de statement gekoppeld worden en dat gebeurd dus niet.

Het ergste van deze situatie is dat "tableExists" werkte toen dat ik de execute method strakker ging maken.

Zelf denk ik dat het te maken heeft dat execute() eerder word aangeroepen dan prepare, alleen als ik elke functie een nummer echo in de volgorde dat ze uitgevoerd moeten worden klopt het wel.

SQL LOG:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
150527  9:02:51     1376 Connect    root@localhost on mydb
         1376 Query    SET GLOBAL general_log_file = "/var/log/mysql.log"
/usr/sbin/mysqld, Version: 5.5.43-0ubuntu0.14.10.1 ((Ubuntu)). started with:
Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
         1376 Query    SET GLOBAL general_log = 'ON'
         1376 Prepare    SHOW TABLES LIKE ':table'
         1376 Execute    SHOW TABLES LIKE ':table'     <<--- ':table' zou veranderd moeten zijn in 'settings'
         1376 Close stmt    
         1376 Quit    


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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php

  class DatabaseException extends Exception{}
  
  abstract class Database extends PDO{
    private $sth;
    
    abstract function sqlTableExists();
    abstract function sqlSelectDatabase();  
    
    private function getDSN($driver, $multiarg){
      return "$driver:" . implode(';', array_map(function($v, $k){return "$k=$v";}, $multiarg, array_keys($multiarg)));
    }

    
    public function prepare($stmt, $options = array()){
      $this->sth = parent::prepare($stmt, $options);
      return $this;
    }

    public function query($stmt){
      return $this->sth = parent::query($stmt);  
    }

    public function execute($stmt = null){
      try{
        if(is_array($stmt)){
          foreach($stmt as $k => $v){
            if(gettype($k) == 'string'){
              $k = ($k[0] != ':') ? ":$k" : $k;

              switch(gettype($v)){
                 case
'string':
                   // hier gaat het fout.. als het goed is.
                   // $k = :table
                   // $v = settings

                   $this->sth->bindValue($k, $v, PDO::PARAM_STR);
                   break;
                 case
'integer':
                   $this->sth->bindValue($k, $v, PDO::PARAM_INT);
                   break;
                 case
'boolean':
                   $this->sth->bindValue($k, $v, PDO::PARAM_BOOL);            
                 case
'NULL':
                   $this->sth->bindValue($k, $v, PDO::PARAM_NULL);
                   break;
                 case
'resource':
                   $this->sth->bindValue($k, $v, PDO::PARAM_LOB);
                   break;
                 case
'double':
                   $this->sth->bindValue($k, (string)$v, PDO::PARAM_STR);
                   break;
                 default:

                   throw new DatabaseException('Unsupported variable type parsed in query.');
                   break;    
              }
            }
else {
              throw new DatabaseException('Only named parameters are allowed.');  
            }
          }
        }

        
        try{
          $this->sth->execute();
          
          return $this->sth;
        }
catch(PDOException $e){
          throw $e;
        }
      }
catch(DatabaseException $e){
        throw $e;
      }
    }


    public function fetchAssoc(){
      return $this->sth->fetch(PDO::FETCH_ASSOC);
    }

    public function fetchBoth(){
      return $this->sth->fetch(PDO::FETCH_BOTH);
    }

    public function fetchNum(){
      return $this->sth->fetch(PDO::FETCH_NUM);
    }

    public function fetchObj(){
      return $this->sth->fetch(PDO::FETCH_OBJ);
    }

    public function fetchLazy(){
      return $this->sth->fetch(PDO::FETCH_LAZY);
    }

      
    public function tableExists($table){  
      // deze functie word aangeroepen.
      return $this->prepare($this->sqlTableExists())->execute(array('table'=>$table))->rowCount()>0;
    }

    
    public function selectDatabase($db){
      return $this->prepare($this->sqlSelectDatabase())->execute(array('db'=>$table));
    }  
        
    function
__construct($username, $password, $dsn, $options){
      if(in_array(($driver = strtolower(get_class($this))), parent::getAvailableDrivers())){
        $dsn = gettype($dsn) == 'array' ? $this->getDSN($driver, $dsn) : (string) $dsn;
        
        try{
          parent::__construct($dsn, $username, $password, $options);
          
          $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }
catch(PDOException $e){
          throw new DatabaseException('Could not connect to the database server.', $e);
        }
      }
else {
        throw new DatabaseException("Database driver '$this->type' is not supported on this machine.'");
      }
    }
  }

  
  class MySQL extends Database{
    function
sqlTableExists(){
      return "SHOW TABLES LIKE ':table'";
    }
    function
sqlSelectDatabase(){
      return "USE :db";
    }    
    
    function
__construct($username, $password, $dsn, $options = array()) {
      parent::__construct($username, $password, $dsn, $options);
    }
  }

  
  class PostgrSQL extends Database{
    function
sqlTableExists(){
      return "select count(*) from pg_class where relname=':table' and relkind='r'";
    }
    function
sqlSelectDatabase(){
      throw new DatabaseException('PostgrSQL does not support database swapping, create a new link or select from db.table.');
    }      
    
    function
__construct($username, $password, $dsn, $options = array()) {
      parent::__construct($username, $password, $dsn, $options);
    }
  }


?>


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
<?php
  try{
    $db     = new MySQL('usr', 'pw', array('host' => 'localhost', 'port' => 3306, 'dbname' => 'mydb'));
    
    $db->exec('SET GLOBAL general_log_file = "/var/log/mysql.log";');
    $db->exec("SET GLOBAL general_log = 'ON';");
    
    echo $db->tableExists("settings") ? 'yes' : 'no'; // no, terwijl 100% de tabel bestaat.
      
  } catch(PDOException $e){
    echo $e->getMessage();
  }
catch(DatabaseException $e){
    echo $e->getMessage();
  }

?>


Iemand een idee? Geen foutmeldingen, niets. Volgens de code bestaat de tabel settings niet.
Gewijzigd op 27/05/2015 09:43:12 door Johan K
 
PHP hulp

PHP hulp

27/05/2026 09:45:04
 
Ivo P

Ivo P

27/05/2015 09:56:17
Quote Anchor link
Toevballig geen verschil in gebruik van Hoofdletters? "Settings" vs "settings"?
 
Johan K

Johan K

27/05/2015 10:07:14
Quote Anchor link
Ivo P op 27/05/2015 09:56:17:
Toevballig geen verschil in gebruik van Hoofdletters? "Settings" vs "settings"?

Net even een dubbel check gedaan, maar nee. Alles lowercase dus prima.
Maar buiten dat om, in de SQL log is te zien dat hij kijkt of de tabel ":table" bestaat, niet "settings".
 
Johan K

Johan K

29/05/2015 19:42:28
Quote Anchor link
Uuhm, bump?
 
Thomas van den Heuvel

Thomas van den Heuvel

29/05/2015 23:24:10
Quote Anchor link
Was niet het hele idee van prepared statements dat je je ook geen zorgen hoeft te maken om quotes, oftewel, haal de quotes om ':table' (regel 117) eens weg :).

Tevens (security): zie deze comment.

Ook: met PDO::ATTR_EMULATE_PREPARES false voer je vaak meer queries uit dan noodzakelijk (per SELECT query worden 2 queries uitgevoerd, 1 voor prepare, 1 voor execute - voor dat gebruik is het uitzetten van emulated prepares misschien minder efficient).
 
Johan K

Johan K

30/05/2015 18:19:40
Quote Anchor link
Thomas van den Heuvel op 29/05/2015 23:24:10:
Was niet het hele idee van prepared statements dat je je ook geen zorgen hoeft te maken om quotes, oftewel, haal de quotes om ':table' (regel 117) eens weg :).

Ook: met PDO::ATTR_EMULATE_PREPARES false voer je vaak meer queries uit dan noodzakelijk (per SELECT query worden 2 queries uitgevoerd, 1 voor prepare, 1 voor execute - voor dat gebruik is het uitzetten van emulated prepares misschien minder efficient).


Ik had de quotes weg gehaald en toen kwam ik er achter wat echt het probleem was.
Als de emulatie op 'false' staat voerde hij een prepared query in MySQL uit en dat gaf een syntax error in de SQL op.

Dus je kan binden wat je wil, maar niets word uitgevoerd in de PHP code aangezien dat met SQL query's moet gebeuren.

Aangezien dit een wrapper is om met 1 API meerdere databases te gebruiken hem ik die flag toch maar even op true gezet want anders heb dit totaal geen nut.

Ik heb het probleem opgelost, met dank aan jouw suggestie.

Thomas van den Heuvel op 29/05/2015 23:24:10:
Tevens (security): zie deze comment
Je maakte me eerst even bang, maar uiteindelijk is er niets om je er over druk te maken. Niet alles wat iedereen zegt op php.net gezegd is (of waar dan ook) hoeft waar te zijn.

Zojuist eventjes de SQL logs erbij gepakt om het te testen en beiden methoden doen niets met "%" & "_".

Waarom? Omdat er geen mogelijk is om te kijken hoe deze gebruikt moeten worden in jouw syntax. Het is dus aan de gebruiker van PDO om deze waarde te escapen naar html entities of te escapen met een backslash voordat hij word opgenomen in de prepared statement.

Persoonlijk heb ik nog nooit met LIKE gewerkt, maar ik heb wel eventjes wat meer informatie opgezocht op het internet. Het is niet echt een security risk als je LIKE op een goede manier behandeld. Het enigste wat het kan doen is de gebruiker meer flexibiliteit geven om dingen te zoeken.

Dus, je kan het beter in je voordeel gebruiken en geen gekke SQL queries uitvoeren zoals:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
  SELECT * FROM :table WHERE :column LIKE :value

Want als je dat doet, ben je echt een eerste klas pannenkoek.
Gewijzigd op 31/05/2015 03:53:01 door Johan K
 



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.