MySQL: Aan de slag
Hoe te beginnen met MySQL
👋 Welkom bij de Stackhero documentatie!
Stackhero biedt een kant-en-klare MySQL cloud oplossing die tal van voordelen biedt, waaronder:
- Onbeperkte verbindingen en overdrachten.
- phpMyAdmin webinterface inbegrepen.
- Moeiteloze updates met slechts één klik.
- Optimale prestaties en robuuste beveiliging aangedreven door een privé en toegewijde VM.
Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de MySQL cloud hosting oplossing van Stackhero te proberen!
MySQL URL's
De eenvoudigste manier om verbinding te maken met uw MySQL-service is door het MySQL URL-formaat te gebruiken als uw driver dit ondersteunt:
mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
Voor Ruby-gebruikers is het MySQL URL-formaat iets anders:
mysql2://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?reconnect=true&useSSL=true&requireSSL=true
MySQL gebruiken met PHP
MySQL gebruiken met PHP en MySQLi (objectgeoriënteerde stijl)
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // We raden aan om de "root" database niet te gebruiken. Dit voorbeeld is alleen voor demonstratiedoeleinden. De beste praktijk is om een speciale database en gebruiker aan te maken in phpMyAdmin en deze hier te gebruiken.
$mysqli = mysqli_init();
$mysqliConnected = $mysqli->real_connect($hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
die("Verbindingsfout: " . $mysqli->connect_error);
}
echo 'Verbinding succesvol... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>
MySQL gebruiken met PHP en MySQLi (procedurele stijl)
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // We raden aan om de "root" database niet te gebruiken. Dit voorbeeld is alleen voor demonstratiedoeleinden. Het is beste praktijk om een speciale database en gebruiker aan te maken in phpMyAdmin en deze hier te gebruiken.
$mysqli = mysqli_init();
$mysqliConnected = mysqli_real_connect($mysqli, $hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
die("Verbindingsfout: " . mysqli_connect_error($mysqli));
}
echo 'Succes: ' . mysqli_get_host_info($mysqli) . "\n";
mysqli_close($mysqli);
?>
MySQL gebruiken met PHP en PDO
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // We raden aan om de "root" database niet te gebruiken. Dit is alleen voor demonstratiedoeleinden. De beste praktijk is om een speciale database en gebruiker aan te maken in phpMyAdmin en deze hier te gebruiken.
$dsn = "mysql:host=$hostname;port=$port;dbname=$database";
$options = array(
// Als u een fout tegenkomt zoals "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed",
// zorg ervoor dat de map /etc/ssl/certs/ CA-certificaten bevat.
// Zie hieronder voor meer informatie.
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
// PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
);
$pdo = new PDO($dsn, $user, $password, $options);
$stm = $pdo->query("SELECT VERSION()");
$version = $stm->fetch();
echo "U bent verbonden met een database die versie " . $version[0] . " draait\n";
?>
Fout "SSL operation failed with code 1" oplossen
Als u de fout tegenkomt:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
is dit waarschijnlijk omdat de map /etc/ssl/certs/ geen CA-certificaten bevat.
Als u toegang heeft tot het systeem dat uw PHP-code uitvoert, kunt u deze certificaten als volgt installeren:
- Op Ubuntu/Debian, voer
sudo apt-get install ca-certificatesuit - Op Alpine Linux, voer
apk add ca-certificatesuit
Als u geen directe toegang heeft tot het systeem dat uw PHP-code uitvoert, kunt u het certificaat handmatig installeren:
- Download het certificaat naar uw computer: https://letsencrypt.org/certs/isrgrootx1.pem
- Voeg het bestand
isrgrootx1.pemtoe aan uw PHP-projectbestanden. - Comment de regel
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'uit - Uncomment de regel
PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'
Fout "Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH" oplossen
Als u de fout tegenkomt:
Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH
of een vergelijkbaar bericht zoals:
Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_*
geeft dit aan dat PDO is geïnstalleerd zonder MySQL-ondersteuning.
Oplossing voor Ubuntu/Debian
Om dit op te lossen op Ubuntu- of Debian-gebaseerde systemen, installeert u de vereiste PHP MySQL-extensie door de volgende opdracht uit te voeren:
sudo apt-get install php-mysql
Oplossing voor Docker
Als u Docker gebruikt, zorg ervoor dat MySQL-ondersteuning is opgenomen tijdens het buildproces. Voeg de volgende regel toe aan uw Dockerfile:
RUN docker-php-ext-install pdo pdo_mysql
MySQL gebruiken met Symfony en Doctrine
Bewerk het .env bestand en definieer de DATABASE_URL variabele als volgt:
DATABASE_URL="mysql://<USER>:<PASSWORD>@XXXXXX.stackhero-network.com:<PORT>/<DATABASE>"
Bewerk vervolgens het config/packages/doctrine.yaml bestand en stel de driver en opties in als volgt:
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_mysql'
options:
# PDO::MYSQL_ATTR_SSL_CAPATH
1010: '/etc/ssl/certs'
# PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
1014: true
Fout "SSL operation failed with code 1" oplossen
Als u de fout ontvangt:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
is dit waarschijnlijk omdat de map /etc/ssl/certs/ geen CA-certificaten bevat.
Als u toegang heeft tot het systeem dat uw PHP-code uitvoert, kunt u deze certificaten als volgt installeren:
- Op Ubuntu/Debian, voer
sudo apt-get install ca-certificatesuit - Op Alpine Linux, voer
apk add ca-certificatesuit
Als u geen directe toegang heeft tot het systeem, kunt u het certificaat handmatig installeren:
- Download het certificaat naar uw computer: https://letsencrypt.org/certs/isrgrootx1.pem
- Voeg het bestand
isrgrootx1.pemtoe aan uw Symfony-project. - Bewerk het
config/packages/doctrine.yamlbestand en stel de driver en opties in als volgt:
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_mysql'
options:
# PDO::MYSQL_ATTR_SSL_CA
1009: 'isrgrootx1.pem'
# PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
1014: true
MySQL gebruiken met Laravel
Bewerk het bestand config/database.php en vervang de mysql-configuratie door de volgende instellingen:
'mysql' => [
'driver' => 'mysql',
'host' => env('STACKHERO_MYSQL_HOST'),
'port' => env('STACKHERO_MYSQL_PORT'),
'username' => env('STACKHERO_MYSQL_USER'),
'password' => env('STACKHERO_MYSQL_PASSWORD'),
'database' => env('STACKHERO_MYSQL_USER'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'sslmode' => 'require',
'options' => extension_loaded('pdo_mysql')
? array_filter([
// Als u een fout tegenkomt zoals "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed",
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/',
// PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
])
: [],
],
MySQL gebruiken met PHP CodeIgniter
Voeg in het database.php bestand de volgende configuratie toe:
$db['default'] = array(
'hostname' => getenv('STACKHERO_MYSQL_HOST'),
'port' => getenv('STACKHERO_MYSQL_PORT'),
'username' => getenv('STACKHERO_MYSQL_USER'),
'password' => getenv('STACKHERO_MYSQL_PASSWORD'),
'database' => getenv('STACKHERO_MYSQL_USER'), // Volgens conventie heeft de database dezelfde naam als de gebruiker.
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => true,
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'encrypt' => array() // Belangrijk: activeer TLS-encryptie
);
MySQL verbinden met PHP met behulp van omgevingsvariabelen
Het is een beste praktijk om uw inloggegevens niet in uw broncode op te slaan, maar in plaats daarvan omgevingsvariabelen te gebruiken.
Hieronder staat een voorbeeld voor het ophalen van deze inloggegevens:
$hostname = getenv('STACKHERO_MYSQL_HOST');
$port = getenv('STACKHERO_MYSQL_PORT');
$user = getenv('STACKHERO_MYSQL_USER');
$password = getenv('STACKHERO_MYSQL_PASSWORD');
$database = getenv('STACKHERO_MYSQL_USER'); // Volgens conventie heeft de database dezelfde naam als de gebruiker.
MySQL gebruiken met WordPress
Het verbinden van WordPress met Stackhero voor MySQL is eenvoudig. Bewerk gewoon het wp-config.php bestand en configureer de database als volgt:
define('DB_HOST', '<XXXXXX>.stackhero-network.com');
define('DB_PORT', '<PORT>');
define('DB_NAME', 'root');
define('DB_USER', 'root');
define('DB_PASSWORD', '<yourPassword>');
// Gebruik TLS-encryptie (ook bekend als SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
Het belangrijke deel hier is de activering van TLS-encryptie (ook bekend als SSL). Zonder dit zal de verbinding niet werken.
MySQL gebruiken met Node.js
MySQL X-protocol gebruiken (xdevapi package)
In dit voorbeeld gebruiken we het officiële xdevapi package om het MySQL X-protocol te benutten. Om het te installeren, voert u uit:
npm install @mysql/xdevapi
Hieronder staat een compleet voorbeeld dat xdevapi gebruikt:
const mysqlx = require('@mysql/xdevapi');
(async () => {
// Verbind met MySQL met behulp van MySQL X Protocol
const session = await mysqlx.getSession({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// Maak een schema (database) als het niet bestaat
const schemaExists = await session.getSchema('stackherotest').existsInDatabase();
if (!schemaExists) {
await session.createSchema('stackherotest');
}
// Maak tabel 'users' als deze niet bestaat
const tableExists = await session
.getSchema('stackherotest')
.getTable('users')
.existsInDatabase();
if (!tableExists) {
await session
.sql('CREATE TABLE `stackherotest`.`users` '
+ '('
+ '`userId` INT UNSIGNED NOT NULL,'
+ '`name` VARCHAR(128) NOT NULL,'
+ '`address` TEXT NOT NULL,'
+ '`email` VARCHAR(265) NOT NULL'
+ ') '
+ 'ENGINE = InnoDB;')
.execute();
}
// Voeg een fictieve gebruiker toe
await session
.getSchema('stackherotest') // Databasenaam
.getTable('users') // Tabelnaam
.insert('userId', 'name', 'address', 'email') // Kolomnamen
.values(
Math.round(Math.random() * 100000), // Genereer een fictieve userId
'Gebruikersnaam', // kolom 'name'
'Gebruikersadres', // kolom 'address'
'user@email.com' // kolom 'email'
)
.execute();
// Tel het aantal rijen in tabel 'users'
const usersCount = await session
.getSchema('stackherotest') // Databasenaam
.getTable('users')
.count();
console.log(`Er zijn nu ${usersCount} items in de tabel "users"`);
// Sluit de verbinding met MySQL
await session.close();
})().catch(error => {
console.error('');
console.error('🐞 Er is een fout opgetreden!');
console.error(error);
process.exit(1);
});
MySQL-protocol gebruiken (MySQL2 package)
In dit voorbeeld gebruiken we het mysql2 package met ondersteuning voor promises. Om het te installeren, voert u uit:
npm install mysql2
const mysql = require('mysql2/promise');
(async () => {
const db = await mysql.createConnection({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// Maak database 'stackherotest' als deze nog niet bestaat
await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');
// Maak tabel 'users' als deze nog niet bestaat
await db.query('CREATE TABLE IF NOT EXISTS `stackherotest`.`users` '
+ '('
+ '`userId` INT UNSIGNED NOT NULL,'
+ '`name` VARCHAR(128) NOT NULL,'
+ '`address` TEXT NOT NULL,'
+ '`email` VARCHAR(265) NOT NULL'
+ ') '
+ 'ENGINE = InnoDB;');
// Voeg een fictieve gebruiker toe
await db.query(
'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
[
[
Math.round(Math.random() * 100000), // Genereer een fictieve userId
'Gebruikersnaam', // kolom 'name'
'Gebruikersadres', // kolom 'address'
'user@email.com' // kolom 'email'
]
]
);
// Tel het aantal rijen in tabel 'users'
const [ usersCount ] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
console.log(`Er zijn nu ${usersCount[0].cpt} items in de tabel "users"`);
// Sluit de verbinding met MySQL
await db.end();
})().catch(error => {
console.error('');
console.error('🐞 Er is een fout opgetreden!');
console.error(error);
process.exit(1);
});
MySQL gebruiken met Node.js, NestJS of TypeORM
Om verbinding te maken vanuit Node.js, NestJS of TypeORM, voegt u de ssl optie toe zoals getoond in dit voorbeeld:
TypeOrmModule.forRoot({
type: 'mysql',
host: '<XXXXXX>.stackhero-network.com',
port: <PORT>,
username: 'root',
password: '<ROOT_PASSWORD>',
database: 'root',
entities: [],
synchronize: true,
ssl: {}
});
MySQL gebruiken met Prisma
Om verbinding te maken met Prisma, voegt u de optie sslaccept=strict toe om ervoor te zorgen dat SSL-encryptie is ingeschakeld. Hier is een voorbeeld met de gebruiker "root" en verbinding maken met de database "root":
datasource db {
provider = "mysql"
url = "mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?sslaccept=strict"
}
MySQL gebruiken met Django
Als de mysqlclient module nog niet is geïnstalleerd, installeer deze dan omdat deze zal worden gebruikt om verbinding te maken met MySQL:
pip install mysqlclient
Als u de fout
Exception: Can not find valid pkg-config nametegenkomt bij het installeren vanmysqlclient, installeer dan hetlibmysqlclientpakket. Op Ubuntu/Debian kunt u uitvoeren:apt-get update && apt-get install --no-install-recommends -y libmysqlclient-dev
In deze eerste stap wordt het wachtwoord direct in het settings.py bestand opgeslagen voor testdoeleinden. Het wordt aanbevolen om een veiligere aanpak te gebruiken zoals later in deze documentatie beschreven.
Open het bestand settings.py en voeg het volgende toe:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '<XXXXXX>.stackhero-network.com',
'PORT': '<PORT>',
'OPTIONS': {
'ssl_mode': 'REQUIRED',
},
'NAME': 'root',
'USER': 'root',
'PASSWORD': '<ROOT_PASSWORD>'
}
}
Let op: dit voorbeeld wordt niet aanbevolen voor productie en is alleen bedoeld voor testdoeleinden!
Zodra de verbinding succesvol is, kunt u de aanbevolen methode gebruiken om inloggegevens veilig op te slaan. In dit voorbeeld wordt django-environ gebruikt om omgevingsvariabelen te beheren.
Installeer eerst django-environ met de opdracht:
pip install django-environ
Open vervolgens het settings.py bestand en voeg het volgende toe:
import environ
env = environ.Env()
environ.Env.read_env()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': env('STACKHERO_MYSQL_HOST'),
'PORT': env('STACKHERO_MYSQL_PORT'),
'OPTIONS': {
'ssl_mode': 'REQUIRED',
},
'NAME': 'root',
'USER': 'root',
'PASSWORD': env('STACKHERO_MYSQL_ROOT_PASSWORD')
}
}
Open of maak vervolgens het .env bestand in dezelfde map als settings.py en voeg het volgende toe:
STACKHERO_MYSQL_HOST=<XXXXXX>.stackhero-network.com
STACKHERO_MYSQL_PORT=<PORT>
STACKHERO_MYSQL_ROOT_PASSWORD=<ROOT_PASSWORD>
Voeg ten slotte .env toe aan uw .gitignore bestand om ervoor te zorgen dat uw inloggegevens niet worden gecommit naar uw Git-repository:
echo ".env" >> .gitignore
MySQL verbinden met Java/Spring
Om uw Spring-applicatie te verbinden, stelt u de omgevingsvariabele SPRING_DATASOURCE_URL in met uw database-URL, voorafgegaan door jdbc::
SPRING_DATASOURCE_URL=jdbc:mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
MySQL verbinden met Groovy/Grails
Het volgende voorbeeld laat zien hoe u uw Grails-applicatie met MySQL kunt verbinden:
dataSource {
pooled = true
driverClassName = "com.mysql.cj.jdbc.Driver"
dialect = org.hibernate.dialect.MySQL8Dialect
// SSL-specifieke eigenschappen
properties {
useSSL = true
requireSSL = true
verifyServerCertificate = true
sslMode = "REQUIRED"
}
}
environments {
production {
dataSource {
dbCreate = "none"
url = "jdbc:mysql://" + System.env.STACKHERO_MYSQL_HOST + ":" + System.env.STACKHERO_MYSQL_PORT + "/root?useSSL=true&requireSSL=true&verifyServerCertificate=true&sslMode=required" // Vervang "/root" door de database waarmee u verbinding wilt maken.
username = "root" // Het is raadzaam om een speciale gebruiker aan te maken in plaats van de "root" inloggegevens te gebruiken.
password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Het is raadzaam om een speciale gebruiker aan te maken in plaats van de "root" inloggegevens te gebruiken.
properties {
maxActive = 50
minEvictableIdleTimeMillis = 1800000
timeBetweenEvictionRunsMillis = 1800000
numTestsPerEvictionRun = 3
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
validationQuery = "SELECT 1"
}
}
}
}
Een gebruiker aanmaken op MySQL met phpMyAdmin
Een goede praktijk is om een speciale gebruiker voor uw applicatie aan te maken in plaats van de "root" gebruiker te gebruiken.
De eenvoudigste manier om dit te doen is via phpMyAdmin.
-
Klik in phpMyAdmin bovenaan op
User accounts.
-
Klik op
Add user account.
-
Vul het gebruikersaanmaakformulier in:
- Kies een accountnaam (meestal de naam van uw applicatie)
- Klik op
Generate passwordom een veilig wachtwoord te maken (kopieer het naar uw klembord) - Vink de optie
Create database with same name and grant all privilegesaan
Zodra u het formulier valideert, wordt de nieuwe gebruiker aangemaakt samen met een overeenkomstige database die dezelfde naam deelt als de gebruikersnaam.