MySQL: Aan de slag
Hoe u aan de slag gaat 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
Als u snel verbinding wilt maken met uw MySQL-service, kunt u het MySQL-URL-formaat gebruiken, mits uw driver dit ondersteunt:
mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
Als u met Ruby werkt, is het URL-formaat iets anders:
mysql2://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?reconnect=true&useSSL=true&requireSSL=true
MySQL gebruiken met PHP
MySQLi (objectgeoriënteerde stijl)
Hieronder vindt u een voorbeeld van het verbinden met MySQL via de MySQLi-extensie van PHP in objectgeoriënteerde stijl:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // In dit voorbeeld wordt de "root" database gebruikt, maar het is aan te raden om via phpMyAdmin een aparte database en gebruiker voor uw applicatie aan te maken.
$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();
?>
MySQLi (procedurele stijl)
Als u liever procedureel codeert, kunt u als volgt verbinding maken met MySQLi in procedurele stijl:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Voor optimale beveiliging: maak een aparte database en gebruiker aan in phpMyAdmin in plaats van "root" 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);
?>
PDO
Als u liever PDO gebruikt voor database-toegang, vindt u hier een voorbeeld van een verbinding:
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Het is het beste om een aparte database en gebruiker voor uw applicatie aan te maken.
$dsn = "mysql:host=$hostname;port=$port;dbname=$database";
$options = array(
// Als u SSL-gerelateerde fouten krijgt bij het verbinden, zorg er dan voor dat uw systeem over de juiste CA-certificaten beschikt (zie hieronder).
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 met versie " . $version[0] . "\n";
?>
Problemen oplossen: SSL operation failed with code 1
Als u een foutmelding krijgt zoals:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
Dan ontbreken waarschijnlijk CA-certificaten in /etc/ssl/certs/ op uw systeem.
Als u toegang heeft tot het systeem waar uw PHP-code draait, kunt u de certificaten als volgt installeren:
- Op Ubuntu/Debian:
sudo apt-get install ca-certificates - Op Alpine Linux:
apk add ca-certificates
Als u geen directe toegang heeft, kunt u het certificaat handmatig toevoegen:
- Download het certificaat: https://letsencrypt.org/certs/isrgrootx1.pem
- Plaats het bestand
isrgrootx1.pemin uw PHP-project. - Zet de regel
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/'in commentaar. - Haal de commentaar weg bij de regel
PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'
Problemen oplossen: undefined constant errors met PDO
Als u fouten ziet zoals:
Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH
of vergelijkbare meldingen, betekent dit dat PDO is geïnstalleerd zonder MySQL-ondersteuning.
- Op Ubuntu/Debian
U kunt de benodigde extensie installeren met:
sudo apt-get install php-mysql
- In Docker
Als u Docker gebruikt, zorg er dan voor dat MySQL-ondersteuning is toegevoegd tijdens de build. Voeg dit toe aan uw Dockerfile:
RUN docker-php-ext-install pdo pdo_mysql
### MySQL gebruiken met Symfony en Doctrine
Als u met Symfony en Doctrine werkt, kunt u uw verbinding als volgt configureren:
1. Bewerk uw `.env`-bestand en stel de variabele `DATABASE_URL` in:
DATABASE_URL="mysql://<USER>:<PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/<DATABASE>"
1. Stel vervolgens in `config/packages/doctrine.yaml` de driver en opties in:
```yaml
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
Problemen oplossen: SSL operation failed with code 1
Als u een foutmelding krijgt zoals:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
Dan ontbreken waarschijnlijk de CA-certificaten in de map /etc/ssl/certs/.
Als u toegang heeft tot het systeem, kunt u deze installeren met:
- Op Ubuntu/Debian:
sudo apt-get install ca-certificates - Op Alpine Linux:
apk add ca-certificates
Als u geen directe toegang heeft, kunt u het certificaat handmatig toevoegen:
- Download: https://letsencrypt.org/certs/isrgrootx1.pem
- Plaats
isrgrootx1.pemin uw Symfony-project. - Werk
config/packages/doctrine.yamlbij:
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
Om MySQL in Laravel te configureren, opent u config/database.php en past u het MySQL-gedeelte aan:
'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([
// Zie bovenstaande troubleshooting voor SSL-fouten.
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
In het configuratiebestand database.php kunt u het volgende toevoegen:
$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 komt de databasenaam overeen met de gebruiker.
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => true,
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'encrypt' => array() // Belangrijk: schakel TLS-encryptie in
);
Verbinden met omgevingsvariabelen in PHP
Het is over het algemeen veiliger om uw databasegegevens niet in uw code op te slaan. Gebruik in plaats daarvan omgevingsvariabelen. Zo haalt u ze op:
$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 komt de databasenaam overeen met de gebruiker.
MySQL gebruiken met WordPress
WordPress verbinden met Stackhero voor MySQL is eenvoudig. U hoeft alleen uw wp-config.php-bestand als volgt aan te passen:
define('DB_HOST', '<XXXXXX>.stackhero-network.com');
define('DB_PORT', '<PORT>');
define('DB_NAME', 'root');
define('DB_USER', 'root');
define('DB_PASSWORD', '<yourPassword>');
// Schakel TLS-encryptie in (ook bekend als SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
De belangrijkste stap hier is het inschakelen van TLS (SSL) encryptie. Zonder deze stap werkt uw verbinding niet zoals verwacht.
MySQL gebruiken met Node.js
MySQL X-protocol (xdevapi package)
Om het MySQL X-protocol te gebruiken, installeert u het officiële xdevapi-pakket:
npm install @mysql/xdevapi
Hieronder vindt u een voorbeeldscript:
const mysqlx = require('@mysql/xdevapi');
(async () => {
// Verbind met MySQL via het MySQL X-protocol
const session = await mysqlx.getSession({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// Maak het schema (database) aan als deze nog niet bestaat
const schemaExists = await session.getSchema('stackherotest').existsInDatabase();
if (!schemaExists) {
await session.createSchema('stackherotest');
}
// Maak de tabel 'users' aan als deze nog 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 voorbeeldgebruiker toe
await session
.getSchema('stackherotest')
.getTable('users')
.insert('userId', 'name', 'address', 'email')
.values(
Math.round(Math.random() * 100000),
'User name',
'User address',
'[email protected]'
)
.execute();
// Tel het aantal gebruikers
const usersCount = await session
.getSchema('stackherotest')
.getTable('users')
.count();
console.log(`Er staan nu ${usersCount} records in de tabel "users"`);
// Sluit de verbinding
await session.close();
})().catch(error => {
console.error('');
console.error('Er is een fout opgetreden!');
console.error(error);
process.exit(1);
});
MySQL-protocol (mysql2 package)
Als u de klassieke protocolvariant wilt gebruiken, kunt u het mysql2-pakket met promise-ondersteuning installeren:
npm install mysql2
Voorbeeld van gebruik:
const mysql = require('mysql2/promise');
(async () => {
const db = await mysql.createConnection({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// Maak de database aan indien nodig
await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');
// Maak de tabel aan indien nodig
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 voorbeeldgebruiker toe
await db.query(
'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
[
[
Math.round(Math.random() * 100000),
'User name',
'User address',
'[email protected]'
]
]
);
// Tel het aantal gebruikers
const [ usersCount ] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
console.log(`Er staan nu ${usersCount[0].cpt} records in de tabel "users"`);
// Sluit de verbinding
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, kunt u de optie ssl toevoegen zoals hieronder:
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
Als u Prisma gebruikt, zorgt het toevoegen van de optie sslaccept=strict voor een versleutelde verbinding. Voorbeeldconfiguratie:
datasource db {
provider = "mysql"
url = "mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?sslaccept=strict"
}
MySQL gebruiken met Django
Als u het mysqlclient-pakket nog niet heeft geïnstalleerd, doet u dat met:
pip install mysqlclient
Als u tijdens de installatie de foutmelding
Exception: Can not find valid pkg-config namekrijgt, moet u mogelijk het pakketlibmysqlclienttoevoegen. Op Ubuntu/Debian kan dit met:apt-get update && apt-get install --no-install-recommends -y libmysqlclient-dev
Voor het testen van de verbinding kunt u het wachtwoord eerst direct in uw settings.py-bestand plaatsen. Voor langdurige veiligheid is het echter beter om omgevingsvariabelen te gebruiken (zie hieronder).
Pas uw settings.py als volgt aan:
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 is alleen bedoeld voor testdoeleinden en wordt niet aanbevolen voor productieomgevingen!
Nadat u heeft gecontroleerd dat de verbinding werkt, kunt u overstappen op een veiligere aanpak met django-environ voor het beheren van omgevingsvariabelen.
Installeer eerst het pakket:
pip install django-environ
Werk vervolgens uw settings.py bij:
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')
}
}
Maak of bewerk het .env-bestand in dezelfde map als settings.py en voeg toe:
STACKHERO_MYSQL_HOST=<XXXXXX>.stackhero-network.com
STACKHERO_MYSQL_PORT=<PORT>
STACKHERO_MYSQL_ROOT_PASSWORD=<ROOT_PASSWORD>
Om uw inloggegevens veilig te houden, voegt u .env toe aan uw .gitignore-bestand:
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
Hieronder vindt u een voorbeeld van het configureren van uw Grails-applicatie voor verbinding met MySQL:
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" // U kunt "/root" vervangen door de gewenste database.
username = "root" // Het is verstandig om een aparte gebruiker voor uw applicatie aan te maken.
password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD
properties {
maxActive = 50
minEvictableIdleTimeMillis = 1800000
timeBetweenEvictionRunsMillis = 1800000
numTestsPerEvictionRun = 3
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
validationQuery = "SELECT 1"
}
}
}
}
Een gebruiker aanmaken in MySQL via phpMyAdmin
Voor een betere beveiliging is het aan te raden een aparte gebruiker voor uw applicatie aan te maken in plaats van de "root"-gebruiker te gebruiken. Dit doet u eenvoudig via phpMyAdmin:
-
Selecteer in phpMyAdmin
User accountsin het hoofdmenu.
-
Klik op
Add user account.
-
Vul het formulier voor gebruikersaanmaak in:
- Voer een accountnaam in (meestal de naam van uw applicatie)
- Klik op
Generate passwordvoor een veilig wachtwoord en kopieer dit - Selecteer
Create database with same name and grant all privileges
Na het indienen van het formulier heeft u een nieuwe gebruiker en een aparte database met dezelfde naam als uw gebruikersnaam.