PDO wrapper wil geen values binden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Front end developer

Functie Binnen de functie van Front-end developer werk je mee aan uitdagende klantprojecten. In teamverband werk je aan de voorkant van onze state-of-the-art portaal oplossingen en apps. Dit alles gebeurt in een multidisciplinaire omgeving waarbij je de ruimte hebt om te sparren, je ideeën scherp te stellen, en waar je met de benodigde kennis en ervaring om je heen altijd terecht kunt bij je collega’s voor vragen en ondersteuning. Meestal werk je vanuit ons kantoor maar we bieden ook alle faciliteiten om thuis te kunnen werken. Voor sommige projecten ga je mee naar de klant, wellicht zelfs in het buitenland!

Bekijk vacature »

Software Ontwikkelaar .NET te Zaandam

Bedrijfsomschrijving Je komt hier terecht bij een door-en-door softwarebedrijf, waarbinnen meerdere SaaS pakketten worden ontwikkelt voor diverse sectoren. Hierbij kun je denken aan bijvoorbeeld de logistieke en medische branche. Deze organisatie kenmerkt zich door de hoge mate van complexiteit in de applicaties, wat betekent dat jij je hier niet zal gaan vervelen. Integendeel: Jij gaat hier elke dag ontzettend veel leren en je in razend tempo ontwikkelen als C# .Net Developer met focus op back-end. Het team bestaat uit ongeveer 20 personen personen, waarvan het grootste deel zich richt op software development. De sfeer is informeel en professioneel. De producten

Bekijk vacature »

Cloud Developer

Cloud Developers opgelet! Bij Luminis zijn ze opzoek naar jou. Lees de vacature en solliciteer direct. Luminis is een software- en technologiebedrijf met meerdere vestigingen. Vanuit deze vestigingen werken 200 professionals aan technisch hoogwaardige oplossingen voor klanten zoals KLM, Nike en Bol.com. Ook ontwikkelt Luminis eigen oplossingen op het gebied van cloud, Internet of Things, data intelligence, e-sports en e-learning. Luminis onderscheidt zich door aantoonbaar voorop te lopen in technologie en innovatie. Luminis heeft drie kernpunten die verankerd zitten in alles wat we doen: het omarmen van nieuwe technologie, meesterschap en kennis delen. Functiebeschrijving First things first! Het is belangrijk

Bekijk vacature »

C# .NET Developer

Functie omschrijving Ben jij op zoek naar een nieuwe uitdaging binnen development waar je komt te werken binnen een flexibel, jong en ondernemend bedrijf. Lees dan snel verder! Voor deze functie zoeken wij een C# .NET Developer die enthousiast wordt van het aansluiten en begeleiden van (complexe) nieuwe klanten. Daarnaast begeleid je complexe projecten, wij zoeken iemand die altijd kansen ziet en waarbij het glas altijd half vol is. Voor deze functie zoeken wij een Developer met ervaring op het gebied van .NET die deze organisatie gaat versterken. Binnen de organisatie ga jij je vooral bezighouden met het verbeteren van

Bekijk vacature »

Frontend Developer Vue Nuxt HBO Javascript

Samengevat: Deze werkgever levert elke dag betere digitale gebruikerservaringen. Ben jij geschikt als frontend Developer? Heb je ervaring met Vue en Nuxt? Vaste baan: Front-End Developer HBO €3.100 - €4.600 Zij bieden opdrachtgevers een complete dienstverlening op gebied van ontwerpen en ontwikkelen van websites, zoekmachine optimalisatie, online adverteren, content marketing en conversie verbetering. Zij werken met een eigen ontwikkeld CMS. Bij bij hun werk je aan onze eigen bedrijfsapplicaties. Je ontwikkelt met ons de meest nieuwe software. Wij blinken uit als het gaat om de inzet van technologie. Deze werkgever staat open voor elke nieuwe trend. Onze systemen zijn groot

Bekijk vacature »

Junior .NET Software Developer

Dit ga je doen Software development met behulp van C# .NET en / of PHP, je mag zelf kiezen waar jij je in wil specialiseren Meedenken over het nieuwe pakket, waar moet het aan voldoen? Unit-, integratie- en diverse andere tests schrijven en uitvoeren Nauw samenwerken met je IT collega's zoals Testers, Developers, DevOps Specialisten en Architecten Jezelf ontwikkelen met behulp van trainingen en cursussen Hier ga je werken Onze klant, een grote speler in de medische sector, is op zoek naar een enthousiaste junior (of meer ervaren) Software Developer die klaar is voor een nieuwe stap in zijn of

Bekijk vacature »

Front-end developer (medior/senior)

Functie Het team bestaat uit een architect, fullstack developers, app developers, de product owner en projectmanager. Eenieder draagt vanuit zijn discipline bij aan een complete oplossing voor de klant. Uiteraard zul je hierin nauw samenwerken met je collega’s. Jij wordt verantwoordelijk voor de front-end implementatie en fungeert als lead op dit gebied binnen het team. Je kunt helder formuleren, ideeën uitdragen en overbrengen aan je collega’s. Qua technische stack is het vooral van belang dat je ervaren bent met Angular, HTML5, CSS en TypeScript. Verder is ervaring in NgRx, Bootstrap, BEM en Cypress een pré, evenals affiniteit met UX/UI Design!

Bekijk vacature »

Python (Django) developer - Remote in The Netherla

Functie Together with your team, consisting of a senior, 2 mediors and one junior developer, you will work on their software in an Agile-based approach. You have an eye for quality, risk, and customer interest. Communication with your colleagues and, where necessary, with customers, plays an important role in achieving a successful result. As a person, you are smart, get things done, and are result-oriented. There is a lot of independence within the development team, apart from the stand-up (10:00 am) and occasional pair-programming sessions. Techniques they use include Python, Django, MySQL, Mercurial, Ubuntu Linux, Nginx. In terms of front-end

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 »

PHP ontwikkelaar

Functie Met een complex en uitgebreid e-commerce platform, een eigen PIM-systeem en eigen scan applicatie – krijg jij dagelijks te zien hoe jouw werk gebruikt wordt door miljoenen gebruikers. En we staan qua development pas in de startblokken, aangezien er nog meerdere projecten op de plank liggen te wachten! Ons huidige development team bestaat uit 8 programmeurs. Er wordt dagelijks gereflecteerd op geschreven code, Scrum taken en kennisdelen onderling is een must. Onze voertaal binnen ons team is Engels, dit omdat wij twee internationale collega’s hebben. Ons huidige “IT Landschap” bestaat voornamelijk uit allerlei losse onderdelen die individueel, maar ook

Bekijk vacature »

Senior Front-end Developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als Senior Front-end Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Deze snelgroeiende groep collega’s krijgt energie van hun vak en dat merk je op de werkvloer. Onze klantenkring is groot en divers, dat vraagt om flexibiliteit van jou. Tegelijkertijd betekent dit dagelijks nieuwe dingen leren én dat geen werkdag hetzelfde is. Natuurlijk krijg jij de mogelijkheid je te certificeren. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling waarbij iedereen welkom is, zowel

Bekijk vacature »

Senior Front end developer Automotive Angular

Functie Als Senior Front end developer kom je te werken in een team van 11 developers. 9 van de 11 focussen zich op back end, welke is geschreven in Java, en 2 op de front end waarbij er gebruik wordt gemaakt van Typescript en Angular. De focus in deze rol ligt op 2 aspecten; doorontwikkeling van de eigen tooling en gebruik van de tooling t.b.v. klantprojecten. Momenteel zijn ze in de afrondende fase van een project waarbij ze het gehele verkoopproces van nieuwe auto’s anders ingeregeld hebben voor een grote dealer in Nederland. Waarbij Auto’s normaliter pas verkocht werden in

Bekijk vacature »

Senior .NET developer

Functie Als Senior .NET ontwikkelaar ga jij aan de slag in ons Research & development team. Ons team bestaat uit 17 collega’s! Wij zijn momenteel druk bezig met het opzetten van een geheel nieuwe architectuur voor een nieuw product. Hierbij maken wij o.a. gebruik van VS2022 en .NET 6.0. Jouw functie is dan ook voornamelijk backend georiënteerd bij ons. Aangezien wij meetapparatuur ontwikkelen voor de chemische industrie is het ook erg belangrijk om kwalitatief hoogwaardige software te ontwikkelen voor de besturing hiervan. Verder ben jij verantwoordelijk voor het designen, implementeren en testen van nieuwe features. Ook zorg jij voor toekomstbestendige

Bekijk vacature »

Starter/junior Magento developer gezocht!

Functie Je komt te werken in een zelfsturend team waarin vertrouwen voorop staat en inbreng en ideeën worden gewaardeerd. Ook staat innovatie centraal. Ze bieden jou de mogelijkheid om jezelf door te ontwikkelen. Denk hierbij aan cursussen en een persoonlijk ontwikkelplan. Je komt terecht in het team van momenteel 4 (ervaren) collega’s en zal meewerken aan de doorontwikkeling en nieuwbouw van de Magento platformen van meerdere opdrachtgevers volgens Agile/Scrum. Denk hierbij aan nieuwe functionaliteiten, UX en koppelingen met verschillende back-end systemen. Als starter/junior developer zul je direct begeleid worden door een senior uit het team. Het is van belang dat

Bekijk vacature »

Front End Developer React Vue

Dit ga je doen Meewerken aan de implementaties en ontwikkeling van nieuwe functionaliteiten van de webapplicaties; Ontwikkelen met o.a. React en Vue en HTML/CSS, ook krijg je in verband met de samenwerking ook affiniteit met de backend Ruby on Rails; Ontwikkeling aan de front end voor de koppelingen tussen de diverse systemen; Ontwerpen van interfaces en een bijdrage leveren aan de gebruikerservaring; Zorgdragen voor hoge kwaliteit van code en jezelf (en anderen) blijven verbeteren; Als Senior Front End Developer begeleid je zelf ook FE-development projecten, hierin leid je de projecten en pak jij het initiatief op (bv integratieprojecten). Hier ga

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

29/05/2024 12:17:03
 
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.