Van MySQL naar MySQLi

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mobile App Developer / Logistieke Sector / React N

Functieomschrijving Ben jij een ervaren Mobile App Developer, werk jij graag met de nieuwste technieken en lijkt het jou gaaf om te werken aan een complexe mobiele applicatie voor de grootste logisitieke spelers in binnen- en buitenland? Lees dan snel verder! Het ontwikkelen van een zeer complexe mobiele applicatie in React Native voor de logistieke sector; Ondersteunend en uitvoerend in de transitie van Cordova/Phonegap naar React Native; Het geheel vernieuwen van het visuele gedeelte van de mobiele applicatie; Het werken aan nieuwe domeinen en functionaliteiten van de mobiele applicatie; Refactoring; Jezelf up-to-date houden m.b.t. nieuwe technieken. Jij durft deze ook

Bekijk vacature »

.NET C# web developer gezocht, inhouse project dev

Ben je een ervaren .NET C# web developer en op zoek naar een leuke baan in het zuiden van Zuid-Holland? Een inhouse functie maar met de afwisseling van verschillende projecten en klanten? Projecten die uitdagend zijn door de complexiteit van de systemen? Lees dan verder! Voor een bedrijf in Goeree-Overflakkee zijn we momenteel op zoek naar een ervaren .NET C# web developer. Het bedrijf bestaat uit iets meer dan 20 werknemers en verschillende ervaren software developers. De software projecten zijn uiteenlopend, maar altijd maatwerk oplossingen en veelal complex en bedrijfskritisch van karakter. De bedrijven waarvoor je software ontwikkeld kunnen variëren

Bekijk vacature »

Fullstack .Net (Core)/C# Developer zet zich in voo

Voor een organisatie gespecialiseerd in het ontwikkelen van software voor dierenartspraktijken ben ik op zoek naar Fullstack .Net (Core)/ C# Developers. De organisatie, 15 jaar geleden opgericht heeft een internationale klantenkring met meer dan 10.000 praktijken. Er hangt een nuchtere en familiaire sfeer, waar je je snel in thuis zal voelen. In 3 Scrum teams wordt er gewerkt aan her/doorontwikkeling van de dierenartspraktijksoftware en aanverwante tools. Je focus ligt bij het design, programmeren, unit testen en deployen van van nieuwe functionaliteiten. Waarbij je voor 80% bezig bent in de backend en 20% in de frontend. Wat moet je kunnen? -

Bekijk vacature »

Mobile App Developer

Ons Mobile ontwikkelteam zoekt een fanatieke Mobile App Developer. Ben jij creatief en heb je passie voor het ontwikkelen van apps? Dan zijn wij op zoek naar jou! Jouw baan ChipSoft heeft al diverse apps uitgebracht en het aantal gebruikers hiervan neemt snel toe. De apps doen het erg goed bij de zorginstellingen. Je kunt hierbij denken aan apps verpleegkundigen, thuiszorgmedewerkers, de logistieke dienst en - natuurlijk - de artsen zelf. Door jouw hands-on mentaliteit, eigenwijsheid en technisch inzicht kun je nauwkeurig herbruikbare software schrijven. Die software sluit naadloos aan op onze ‘back end’ (HiX, onze ICT-totaaloplossing voor de zorg).

Bekijk vacature »

PHP developer voor Agile team nabij Eindhoven

Functieomschrijving In deze PHP functie werk je samen met je collega's aan verschillende projecten. Hierbij werken ze in sprints en krijg je regelmatig met elkaar de mogelijkheid om nieuwe technieken en tools te ontdekken. Je bent zelf verantwoordelijk voor de ontwikkeling van je eigen deel en draagt hier zorg voor uiteraard ook de code standaarden, reviews en GIT vanzelfsprekend. Uitdagende mogelijkheden zijn onder andere semantic versioned webservices, formulieren en rekenregels. Momenteel zijn ze bezig met kunstmatige intelligentie. Ze willen namelijk graag dat het systeem uit zichzelf dingen gaat leren herkennen en toepassen. Dit vereist vele uren werk en overleg en

Bekijk vacature »

Full-Stack Web Developer

Kennis van C#, JavaScript, CSS en HTML5? En wil je die kennis inzetten om de zorg te verbeteren met slimme en innovatieve online portalen? Jouw baan Als Full-Stack Web Developer programmeer jij zowel front-end als back-end en ontwikkel je nieuwe functionaliteiten in het webportaal voor zorgverleners of patiënten. Denk hierbij aan vragenlijsten, labuitslagen en het bewerken van persoonsgegevens. Ook stort jij je vol overgave op lastige vraagstukken die binnenkomen via onze consultants. Samen met je team bedenk en bespreek je oplossingen en voer je code-reviews uit om elkaar naar een nóg hoger niveau te tillen. Jouw team Ons team? Work

Bekijk vacature »

IoT Start-up embedded C developer

Functieomschrijving Onze API stelt grote bedrijven als PostNL in staat om pakketten en boodschappen te bezorgen wanneer u niet thuis bent en zorgt ervoor dat u persoonlijk wordt ontvangen. We zijn op zoek naar een embedded software engineer die verantwoordelijk is voor het ontwerpen en bouwen van een veilige firmware voor onze IoT producten. Je werkt in nauwe samenwerking met drie collega's: een mobiele iOS-ontwikkelaar, een mobile ontwikkelaar voor Android en een ontwikkelaar van elektronica / embedded. Een aantal taken die jij als embedded C developer gaat uitvoeren: - Ontwerp en ontwikkeling van de firmware; - Bouwen van betrouwbare communicatie

Bekijk vacature »

Senior .NET developer / C# / Azure / Zorg

Functieomschrijving Ben jij een Senior .NET Developer met minimaal 5 jaar ervaring? Coach jij graag andere .NET ontwikkelaar en zorg jij ervoor dat je samen met je team het uiterste haalt uit de techniek? Dan is deze functie perfect voor jou! Programmeren van high-availability en high-security applicaties in C#; Overleggen met de informatie analisten en testers; Ontwikkelen van webservices (WCF); Coachen van andere ontwikkelaars; Begeleiden van het team, Product Owner en Stakeholders; Waarborgen van de SCRUM principes; Wegnemen van impediments voor het team; 20% van je tijd besteden aan innovatie; Deelnemen aan projecten om nieuwe ketenpartijen toe te voegen; Bouwen

Bekijk vacature »

.NET Developer Medicatie / Apotheek

Jij krijgt een kick van het ontwikkelen van complexe software. Voor onze vestiging in Hoogeveen zoeken wij een .NET Developer Medicatie / Apotheek die graag met de laatste Microsoft-tools en -technieken wilt werken, interessant? Jouw baan Je bent verantwoordelijk voor het ontwerpen, ontwikkelen, ondersteunen en onderhouden van de module Medicatie / Logistiek & Apotheek. Je gaat nauw samen werken met zowel interne als externe klant om nieuwe functionaliteiten te ontwikkelen om onze klanten te ondersteunen in hun werkproces. Het gaat om complexe ICT-producten die feilloos moeten functioneren binnen de complexe omgeving van een zorgorganisatie. ChipSoft maakt gebruik van een zelf

Bekijk vacature »

Software Developer Zorg-ICT

Het aannemen van nieuwe medewerkers loopt door en je kunt gewoon solliciteren. Uiteraard hanteren we hierbij de RIVM richtlijnen en is onze sollicitatieprocedure aangepast. Impact maken in de zorg door zorginstellingen te ondersteunen met slimme ICT is dagelijkse kost bij ChipSoft. Juist nu maar ook na de coronacrisis! Wil jij met ChipSoft impact maken in de zorg met jouw technische kennis als Software Developer Zorg-ICT? En lijkt het jou uitdagend om innovatieve software te ontwikkelen met de laatste Microsoft-tools en technieken? Wat doe jij als Software Ontwikkelaar? Je bent verantwoordelijk voor het ontwerpen, ontwikkelen, ondersteunen en onderhouden van jouw eigen

Bekijk vacature »

Cloud Software Developer

Als Cloud Software Developer ga je aan de slag met onze SaaS-dienst Zorgplatform. Voor de ontwikkeling hiervan gebruiken wij Microsoft technologie. Zie jij dit als een uitdaging? Lees dan verder! Jouw baan Als Cloud Software Developer ga je werken aan ons Zorgplatform. Dit is een veilige service die uitgebreide ondersteuning biedt voor transmurale samenwerking. Wij ontwikkelen dit in C# in een ASP.NET Core framework. Je gaat aan de slag met het opzetten van microservices voor de verschillende processen die Zorgplatform ondersteunt. Je maakt bijvoorbeeld de integratie voor het inkijken van het medisch dossier mogelijk aan de hand van toelatingen, geregistreerd

Bekijk vacature »

Fullstack Developer (Front-end, Java/Python)

Dutch Speaking Full-stack Developer Are you a highly technically skilled software developer looking for a challenging role in Utrecht area? Do you have knowledge of front-end and back-end technologies and speak fluently Dutch? Do you want to join a close-knit club of enthusiastic engineers? I’m looking for someone who… Is a polyglot having an extensive experience with Java, Kotlin, Scala, Akka, Spring, Maven, JavaScript, HTML, CSS and modern front-end frameworks Is experienced with open source technologies, Jenkins and Docker Can learn quickly, takes responsibility and has “doing it right” attitude Who is interested in… Being responsible for challenging assignments of

Bekijk vacature »

.NET Developer vacature bij fijn informeel bedrijf

Functieomschrijving Als .NET developer kom je aan de "full stack" te werken wat betekent dat je zowel backend werkzaamheden zal uitvoeren (ASP.NET / C#) en ook aan de voorkant je goed weet te redden middels JavaScript, HTML en CSS. Zoals in de eerdere tekst vermeld gaat het om een eigen ontwikkeld product dat je in een hecht team gaat doorontwikkelen. Mocht je meer willen weten over de functie en organisatie neem dan contact met ons op per mail of telefoon, in een kort telefonisch gesprek leggen we graag precies uit hoe je werkweek eruit ziet en wat je verder kunt

Bekijk vacature »

Junior/Medior PHP Developer

Junior/Medior PHP Developer Startdatum Per direct Regio Regio Roermond Dienstverband Fulltime, 32-40 uur Het gaat om een structurele baan op basis van werving en selectie waarbij je direct bij onze opdrachtgever op contract gaat. Beschrijving organisatie: Onze opdrachtgever ontwikkelt inmiddels al bijna 15 jaar websites, -shops en -applicaties voor klanten door het hele land in veel verschillende branches. Dit doen ze met een gezellig, enthousiast en gedreven team. Functie omschrijving: Heb jij zin om mee te denken en werken aan gave innovatieve webapplicaties? Om mee te helpen om onze websites en -shops nog beter te maken? Websites, -shops en webapps

Bekijk vacature »

Java Developer voor mooie opdrachten

Functieomschrijving Je gaat werken aan complexe projecten waarbij er veel gevraagd gaat worden van je technische inzicht. Dit zal je gaan doen voor verschillende opdrachtgevers bij jou in de regio. Als je echt beter wilt worden als Javaan dan zit je hier op de juiste plek, als Java Ontwikkelaar word je hier namelijk intern opgeleid en zal je verdere framework kennis mogen opdoen, een ideale functie dus wanneer je graag met Java aan de slag wilt gaan en veel wilt leren. Ervaring met Spring is een wens vanuit de organisatie aangezien ze hier zelf veel mee werken. Frameworks als Hibernate

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

27/05/2020 18:28:51
 
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.