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!

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

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();

?>

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);

?>

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";

?>

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:

  1. Op Ubuntu/Debian: sudo apt-get install ca-certificates
  2. Op Alpine Linux: apk add ca-certificates

Als u geen directe toegang heeft, kunt u het certificaat handmatig toevoegen:

  1. Download het certificaat: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Plaats het bestand isrgrootx1.pem in uw PHP-project.
  3. Zet de regel PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/' in commentaar.
  4. Haal de commentaar weg bij de regel PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'

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.

  1. Op Ubuntu/Debian

U kunt de benodigde extensie installeren met:

sudo apt-get install php-mysql
  1. 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

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:

  1. Op Ubuntu/Debian: sudo apt-get install ca-certificates
  2. Op Alpine Linux: apk add ca-certificates

Als u geen directe toegang heeft, kunt u het certificaat handmatig toevoegen:

  1. Download: https://letsencrypt.org/certs/isrgrootx1.pem
  2. Plaats isrgrootx1.pem in uw Symfony-project.
  3. Werk config/packages/doctrine.yaml bij:
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

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,
    ])
    : [],
],

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
);

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.

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.

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);
});

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);
});

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: {}
});

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"
}

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 name krijgt, moet u mogelijk het pakket libmysqlclient toevoegen. 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

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

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"
      }
    }
  }
}

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:

  1. Selecteer in phpMyAdmin User accounts in het hoofdmenu.

  2. Klik op Add user account.

  3. Vul het formulier voor gebruikersaanmaak in:

    • Voer een accountnaam in (meestal de naam van uw applicatie)
    • Klik op Generate password voor 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.