PHP kent de verouderde MySQL-functies, ook wel ext/mysql genoemd, sinds PHP 7 niet meer. Gebruikt jouw website nog mysql_connect()? Dan moet je overstappen naar MySQLi of PDO om je website te laten werken met nieuwe PHP-versies. In dit artikel lees je hoe je PHP-code ombouwt van mysql_connect() naar mysqli_connect(), en hoe je met MySQLi en PDO een beveiligde SSL-verbinding met je MySQL-database maakt.
Waarom moet ik ext/mysql converteren naar MySQLi?
Het omzetten van oude ext/mysql-functies naar MySQLi is belangrijk voor de upgrade naar PHP 7 en nieuwer. PHP 7 kent de verouderde ext/mysql-functies namelijk niet meer, en dan toont jouw website een foutmelding:
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in [bestand]
Of WordPress roept:
Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
In het Nederlands is dat: Het lijkt erop dat je PHP-installatie geen MySQL-extensie heeft en die is noodzakelijk om WordPress te kunnen gebruiken.
Maar: vaak ben je er zelf niet eens van op de hoogte dat je verouderde technieken op jouw website gebruikt. Als ik je zeg dat het om functies zoals mysql_connect(), mysql_select_db() en mysql_query() gaat, dan zegt dat je vast meer. Dat moet omgebouwd worden naar de MySQLi-equivalenten, om ervoor te zorgen dat je website blijft functioneren.
De i staat voor Improved; de MySQLi-extensie is een verbeterde versie van de ext/mysql-extensie.
In mijn Saotn.org-artikel Migrate PHP ext/mysql to MySQLi worden ext/mysql-functies geconverteerd naar MySQLi. Stapsgewijs én eenvoudig.
Als je geen PHP MySQL class gebruikt
“Als mijn website geen MySQL class gebruikt, is het artikel dan nog steeds bruikbaar?“
Stel dat je geen PHP class gebruikt voor de verbinding met jouw MySQL-database, maar dat je in ieder PHP-script dezelfde stukjes PHP-code herhaalt. Dan is het artikel nog steeds heel goed bruikbaar. Je moet alleen de relevante onderdelen eruit halen, en de betreffende PHP-code op meer plekken aanpassen.
Als in jouw PHP-scripts, in vrijwel ieder bestand, steeds het volgende naar voren komt:
<?php
$conn = mysql_connect("db-host","user","pass");
$db = mysql_select_db("db-name", $conn);
$result = mysql_query("SELECT * FROM `table`");
// ...
?>
Dan moet dit in ieder PHP-script aangepast worden naar:
<?php
$conn = mysqli_connect("db-host","user","pass","db-name");
$result = mysqli_query($conn, "SELECT * FROM `table`");
// ...
?>
Dat is nog wel te doen, toch? Als je dan toch bezig bent, bouw het gelijk om naar een PHP MySQLi class.
MySQLi-equivalenten voor ext/mysql
Het ombouwen van ext/mysql naar de MySQLi-extensie is best straightforward. Je moet alleen rekening houden met dat MySQLi – waar nodig – het connectie-object éérst wil, waar dat in ext/mysql vaak de tweede parameter was.
Je vindt hier een overzichtje met de meestgebruikte MySQLi-equivalenten van ext/mysql:
- mysql_connect: mysqli_connect
- mysql_select_db: – (wordt meegegeven in mysqli_connect)
- mysql_query: mysqli_query
- mysql_num_rows: mysqli_num_rows
- mysql_fetch_assoc: mysqli_fetch_assoc
- mysql_fetch_row: mysqli_fetch_row
- mysql_fetch_array: mysqli_fetch_array
- mysql_affected_rows: mysqli_affected_rows
- mysql_insert_id: mysqli_insert_id
- mysql_free_result: mysqli_free_result
- mysql_get_server_info: mysqli_get_server_info
- mysql_close: mysqli_close
- mysql_real_escape_string: mysqli_real_escape_string
MySQLi-verbinding met MySQL over SSL
Met PHP 7.1 en hoger kun je jouw MySQL-database over een SSL-beveiligde verbinding benaderen. Met MySQLi gebruik je hiervoor mysqli_options() en mysqli_real_connect().
Met mysqli_options() moet je MYSQLI_OPT_SSL_VERIFY_SERVER_CERT meegeven als optie, en true als waarde. In mysqli_real_connect() geef je dan ook nog eens MYSQLI_CLIENT_SSL mee:
<?php
define( 'DB_NAME', 'MySQL_databasenaam' );
define( 'DB_USER', 'MySQL_gebruikersnaam' );
define( 'DB_PASSWORD', 'MySQL_wachtwoord' );
define( 'DB_HOST', 'MySQL_servernaam' );
$db = mysqli_init();
mysqli_options( $db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true );
$link = mysqli_real_connect( $db, DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, 3306, NULL, MYSQLI_CLIENT_SSL );
PDO-verbinding met MySQL over SSL
Gebruik je liever PHP Data Objects (PDO) in plaats van MySQLi? Ook dan kun je de verbinding met MySQL beveiligen met SSL. In de array $instellingen plaats je de SSL-opties en de tekstcodering:
<?php
$dbserver = 'MySQL servernaam';
$dbnaam = 'MySQL databasenaam';
$dbgebruiker = 'MySQL gebruikersnaam';
$dbwachtwoord = 'MySQL wachtwoord';
$os = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
$instellingen = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::MYSQL_ATTR_SSL_CA => $os ? 'c:/vevida/cacert/cacert.pem' : '',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
);
try {
$verbinding = new PDO("mysql:host=" . $dbserver . ";dbname=" . $dbnaam, $dbgebruiker, $dbwachtwoord, $instellingen);
}
catch (PDOException $db_error) {
echo $db_error->getMessage();
}
Zie Cross-platform MYSQL_ATTR_SSL_CA usage in PHP op Saotn.org voor meer informatie over de regel met MYSQL_ATTR_SSL_CA in de code hierboven.
En MySQLi in WordPress?
En voor WordPress?
, vraag je je wellicht af. WordPress biedt vanaf versie 3.9 ondersteuning voor MySQLi. Sinds WordPress 4.4 is WordPress compatibel met PHP 7.
PHP & MySQL boekentips
Wil je beginnen met PHP en MySQL? Of juist er méér mee leren doen? Maak een goede start met één van deze (ebook) boeken!


Fijn om deze tutorial te lezen en te gebruiken
Dank je wel voor je reactie Stef, fijn te vernemen dat je de tutorial goed kon gebruiken :-)
Bedankt :)
Heel graag gedaan :)