PDO wrapper wil geen values binden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Embedded Software Developer Games

Functie omschrijving Heb jij affiniteit met hardware en wil jij kleuren binnen een Qt framework? Spreek jij de talen C en of C ++? Dan ben ik wellicht opzoek naar jou! Voor een super gave opdrachtgever in omgeving Delft is er namelijk plek voor een nieuwe kracht! Dit bedrijf is gespecialiseerd in het ontwerpen van software voor een unieke game industrie. Wil jij betrokken worden bij een proces dat loopt van ontwikkeling tot installatie? Waarbij je bezig zult zijn met perfecte systemen die geleverd worden aan binnen en buitenland? Je zult in een team, samen met vier ontwikkelaars, de mooiste

Bekijk vacature »

Medior/senior Front-end developer (Vue.js)

Functie Als Front-end developer ben je uiteindelijk overkoepelend aan de slag voor de 3 ontwikkelteams die ieder aan een specifiek product werken. In samenwerking met de UX-designer en de huidige Front-end developer zorg je voor gebruiksvriendelijke software. Lijkt het jou interessant om complexe problemen op te lossen en feautures naar een hoger niveau te tillen? En vind je het niet erg om oudere delen van de applicaties te refactoren i.c.m. het toevoegen van nieuwe functionaliteiten? Dan komen wij graag met je in contact. Eisen • HBO werk- en denkniveau (ze kijken niet naar papieren, maar naar denkniveau, motivatie en zelfredzaamheid)

Bekijk vacature »

Android developer

De functie Schiphol is een plek om te reizen, te verblijven en te werken. Door middel van data en technologie richten we op al deze gebieden het leef- en werkklimaat optimaal in en zorgen we voor een slimmere en efficiëntere operatie. Wij ontwikkelen nieuwe producten en diensten vanuit de wensen en behoeften van onze klanten, voorspellen passagier flows en testen digitale oplossingen om rijen en andere pijnpunten in het proces te verminderen. Met slimme feedback van sensortechnologie maken we zelfs data van toiletten en stoelen inzichtelijk en bruikbaar. Het Commercial Platform bestaat uit multidisciplinaire teams met een end-2-end verantwoordelijkheid voor

Bekijk vacature »

Medior C# Developer

You'll build modern applications for Coolblue's back office. We have a lot of friends, and they crave well-structured data and user-friendly, task-focused applications. How do I become a Medior C# Developer at Coolblue? You regularly participate in brainstorm sessions about user experience, data, and task flow with the UX Designer, Product Owner, and Data Scientists in your team. Besides that you will create disconnected, highly congruent, and testable code that can easily be maintained and is future-proof. Want to become C# Developer at Coolblue? Read below if the job suits you. You enjoy doing this Working with various types of

Bekijk vacature »

BizTalk/ Azure Developer

Dit ga je doen •Understanding the scope of required functionality, translate them within context of way of working of the team into developed solutions, whilst safeguarding documentation; •Planning based on assigned sprint tasks; •Acting as an expert in estimation techniques and planning; •Understanding your role in the agile process and act in this way; •Facilitating internal communication and effective collaboration; •Working closely with scrum master to handle backlogs and new requests; •Providing information to the third parties about activities and needs for compliance. Hier ga je werken Our client is a leading organization focusing on animal nutrition, offering solutions that

Bekijk vacature »

In-house .NET software developer

Functie omschrijving Ben jij op zoek naar een uitdagende in-house development functie? Maak jij graag hét verschil m.b.t. interne automatisering? Haal jij energie uit het automatiseren van processen voor je eigen collega's? Dan hebben wij de perfecte vacature voor je! Voor een gezellig Brabants familiebedrijf, zijn wij op zoek naar een .NET software developer. Je gaat in deze zelfstandige functie werken aan de ontwikkeling van eigen applicaties & en het koppelen van deze applicaties aan de ingekocht software. Jouw werkzaamheden zien er als volgt uit: Het management team signaleert behoeftes vanuit de business. Vervolgens worden deze behoeftes uitgewerkt en geprioriteerd.

Bekijk vacature »

Back end developer

Functie Jij als full stack ontwikkelaar komt te werken in een team bestaande uit 4 back end programmeurs, 2 vormgevers/ Front end developers en een online marketeer. Qua persoonlijkheden is het team erg gevarieerd van sportfanaten tot gameliefhebbers en Golfers. Een ding heeft iedereen hier gemeen; Passie voor goede code. In jouw rol zul je voor 90% van je tijd je bezig houden met het ontwikkelen van grote maatwerk applicaties. Daarnaast hebben wij op aanvraag ook wel eens een website of onderhoudsklusje, die opgepakt moet worden en hier ben jij ook niet vies van. De technische uitdaging momenteel is dat

Bekijk vacature »

Ervaren PHP Software Developer

Functieomschrijving Voor een toffe opdrachtgever in regio Breda zijn wij op zoek naar een medior PHP Developer met affiniteit met Laravel. Je komt te werken bij een uitdagende opdrachtgever met supergave klanten in een specifieke branche. Als PHP ontwikkelaar ben je samen met een vooruitstrevende team van 6 collega’s verantwoordelijk voor de ontwikkeling, beheer en het vernieuwen van informatiesystemen voor een specifieke branche. Je ondersteunt complexe uitdagingen van klanten. Vervolgens breng je hun wensen in kaart en vertaalt deze door naar maatwerk software. Affiniteit met Laravel is een pré. Om de klanten zo goed mogelijk te ondersteunen en snel in

Bekijk vacature »

Informeel bureau zoekt Senior PHP developer

Functie Als senior PHP developer neem je het voortouw in ontwikkeltrajecten en ben je in staat werk uit te leggen aan collega’s om zo je kennis met hen te delen. Je deinst niet terug voor ingewikkelde projecten. Deze zie jij alleen maar als uit uitdaging. Je werkt doorlopend aan klantcases (en hierdoor je klant echt leert kennen), maar toch ben je afwisselend bezig. Dit alles in een vrije en ontspannen werksfeer, met een team van gelijkgestemde. Binnen de development teams werken ze met o.a. PHP, Laravel, React, Node, Elastic, Amazon AWS, JIRA, Solid, Domain-driven-design, Doctrine, Redis, docker, Kubernetes, CI, PHP

Bekijk vacature »

C# Ontwikkelaar

Functieomschrijving Voor een software ontwikkelaar in de omgeving van Vught zijn we op zoek naar een gemotiveerde C# ontwikkelaar. Deel jij hun passie voor development en dan vooral in C#.NET? Dan kan dit wel eens jouw droombaan zijn! Jouw werkzaamheden zullen er ongeveer als volgt uit gaan zien Door de wensen van de klant goed te begrijpen ga jij aan de slag dit om te zetten naar passende oplossingen en werk je deze uit tot een sterk eindproduct. Je gaat je bezighouden met de ontwikkeling van webapplicaties en websites, dit doe je door middel van ASP.NET, MVC Frameworks en C#.

Bekijk vacature »

Dynamische Oracle/APEX Ontwikkelaar in de logistie

Bedrijfsomschrijving De organisatie in de regio Rotterdam is gespecialiseerd in het ontwikkelen van moderne webbased software voor de ERP branche. In totaal is er 20FTE aan specialisten actief binnen de organisatie. De ICT afdeling bestaat momenteel uit 15FTE. Ze groeien ontzettend hard en daarom zoeken zij een Oracle/APEX Developer die het reeds sterke team nog sterker komt maken. Hier werken ze op projectbasis voor verschillende grote organisaties in de logistieke sector. Het is een informele organisatie waarbinnen een fijne werksfeer heerst. Zoals aangegeven willen ze het team nog sterker maken en daarvoor zoeken ze bij voorkeur medior of senior Oracle/APEX

Bekijk vacature »

Senior Developer Betty Blocks Blauwe Haven Rotterd

Functieomschrijving Voor de Politie zijn wij opzoek naar een Senior Developer Betty Blocks Blauwe Haven Rotterdam. De politieorganisatie heeft jaarlijks te maken met een aanzienlijk aantal politiemedewerkers die vanwege mentale overbelasting niet of beperkt inzetbaar zijn. De Blauwe Haven Rotterdam ondersteunt deze politiemedewerkers in hun herstel en re-integratieproces. De huidige digitale systemen van de Politie bieden onvoldoende ondersteuning in het herstel- en re-integratieproces van politiemedewerkers. Zowel voor de politiemedewerkers als voor de organisatie. Politiemedewerkers worden buitengesloten, waardoor zij eigen regie verliezen. Begeleiders kunnen de voortgang van de medewerkers niet goed monitoren. Management beschikt niet over de mogelijkheid trends te signaleren

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 »

Medior/Senior Software Developers gezocht in de Ra

Functie Op dit moment staan er posities open voor de volgende functies: Front-end, Back-End & Fullstack software developer. Als Front-End software developer werk je met JavaScript en de bijbehorende technologieën zoals TypeScript, Angular, React, Vue en Svelte. Als Back-End software developer ben je bezig in NodeJS en doe je dit met behulp van AWS, NoSQL, REST en GraphQL. Je krijgt leuke en uitdagende opdrachten met een gemiddelde duur van anderhalf jaar. Hier werk je in een team met andere IT’ers aan het ontwikkelen en verbeteren van software. Je wordt begeleid door een accountmanager die fungeert als jouw aanspreekpunt. Het team

Bekijk vacature »

Airport Developer / System engineer

De functie Als onze nieuwe Airport Developer / System Engineer is je doel om uit nieuwbouw- en onderhoudsprojecten maximale waarde te creëren voor Schiphol Group en haar stakeholders. Vanuit je visie en expertise, maar ook (technologische) ontwikkelingen, wetgeving en beleid vertaal je klantwensen naar een gedegen programma van eisen. In de planontwikkelingsfase werk je nauw samen met Plan Ontwikkelaars om je kennis in te brengen ten behoeve van de kwaliteit van het investeringsvoorstel. Je overlegt met diverse partijen, stelt de vraag achter de vraag en verbindt zo de belangen van de luchthaven, proceseigenaar en asseteigenaar om tot een gedragen ontwikkelopgave

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

08/11/2024 16:32:20
 
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.