Van MySQL naar MySQLi

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Xamarin Developer

Functieomschrijving Ben jij de Xamarin expert die de volgende stap in zijn carrière wil zetten? Houd jij er van om veelgebruikte apps verder uit te bouwen terwijl je de kwaliteit blijft waarborgen en heb je daarnaast zelf innovatieve ideeën ? Lees dan snel verder! Samen met het gehele mobile app team ben jij verantwoordelijk voor: de (door)ontwikkeling van Native applicaties voor Android en iOS; het verder samenbrengen van de applicatie en de web omgeving; de innovatie van de applicatie, het is belangrijk dat jij zelf meedenkt en jouw ideeën voorlegt binnen het team; feedback vanuit de gebruikers te behandelen en

Bekijk vacature »

C# .NET Developer

Heb je ervaring in ontwikkelen van applicaties m.b.v. C# en .NET en zie jij jezelf wel werken in een bedrijf met volop ontwikkelingsmogelijkheden? Solliciteer dan direct voor deze positie als: C# .NET Developer in Rijnsburg, ±30 min. rijden van Den Haag Over de positie: Als C# .NET developer bij Alfa Pro IT staat je een brede functie te wachten die je langs wisselende onderdelen van het vak brengt. Denk aan administratieve, logistieke en financiële modules, koppelingen met webshops, apps en andere E-Commerce-toepassingen. Je komt te werken in een gezellig en informele scrumteam en bouwt mee aan de ontwikkeling van een

Bekijk vacature »

Technisch Consultant

Heb jij een passie voor IT? Is het vertalen van klantvragen naar werkende softwareoplossingen iets waar jij energie van krijgt? Misschien is de functie van Technisch Consultant jou dan wel op het lijf geschreven. Technisch Consultant Thinkwise is een wereldwijde speler met een unieke kijk op de wereld van techniek. De komende jaren hopen we samen met jouw kennis en kunde verder te groeien, zodat we nog meer klanten kunnen voorzien van software die hun business op een eenvoudige, inzichtelijke en duurzame manier ondersteunt. Wat doet een Technisch Consultant? Als Technisch Consultant breng je bedrijfsprocessen en requirements van onze klanten

Bekijk vacature »

.NET ontwikkelaar / C# / miljarden berichten

Functieomschrijving Ben jij als .NET Developer bekend met oplossingen voor zwaar berichtenverkeer? Wil jij onderdeel zijn van een organisatie in regio Den Bosch die de verantwoording heeft om grote hoeveelheden gevoelige data veilig te versturen? Dan is dit je kans om voor een topclub te komen werken! Programmeren van high-availability en high-security applicaties in C#; Samen met je teamgenoten nieuwe applicaties/diensten ontwikkelen in .NET; Overleggen met de informatie analisten en testers; Ontwikkelen van webservices (WCF); 20 % van je tijd besteden aan innovatie; Deelnemen aan projecten om nieuwe ketenpartijen toe te voegen; Bouwen van unit testen. Functie-eisen Beschikt over HBO/WO

Bekijk vacature »

software engineer / applicatieontwikkelaar (m/v)

Wij zijn op zoek naar een software engineer / applicatieontwikkelaar, (M/V) 40 uur p/w Carrièreniveau: Startend / Midcareer De werkzaamheden: Als applicatieontwikkelaar ben je verantwoordelijk (in teamverband) voor het maken/schrijven van software voor het bedrijf zelf. Dit kan betrekking hebben op het hele spectrum van de software die gebruikt wordt: Database Instrumentatie en robotica Websites en -api’s. Gevraagd profiel: Wij zoeken een enthousiaste kandidaat met HBO ICT opleiding of een uitstekende MBO-er ICT. Je hebt een positieve en flexibele werkhouding. Affiniteit of ervaring met industriële automatisering of robotica geldt als een pré. Kennis van met name FileMaker, C#, html, php,

Bekijk vacature »

Technisch Architect

Online studeren overal in Nederland en Vlaanderen De Open Universiteit (OU) is de deeltijduniversiteit van Nederland. Studenten volgen er online activerend onderwijs en binnen de verschillende wetenschapsgebieden wordt disciplinair onderzoek verricht. Studenten kunnen universitaire bachelor- en masteropleidingen in zeven vakgebieden doorlopen. Kenmerken van het onderwijs zijn openheid, flexibiliteit en kwaliteit. Er is veel aandacht voor verbetering van het studiesucces van studenten. Aan de OU studeren ruim 14.000 studenten en werken bijna 700 medewerkers. De OU heeft vestigingen in Nederland en België (zie https://www.ou.nl/studiecentra). De hoofdvestiging bevindt zich in Heerlen. De nieuwste technologieën en onderwijskundige inzichten worden toegepast, zowel in de

Bekijk vacature »

Senior Software Engineer

“Trusted identity verification. Since 1923.” KEESING Technologies is a world leader in ID verification tools. To support our ambitious growth, we are looking for a fulltime (36 hrs/w) Senior Software Engineer The Software Engineer will be contributing to the development and delivery of the backend APIs of our cloud product, developing new features and launching new platforms. A successful candidate will have a proven ability in delivering highly scalable backend applications, a desire to work in a fast paced, Agile software development environment and a passion for building a world class product. The Role: Be responsible for developing and maintaining

Bekijk vacature »

Full-stack .NET developer gezocht, Goeree-Overflak

Ben je een .NET software developer en op zoek naar een professionele werkomgeving binnen een wat groter innovatief en ambitieus bedrijf? Waar sprake is van een uitgebreid applicatielandschap met elke dag nieuwe uitdagingen, waar alles mogelijk is, binnen een goede collegiale sfeer? Lees dan verder! Voor een bedrijf in Goeree-Overflakke zijn we momenteel op zoek naar een ervaren software developer. De IT afdeling bestaat uit circa 60 mensen waarvan zo'n 15 developers. Voor de recente architectuur wordt gebruikt gemaakt van de nieuwste technieken waaronder .NET Core, Docker en Angular. Echter bestaat het applicatielandschap uit een groot aantal verschillende applicaties waarbij

Bekijk vacature »

Gis Data Analyst

Voor ons kantoor in Capelle a/d IJssel zijn wij op zoek naar een Gis Data Analyst Werken bij AND Products (AND) betekent werken in een uitdagende en professionele werkomgeving waarin er ruimte is voor eigen inbreng. AND is een levendig internationaal bedrijf met klanten uit verschillende locaties in de wereld. Je zult deel uitmaken van een ervaren en toegewijd team, waarin je je kan ontwikkelen en het belangrijk vindt om verantwoording te dragen, initiatieven te nemen, ideeën te vormen en persoonlijke doelstellingen na te streven. Je zal o.a. leren hoe navigatie- en landkaarten worden opgebouwd, en zal verschillende facetten van

Bekijk vacature »

Coördinator Servicedesk

BNP Paribas Cardif zoekt een Coördinator Servicedesk Ben jij een ster in het helpen van collega’s bij ICT problemen? Ben je een servicegerichte en gedreven collega? Kun je multi-tasken door het ene moment operationeel bezig te zijn en tegelijkertijd het overzicht te bewaren? En wil je graag werken voor een internationale verzekeraar? Dan ben jij onze nieuwe Coördinator Servicedesk. Wat je bij ons doet Jij bent het aanspreekpunt voor (internationale) collega’s en voert zowel eerste als tweedelijns support taken uit binnen de geautomatiseerde werkomgeving. Maar wat doe je dan concreet de hele dag? Bijvoorbeeld: Je controleert in ServiceNow of alle

Bekijk vacature »

Traineeship Pega Developer MKB Brandstof & BPM

Heb je een ICT gerelateerde HBO/ WO opleiding afgerond, interesse in Business Process Management, vind je persoonlijke ontwikkeling belangrijk en wil je deel uitmaken van MKB Brandstof? Dan is het Traineeship tot Pega Developer van MKB Brandstof en BPM Company iets voor jou! Met een opleidingsprogramma en begeleiding op maat –zowel vanuit MKB Brandstof als BPM Company- zorgen we ervoor dat jij je optimaal kan ontwikkelen. De eerste 2 maanden ben je bezig met het behalen van je Pega certificeringen (Certified System Architect (CSA) en Certified Senior System Architect (CSSA)). Hierin zal je door BPM Company worden begeleid. Daarna ga

Bekijk vacature »

Python Developer

Locatie AMSTERDAM Functieomschrijving Voor een internationale bank in Amsterdam zoeken wij een Python Developer met interesse in Data Engineering. Waar kom je te werken? Je komt te werken binnen de afdeling Financial Risk. Binnen de bank is deze afdeling verantwoordelijk voor o.a. het voorspellen van risico’s bij het verstrekken van kredieten en het maken van rapportages voor toezichthouders zoals de DNB en de ECB. Op dit moment zitten zij in een enorme transitie fase waarbij er over wordt gegaan op een nieuw datamodel. Het team waar jij komt te werken helpt bij de inrichting van de nieuwe infrastructuur. Hoe ziet

Bekijk vacature »

Java Developer AWS Financiële sector 5500,-

Functieomschrijving Ben jij een ervaren Java Developer, daagt een dynamische omgeving jou uit en bouw je graag innovatieve oplossingen? Werk je graag in de financiele sector en in een familiaire omgeving waar groei centraal staat? Lees dan snel verder! Het ontwikkelen van financiële applicaties in Java o.b.v. microservices architectuur; Software ontwikkelen specifiek voor het AWS platform om het maximale uit Amazon Webservices te halen; Werken aan een zeer veeleisende omgeving en continu veranderende applicaties; Het werken in een multidisciplinair team dat continu werk oplevert middels CI/CD; Deelnemen aan designsessies; Het schrijven van diverse automatische tests; Op de hoogte blijven van

Bekijk vacature »

Business Intelligence Developer vacature

Jij ben niet bang om hard te werken. Uitdagingen zijn welkom. En problemen? Die zijn er om opgelost te worden of, nog beter, om voorkomen te worden! Voor jij aan de slag gaat met het ontwerpen van BI- en DWH-oplossingen, leg je eerst je oor te luister bij de klant. Zo weet jij wat de klant wil, en hoe jouw ontwerp eruit moet komen te zien. Simpel! Althans… met jouw Developer-kwaliteiten wel! Over deze BI vacature Als Business Intelligence Developer ga je zowel op locatie bij de klant aan de slag, als op een van de Sogeti-locaties. Je analyseert de

Bekijk vacature »

Java Developer / Java EE frameworks / Inhouse (Clo

Functieomschrijving Ben jij een Java Developer met een zeer uitgebreide kennis van REST API's en wil jij graag werken aan uitdagende Inhouse projecten voor grote en bekende partijen in Nederland? Dan is dit de rol waarnaar jij op zoek bent! Binnen deze rol zal jij je als Java Developer aan de slag gaan voor een van de meest bekende bureaus op het gebied online platformen, een rol met veel afwisseling en voldoende technische uitdaging! Werken aan diverse en uiteenlopende projecten, waarbij je meer dan eens pionierswerk zal moeten verrichten; De mogelijkheden tot het toepassen van nieuwe technieken bespreken, beoordelen en

Bekijk vacature »
Kim Kim

Kim Kim

07/07/2019 21:27:45
Quote Anchor link
Ik wil graag een (hele) oude class van MySQL naar MySQLi omzetten maar alle tutorials gaan over php (zonder class) waardoor moeilijker maakt en ik wil het aan passen zonder te slopen.

Dit is een makkelijke voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
  $conn
= mysql_connect("db-host","user","pass");
  $db = mysql_select_db("db-name", $conn);
  $result = mysql_query("SELECT * FROM `table`");
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
  $conn
= mysqli_connect("db-host","user","pass","db-name")
  $result = mysqli_query($conn, "SELECT * FROM `table`");
?>


Dit is de class (verbinding) wat ik wil aanpassen en mij vraag is hoe pas ik dit aan zonder te slopen?

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
<?php

class mysqlclass {
    private $dbHost = '';
    private $dbName = '';
    private $dbUser = '';
    private $dbPass = '';
    private $htmlWriter;

    //Helpers
    private $dbConnection;
    private $dbResult;

    //Debug informatie;
    private $dbError;
    private $dbErrno;

    //Constructor in deze klasse word de verbinding met de mysql db gemaakt.
    function __construct($ht){
        $this->htmlWriter = $ht;
        $this->dbConnection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass);
        if (!$this->dbConnection){
            $this->dbError = mysql_error();
            $this->dbErrno = mysql_errno();
            throw new Exception($this->getErrors());
        }

        if (!mysql_select_db($this->dbName)){
            $this->dbError = mysql_error();
            $this->dbErrno = mysql_errno();
            throw new Exception($this->getErrors());
        }
    }


    //functie om een query uit te voeren.
    function executeQuery($sql)
    {

        $this->htmlWriter->logDebugInfo("Executing: ".$sql."<br />\n");
        $this->dbResult = mysql_query($sql);
        if (!$this->dbResult){
            $this->dbError = mysql_error();
            $this->dbErrno = mysql_errno();
            $msg = "<span style=\"color: red;\">Error while executing.<br />\n</span>\n";
            $this->htmlWriter->logDebugInfo($msg);
            throw new Exception($this->getErrors());
        }

        else{
            $this->htmlWriter->logDebugInfo("Query executed.<br />\n");
        }

    }


    //Functie om een resultaat in een array op te halen.
    function getDataRow()
    {

        try{
            $rows = mysql_fetch_array($this->dbResult);
            if (count($rows) > 0){
                mysql_free_result($this->dbResult);
            }

            return $rows;
        }

        catch (Exception $e){
            throw new Exception($e->getMessage());
        }
    }


    //Functie om het aantal opgehaalde rijen op te halen.
    function getResultCount()
    {

        $counter = mysql_num_rows($this->dbResult);
        $this->htmlWriter->logDebugInfo("Result count: ".$counter."<br />\n");
        return $counter;
    }


    //Functie om het aantal aangepaste rijen op te halen.
    function getAffectedRows()
    {

        $counter = mysql_affected_rows();
        return $counter;
    }


    //Functie om een rij op te halen uit de database.
    function getSingleRowAsObject()
    {

        $row = mysql_fetch_object($this->dbResult);
        $this->htmlWriter->logDebugInfo("Geladen: ".$row->paginaID."<br />\n");
        return $row;
    }


    //Functie om een aantal rijen op te halen uit de database.
    function getRowsAsObjectArray()
    {


        $rows = array();
        while ($row = mysql_fetch_object($this->dbResult)){
            $rows[] = $row;
        }

        return $rows;

    }


    //Functie om een fout optehalen.
    function getErrors(){
        $retHtml = "<div class=\"errorDialog\">{$this->dbError}<br />\n{$this->dbErrno}</div>\n";
        return $retHtml;
    }

    //Functie om de databse verbinding te sluiten.
    function __destruct()
    {

        try{
            $this->dbResult = null;
            mysql_close($this->dbConnection);
        }

        catch(Exception $e){
            throw new Exception($e->getMessage());
        }
    }
}

?>


Nu is de vraag wat heb ik allemaal gedaan?

- Eerst gezocht naar vergelijkbare class.
- Daarna PHP error geplaatst en dat geeft niet niks dan blanco scherm.
- PHP versie telkens verlaagd maar nog steeds blijft blanco scherm aangeven.
 
PHP hulp

PHP hulp

23/02/2020 15:12:17
 
Adoptive Solution

Adoptive Solution

07/07/2019 21:37:41
Quote Anchor link
Dit is een vergelijkbare class.

Gebruik 'm met goed resultaat.

https://github.com/bennettstone/simple-mysqli
 
Thomas van den Heuvel

Thomas van den Heuvel

07/07/2019 23:34:26
Quote Anchor link
Oef. Wellicht dekt dat de lading voor wat jij er mee doet, maar in die class zitten een aantal nogal rare zaken. Deze class lijkt ook op geen enkele manier transacties te ondersteunen - betekent dat ook dat jij nooit transacties gebruikt?

Ik kan een hele lijst van dingen geven maar het meest in het oog springende is gelijk de constructor. Deze heeft geen parameters. Meteen als deze methode wordt aangeroepen gaat deze ook dingen instellen omtrent encoding?! Dit lijkt mij iets wat je regelt op applicatieniveau. Dat zou een database-class nooit op eigen houtje mogen regelen.

Ook lijkt er een voorliefde te bestaan voor het introduceren van constanten. Waarom? Waarom zouden database-credentials overal toegankelijk moeten zijn, en uberhaupt onthouden moeten worden? Deze data trek je ergens uit configuratie maar die kun je na het aanmaken van de connectie gewoon vergeten.

Daarnaast breekt dit ook met een ander OO-ontwerpprincipe: herbruikbaarheid. Wat nu als je toevallig een keer een tweede connectie nodig hebt? Dit is dan in het geheel niet mogelijk met deze klasse? :/

De character encoding is ook hard coded op "utf8", er zijn tegenwoordig veel meer andere, en uitgebreidere, UTF-8 spinoffs dan dat. Ook kun je geen poort instellen.

Kortom, er valt dus weinig te configureren aan connectie-credentials. Sure, voor de meeste basisinstallaties voldoet dit, maar als je deze code een keer wilt deployen op een server waar afwijkende standaarden worden gebruikt dan raak je mogelijk snel in de problemen.

Methoden als filter() en clean()... Wat zou je daar mee moeten? Input escaping? Ge-escapete data terugbreien naar een niet-ge-escapete variant? *brr*

Hulpfuncties als num_rows(), get_row() et cetera, waarom zitten die in een Database class? Deze horen thuis in een Database-result class.

Ik denk dat deze (monolythische) class niet erg flexibel is, te groot is omdat deze teveel dingen probeert te regelen, en deze je in sommige opzichten de verkeerde kant opstuurt qua aanpak m.b.t. escaping en security.
Gewijzigd op 07/07/2019 23:50:58 door Thomas van den Heuvel
 
Rob Doemaarwat

Rob Doemaarwat

08/07/2019 03:13:49
Quote Anchor link
Ik zou sowieso NIET de class gaan gebruiken die Adoptive Solution voorstelt. Dat is gewoon een security nightmare (die ->exists() functie, en dan een value doorgeven met "now()" d'r in -> kom maar door met die SQL injectie), en voor de rest voegt het ook niet zo heel veel zinnigs toe.

Wat je in jouw geval moet doen is alle mysql_* functie vervangen door de mysqli_* varianten. Omdat de connectie al wordt opgeslagen in $this->dbConnection kun je in de meeste gevallen volstaan door die extra "i" aan de functienaam toe te voegen, en dan als 1e parameter "$this->dbConnection" invoegen (met wat uitzonderingen - read the docs, door bijvoorbeeld in je code dump hierboven op de linkjes te klikken, in een rood kader staat bovenaan steeds een link naar de mysqli_* variant).

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
    //Constructor in deze klasse word de verbinding met de mysql db gemaakt.
    function __construct($ht){
        $this->htmlWriter = $ht;
//"i" invoegen
        $this->dbConnection = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass);
        if (!$this->dbConnection){
//dit is dus even anders
            $this->dbError = mysqli_connect_error();
            $this->dbErrno = mysqli_connect_errno();
            throw new Exception($this->getErrors());
        }
//vanaf hier "i" invoegen en "$this->dbConnection" als 1e param
        if (!mysqli_select_db($this->dbName)){
            $this->dbError = mysqli_error($this->dbConnection);
            $this->dbErrno = mysqli_errno($this->dbConnection);
            throw new Exception($this->getErrors());
        }
    }

//enz
 
- Ariën -
Beheerder

- Ariën -

08/07/2019 09:29:38
Quote Anchor link
Zelf ben ik ook geen voorstander van speciale databaseclasses voor MySQLi. MySQLi heeft namelijk een interne class die je met 'extend' kan uitbreiden.
Gewijzigd op 08/07/2019 09:30:35 door - Ariën -
 
Kim Kim

Kim Kim

14/07/2019 17:10:17
Quote Anchor link
Vanaf PHP 5.4 heb ik oude functies verwijderd zoals
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
&$
dit heb ik door dit vervangen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$
en nu werkt het tot en met PHP 5.6 goed, vanaf PHP 7.0 krijg ik foutmelding omdat ik nu over moet naar MySQLi.

Door bovenstaande over te nemen heb ik nu dit melding:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Parse error: syntax error, unexpected '?>
', expecting function (T_FUNCTION) in mysql.class.php on line 99

Dit is nu de broncode:

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
<?php

class mysqlclass {
    private $dbHost = 'localhost';
    private $dbName = 'name';
    private $dbUser = 'username';
    private $dbPass = 'password';
    private $htmlWriter;

    //Helpers
    private $dbConnection;
    private $dbResult;

    //Debug informatie;
    private $dbError;
    private $dbErrno;

    //Constructor in deze klasse word de verbinding met de mysql db gemaakt.
    function __construct($ht){
        $this->htmlWriter = $ht;
//"i" invoegen
        $this->dbConnection = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass);
        if (!$this->dbConnection){
//vanaf hier "i" invoegen en "$this->dbConnection" als 1e param
        if (!mysqli_select_db($this->dbName)){
            $this->dbError = mysqli_error($this->dbConnection);
            $this->dbErrno = mysqli_errno($this->dbConnection);
            throw new Exception($this->getErrors());
        }
    }


    //Functie om een resultaat in een array op te halen.
    function getDataRow()
    {

        try{
            $rows = mysqli_fetch_array($this->dbResult);
            if (count($rows) > 0){
                mysqli_free_result($this->dbResult);
            }

            return $rows;
        }

        catch (Exception $e){
            throw new Exception($e->getMessage());
        }
    }


    //Functie om het aantal opgehaalde rijen op te halen.
    function getResultCount()
    {

        $counter = mysqli_num_rows($this->dbResult);
        $this->htmlWriter->logDebugInfo("Result count: ".$counter."<br />\n");
        return $counter;
    }


    //Functie om het aantal aangepaste rijen op te halen.
    function getAffectedRows()
    {

        $counter = mysqli_affected_rows();
        return $counter;
    }


    //Functie om een rij op te halen uit de database.
    function getSingleRowAsObject()
    {

        $row = mysqli_fetch_object($this->dbResult);
        $this->htmlWriter->logDebugInfo("Geladen: ".$row->paginaID."<br />\n");
        return $row;
    }


    //Functie om een aantal rijen op te halen uit de database.
    function getRowsAsObjectArray()
    {


        $rows = array();
        while ($row = mysqli_fetch_object($this->dbResult)){
            $rows[] = $row;
        }

        return $rows;

    }


    //Functie om een fout optehalen.
    function getErrors(){
        $retHtml = "<div class=\"errorDialog\">{$this->dbError}<br />\n{$this->dbErrno}</div>\n";
        return $retHtml;
    }

    //Functie om de databse verbinding te sluiten.
    function __destruct()
    {

        try{
            $this->dbResult = null;
            mysqli_close($this->dbConnection);
        }

        catch(Exception $e){
            throw new Exception($e->getMessage());
        }
    }
}

?>


Als ik bovenstaande voorbeeld overneem
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
    //Constructor in deze klasse word de verbinding met de mysql db gemaakt.
    function __construct($ht){
        $this->htmlWriter = $ht;
//"i" invoegen
        $this->dbConnection = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass);
        if (!$this->dbConnection){
//dit is dus even anders
            $this->dbError = mysqli_connect_error();
            $this->dbErrno = mysqli_connect_errno();
            throw new Exception($this->getErrors());
        }
//vanaf hier "i" invoegen en "$this->dbConnection" als 1e param
        if (!mysqli_select_db($this->dbName)){
            $this->dbError = mysqli_error($this->dbConnection);
            $this->dbErrno = mysqli_errno($this->dbConnection);
            throw new Exception($this->getErrors());
        }
    }


Dus zo

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
<?php

class mysqlclass {
    private $dbHost = 'localhost';
    private $dbName = 'name';
    private $dbUser = 'username';
    private $dbPass = 'password';
    private $htmlWriter;

    //Helpers
    private $dbConnection;
    private $dbResult;

    //Debug informatie;
    private $dbError;
    private $dbErrno;

//Constructor in deze klasse word de verbinding met de mysql db gemaakt.
    function __construct($ht){
        $this->htmlWriter = $ht;
//"i" invoegen
        $this->dbConnection = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass);
        if (!$this->dbConnection){
//dit is dus even anders
            $this->dbError = mysqli_connect_error();
            $this->dbErrno = mysqli_connect_errno();
            throw new Exception($this->getErrors());
        }

//vanaf hier "i" invoegen en "$this->dbConnection" als 1e param
        if (!mysqli_select_db($this->dbName)){
            $this->dbError = mysqli_error($this->dbConnection);
            $this->dbErrno = mysqli_errno($this->dbConnection);
            throw new Exception($this->getErrors());
        }
    }


    //Functie om een resultaat in een array op te halen.
    function getDataRow()
    {

        try{
            $rows = mysqli_fetch_array($this->dbResult);
            if (count($rows) > 0){
                mysqli_free_result($this->dbResult);
            }

            return $rows;
        }

        catch (Exception $e){
            throw new Exception($e->getMessage());
        }
    }


    //Functie om het aantal opgehaalde rijen op te halen.
    function getResultCount()
    {

        $counter = mysqli_num_rows($this->dbResult);
        $this->htmlWriter->logDebugInfo("Result count: ".$counter."<br />\n");
        return $counter;
    }


    //Functie om het aantal aangepaste rijen op te halen.
    function getAffectedRows()
    {

        $counter = mysqli_affected_rows();
        return $counter;
    }


    //Functie om een rij op te halen uit de database.
    function getSingleRowAsObject()
    {

        $row = mysqli_fetch_object($this->dbResult);
        $this->htmlWriter->logDebugInfo("Geladen: ".$row->paginaID."<br />\n");
        return $row;
    }


    //Functie om een aantal rijen op te halen uit de database.
    function getRowsAsObjectArray()
    {


        $rows = array();
        while ($row = mysqli_fetch_object($this->dbResult)){
            $rows[] = $row;
        }

        return $rows;

    }


    //Functie om een fout optehalen.
    function getErrors(){
        $retHtml = "<div class=\"errorDialog\">{$this->dbError}<br />\n{$this->dbErrno}</div>\n";
        return $retHtml;
    }

    //Functie om de databse verbinding te sluiten.
    function __destruct()
    {

        try{
            $this->dbResult = null;
            mysqli_close($this->dbConnection);
        }

        catch(Exception $e){
            throw new Exception($e->getMessage());
        }
    }
}

?>


dan krijg ik dit te zien

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Warning: mysqli_select_db() expects exactly 2 parameters, 1 given in mysql.class.php on line 30

Fatal error: Uncaught Exception: <div class="errorDialog"><br /> 0</div> in mysql.class.php:33 Stack trace: #0 index.php(14): mysqlclass->__construct(Object(htmlWriter)) #1 {main} thrown in mysql.class.php on line 33
Gewijzigd op 14/07/2019 17:29:37 door Kim Kim
 
- Ariën -
Beheerder

- Ariën -

14/07/2019 18:32:50
Quote Anchor link
Je mist je connectie in je mysqli_select_db
 
Thomas van den Heuvel

Thomas van den Heuvel

14/07/2019 19:22:00
Quote Anchor link
Er klopt echt geen biet van die class.

Leuk dat je alles in try-catch blokken zet, maar lang niet alles genereert automatisch exceptions als er dingen misgaan.

fetch_array() retourneert een enkel record, dus ik zie niet helemaal waarom je vervolgens het hele resultaat (met mogelijk resterende nog op te halen rijen) wegkiepert? Daarnaast retourneert dit zowel een genummerd alsook een associatieve indexering. Kies een van beide. Los daarvan, dit betreft resultsets, en geen database(connectie)s, dus dit zou je -zoals al eerder aangehaald- voor de goede orde in een aparte class moeten regelen.

Gewoon naar de prullenbak slepen dit geval.
 
Kim Kim

Kim Kim

14/07/2019 22:29:37
Quote Anchor link
Als dit de prullenbak in gaat dan krijg ik weer een andere problemen, dan is het beter om huidige fouten op te lossen of denk ik verkeerd er over?
 
- Ariën -
Beheerder

- Ariën -

14/07/2019 22:33:49
Quote Anchor link
Toch vraag ik me af wat de reden is van deze class, en waarom de standaard class van MySQLi tekort schiet?
Een gemiddelde site heeft daar al voldoende aan, en als je functionaliteit mist (queries tellen bijv.), dan kan je die altijd bouwen door de MySQLi-class te extenden.

Eventueel kan je een wrapper-class bouwen die alle databasefuncties en objecten verpakt, zodat je later makkelijk een overstap of upgrade kan maken. Maar zelf betwijfel ik of het waardevol is, gezien je de bouw extra tijd kost dan het oplevert, en een beetje editor voldoende tools hebben om dit aan te passen.
Maar voor wie zich er prettig bij voelt: Ga je gang.
Gewijzigd op 14/07/2019 22:34:12 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

14/07/2019 23:40:40
Quote Anchor link
- Ariën - op 14/07/2019 22:33:49:
Eventueel kan je een wrapper-class bouwen die alle databasefuncties en objecten verpakt, zodat je later makkelijk een overstap of upgrade kan maken. Maar zelf betwijfel ik of het waardevol is, gezien je de bouw extra tijd kost dan het oplevert, en een beetje editor voldoende tools hebben om dit aan te passen.

Als de wrapper geen toegevoegde waarde heeft dan zou ik zeggen dat het bovenstaande opgaat. Maar als deze wel toegevoegde waarde heeft dan verdient het zijn tijd ook weer terug op den duur. Dit hoeft ook helemaal niet uitgebreid of ingewikkeld te zijn.

Indien de wrapper niets toevoegt kun je net zo goed de standaard functionaliteit gebruiken, maar...

Daarnaast lijk je nog een ander aspect te vergeten. Een wrapper is precies dat: een andere, en hopelijk, generiekere, manier om hetzelfde te doen. Een wrapper centraliseert code die specifieke taken vervult. Nu de support voor mysql weg begint te vallen doordat men de overstap naar PHP 7 maakt is iedereen hals over kop alles aan het omzetten van mysql naar mysqli.

Als je gewoon alles zou searchen en replacen bega je eigenlijk een grote fout. Je bent dan namelijk de hard coding van database oplossing A aan het vervangen door een haast exact gelijkende hard coding van database oplossing B. Had je voor je mysql connectie ook een wrapper gebruikt, dan hoefde je in het gunstigste geval enkel de implementatie van de wrapper aan te passen - je hoeft dan slechts een paar bestanden te doorlopen, in plaats van je complete codebase. Uiteraard moet je dan alles nog wel even testen. En uiteraard is een wrapper geen volledige ontkoppeling van je database-oplossing, maar het voorkomt wel hard coding.

En wie zegt dat mysql -> mysqli de laatste omzetting was in mysql-land? Een ezel stoot zich in het algemeen...
Gewijzigd op 15/07/2019 15:32:26 door Thomas van den Heuvel
 
- Ariën -
Beheerder

- Ariën -

15/07/2019 17:18:18
Quote Anchor link
Maar op het moment dat er een nieuwe PHP-versie uitkomt met nodige mysqli-functie-wijzigingen, dan is er vaak nog meer nodig dan enkel wat mysqli-functies aanpassen. In mijn ogen is een 'search & replace' een goede oplossing. Uiteraard wel rekeninghoudend met de afhandeling van de functies en foutafhandeling. Daarom doe je je dit liever niet volledig geautomatiseerd.

Het ligt echt aan hoe groot je codebase is. Als je een framework gebruikt zoals Symfony, CI, Zend, Laravel of wat dan ook, dan hoef je enkel een configuratieding aan te passen. Mits je dit het framework natuurlijk op-to-date houdt.

In mijn ogen voldoet voor een standaard-site de standaard MySQLi-class die je kan extenden al prima.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/07/2019 17:35:37
Quote Anchor link
Quote:
Maar op het moment dat er een nieuwe PHP-versie uitkomt met nodige mysqli-functie-wijzigingen, dan is er vaak nog meer nodig dan enkel wat mysqli-functies aanpassen

Niet als je in je wrapper definieert wat voor taken je wilt uitvoeren op je database. Deze taken zijn vrij universeel. Als je wrapper goed in elkaar zit is het werk minimaal.
Quote:
In mijn ogen is een 'search & replace' een goede oplossing.

Mja als je frequentie en omvang buiten beschouwing laat. Wat als al je projecten op deze manier in elkaar zitten? Good luck.
Quote:
Daarom doe je je dit liever niet volledig geautomatiseerd.

Dat betekent handwerk. Dan zou ik, hands down, elke keer gaan voor het vervangen van een wrapper(implementatie).
Quote:
Het ligt echt aan hoe groot je codebase is. Als je een framework gebruikt zoals Symfony, CI, Zend, Laravel of wat dan ook, dan hoef je enkel een configuratieding aan te passen. Mits je dit het framework natuurlijk op-to-date houdt.

Dat mag ik ook hopen. Een framework biedt de meeste bouwstenen kant en klaar aan. Dan ga ik er vanuit dat deze zo in elkaar zitten dat de specificatie van functionaliteit niet ineens verandert op het moment dat een onderliggende technologie verandert.
Quote:
In mijn ogen voldoet voor een standaard-site de standaard MySQLi-class die je kan extenden al prima.

Als je alleen maar bakstenen programmeert waar je vervolgens nooit meer naar omkijkt is dit inderdaad prima.

Maar hard coding is nooit een goed ontwerpprincipe. Dit zou je dus moeten vermijden.
 
- Ariën -
Beheerder

- Ariën -

15/07/2019 17:43:39
Quote Anchor link
Een codebase kan je altijd uitbouwen zodat je minimaal onderhoud hoeft te plegen, maar geen enkele source zal voor 100% daar aan voldoen, en er zijn altijd punten die beter kunnen. Maar ik ben het wel met je eens dat hardcoding niet netjes is.
 



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.