MySQL: Pierwsze kroki
Jak zacząć z MySQL
👋 Witamy w dokumentacji Stackhero!
Stackhero oferuje gotowe do użycia rozwiązanie MySQL cloud, które zapewnia wiele korzyści, w tym:
- Nieograniczone połączenia i transfery.
- Włączony interfejs webowy phpMyAdmin.
- Łatwe aktualizacje za pomocą jednego kliknięcia.
- Optymalna wydajność i solidne zabezpieczenia dzięki prywatnej i dedykowanej VM.
Oszczędzaj czas i upraszczaj swoje życie: wypróbowanie rozwiązania MySQL cloud hosting Stackhero zajmuje tylko 5 minut!
URL-e MySQL
Najprostszym sposobem na połączenie się z usługą MySQL jest użycie formatu URL MySQL, jeśli Twój sterownik to obsługuje:
mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
Dla użytkowników Ruby, format URL MySQL jest nieco inny:
mysql2://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?reconnect=true&useSSL=true&requireSSL=true
Używanie MySQL z PHP
Używanie MySQL z PHP i MySQLi (styl obiektowy)
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nie zalecamy używania bazy danych "root". Ten przykład jest podany wyłącznie w celach demonstracyjnych. Najlepszą praktyką jest utworzenie dedykowanej bazy danych i użytkownika w phpMyAdmin i użycie ich tutaj.
$mysqli = mysqli_init();
$mysqliConnected = $mysqli->real_connect($hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
die("Błąd połączenia: " . $mysqli->connect_error);
}
echo 'Połączenie udane... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>
Używanie MySQL z PHP i MySQLi (styl proceduralny)
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nie zalecamy używania bazy danych "root". Ten przykład jest wyłącznie w celach demonstracyjnych. Najlepszą praktyką jest utworzenie dedykowanej bazy danych i użytkownika w phpMyAdmin i użycie ich tutaj.
$mysqli = mysqli_init();
$mysqliConnected = mysqli_real_connect($mysqli, $hostname, $user, $password, $database, $port, NULL, MYSQLI_CLIENT_SSL);
if (!$mysqliConnected) {
die("Błąd połączenia: " . mysqli_connect_error($mysqli));
}
echo 'Sukces: ' . mysqli_get_host_info($mysqli) . "\n";
mysqli_close($mysqli);
?>
Używanie MySQL z PHP i PDO
<?php
$hostname = '<XXXXXX>.stackhero-network.com';
$port = '<PORT>';
$user = 'root';
$password = '<ROOT_PASSWORD>';
$database = 'root'; // Nie zalecamy używania bazy danych "root". To jest wyłącznie w celach demonstracyjnych. Najlepszą praktyką jest utworzenie dedykowanej bazy danych i użytkownika w phpMyAdmin i użycie ich tutaj.
$dsn = "mysql:host=$hostname;port=$port;dbname=$database";
$options = array(
// Jeśli napotkasz błąd taki jak "Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed",
// upewnij się, że katalog /etc/ssl/certs/ zawiera certyfikaty CA.
// Zobacz poniżej więcej informacji.
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 "Jesteś połączony z bazą danych działającą na wersji " . $version[0] . "\n";
?>
Obsługa błędu "SSL operation failed with code 1"
Jeśli napotkasz błąd:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
jest to prawdopodobnie spowodowane brakiem certyfikatów CA w katalogu /etc/ssl/certs/.
Jeśli masz dostęp do systemu uruchamiającego Twój kod PHP, możesz zainstalować te certyfikaty w następujący sposób:
- Na Ubuntu/Debian, uruchom
sudo apt-get install ca-certificates - Na Alpine Linux, uruchom
apk add ca-certificates
Jeśli nie masz bezpośredniego dostępu do systemu uruchamiającego Twój kod PHP, możesz zainstalować certyfikat ręcznie:
- Pobierz certyfikat na swój komputer: https://letsencrypt.org/certs/isrgrootx1.pem
- Dodaj plik
isrgrootx1.pemdo plików projektu PHP. - Skomentuj linię
PDO::MYSQL_ATTR_SSL_CAPATH => '/etc/ssl/certs/' - Odkomentuj linię
PDO::MYSQL_ATTR_SSL_CA => 'isrgrootx1.pem'
Rozwiązywanie "Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH"
Jeśli napotkasz błąd:
Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_ATTR_SSL_CAPATH
lub podobny komunikat, taki jak:
Fatal error: Uncaught Error: Undefined constant PDO::MYSQL_*
oznacza to, że PDO zostało zainstalowane bez wsparcia MySQL.
Rozwiązanie dla Ubuntu/Debian
Aby rozwiązać ten problem na systemach opartych na Ubuntu lub Debian, zainstaluj wymaganą rozszerzenie PHP MySQL, uruchamiając następujące polecenie:
sudo apt-get install php-mysql
Rozwiązanie dla Docker
Jeśli używasz Docker, upewnij się, że wsparcie MySQL jest uwzględnione podczas procesu budowania. Dodaj następującą linię do swojego Dockerfile:
RUN docker-php-ext-install pdo pdo_mysql
Używanie MySQL z Symfony i Doctrine
Edytuj plik .env i zdefiniuj zmienną DATABASE_URL w następujący sposób:
DATABASE_URL="mysql://<USER>:<PASSWORD>@XXXXXX.stackhero-network.com:<PORT>/<DATABASE>"
Następnie edytuj plik config/packages/doctrine.yaml i ustaw sterownik oraz opcje w następujący sposób:
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
Obsługa błędu "SSL operation failed with code 1"
Jeśli otrzymasz błąd:
Uncaught PDOException: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed
jest to prawdopodobnie spowodowane brakiem certyfikatów CA w katalogu /etc/ssl/certs/.
Jeśli masz dostęp do systemu uruchamiającego Twój kod PHP, możesz zainstalować te certyfikaty w następujący sposób:
- Na Ubuntu/Debian, uruchom
sudo apt-get install ca-certificates - Na Alpine Linux, uruchom
apk add ca-certificates
Jeśli nie masz bezpośredniego dostępu do systemu, możesz zainstalować certyfikat ręcznie:
- Pobierz certyfikat na swój komputer: https://letsencrypt.org/certs/isrgrootx1.pem
- Dodaj plik
isrgrootx1.pemdo swojego projektu Symfony. - Edytuj plik
config/packages/doctrine.yamli ustaw sterownik oraz opcje w następujący sposób:
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
Używanie MySQL z Laravel
Edytuj plik config/database.php i zastąp konfigurację mysql następującymi ustawieniami:
'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([
// Jeśli napotkasz błąd taki jak "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,
])
: [],
],
Używanie MySQL z PHP CodeIgniter
W pliku database.php, dodaj następującą konfigurację:
$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'), // Zgodnie z konwencją, baza danych ma tę samą nazwę co użytkownik.
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => true,
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'encrypt' => array() // Ważne: aktywuj szyfrowanie TLS
);
Łączenie MySQL z PHP za pomocą zmiennych środowiskowych
Najlepszą praktyką jest nie przechowywanie swoich danych uwierzytelniających w kodzie źródłowym, ale używanie zamiast tego zmiennych środowiskowych.
Poniżej znajduje się przykład pobierania tych danych uwierzytelniających:
$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'); // Zgodnie z konwencją, baza danych ma tę samą nazwę co użytkownik.
Używanie MySQL z WordPress
Łączenie WordPress z Stackhero dla MySQL jest proste. Wystarczy edytować plik wp-config.php i skonfigurować bazę danych w następujący sposób:
define('DB_HOST', '<XXXXXX>.stackhero-network.com');
define('DB_PORT', '<PORT>');
define('DB_NAME', 'root');
define('DB_USER', 'root');
define('DB_PASSWORD', '<yourPassword>');
// Użyj szyfrowania TLS (znanego również jako SSL)
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
Ważna część tutaj to aktywacja szyfrowania TLS (znanego również jako SSL). Bez tego połączenie nie zadziała.
Używanie MySQL z Node.js
Używanie protokołu MySQL X (pakiet xdevapi)
W tym przykładzie używamy oficjalnego pakietu xdevapi, aby wykorzystać protokół MySQL X. Aby go zainstalować, uruchom:
npm install @mysql/xdevapi
Poniżej znajduje się kompletny przykład użycia xdevapi:
const mysqlx = require('@mysql/xdevapi');
(async () => {
// Połącz się z MySQL używając protokołu MySQL X
const session = await mysqlx.getSession({
host: '<XXXXXX>.stackhero-network.com',
port: '<PORT>',
user: 'root',
password: '<ROOT_PASSWORD>'
});
// Utwórz schemat (bazę danych), jeśli nie istnieje
const schemaExists = await session.getSchema('stackherotest').existsInDatabase();
if (!schemaExists) {
await session.createSchema('stackherotest');
}
// Utwórz tabelę 'users', jeśli nie istnieje
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();
}
// Wstaw fikcyjnego użytkownika
await session
.getSchema('stackherotest') // Nazwa bazy danych
.getTable('users') // Nazwa tabeli
.insert('userId', 'name', 'address', 'email') // Nazwy kolumn
.values(
Math.round(Math.random() * 100000), // Generuj fikcyjny userId
'Nazwa użytkownika', // kolumna 'name'
'Adres użytkownika', // kolumna 'address'
'user@email.com' // kolumna 'email'
)
.execute();
// Policz liczbę wierszy w tabeli 'users'
const usersCount = await session
.getSchema('stackherotest') // Nazwa bazy danych
.getTable('users')
.count();
console.log(`Obecnie w tabeli "users" znajduje się ${usersCount} wpisów`);
// Zamknij połączenie z MySQL
await session.close();
})().catch(error => {
console.error('');
console.error('🐞 Wystąpił błąd!');
console.error(error);
process.exit(1);
});
Używanie protokołu MySQL (pakiet MySQL2)
W tym przykładzie używamy pakietu mysql2 z obsługą obietnic. Aby go zainstalować, uruchom:
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>'
});
// Utwórz bazę danych 'stackherotest', jeśli jeszcze nie istnieje
await db.query('CREATE DATABASE IF NOT EXISTS stackherotest');
// Utwórz tabelę 'users', jeśli jeszcze nie istnieje
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;');
// Wstaw fikcyjnego użytkownika
await db.query(
'INSERT INTO `stackherotest`.`users` (`userId`, `name`, `address`, `email`) VALUES ?',
[
[
Math.round(Math.random() * 100000), // Generuj fikcyjny userId
'Nazwa użytkownika', // kolumna 'name'
'Adres użytkownika', // kolumna 'address'
'user@email.com' // kolumna 'email'
]
]
);
// Policz liczbę wierszy w tabeli 'users'
const [ usersCount ] = await db.query('SELECT COUNT(*) AS `cpt` FROM `stackherotest`.`users`');
console.log(`Obecnie w tabeli "users" znajduje się ${usersCount[0].cpt} wpisów`);
// Zamknij połączenie z MySQL
await db.end();
})().catch(error => {
console.error('');
console.error('🐞 Wystąpił błąd!');
console.error(error);
process.exit(1);
});
Używanie MySQL z Node.js, NestJS lub TypeORM
Aby połączyć się z Node.js, NestJS lub TypeORM, uwzględnij opcję ssl, jak pokazano w tym przykładzie:
TypeOrmModule.forRoot({
type: 'mysql',
host: '<XXXXXX>.stackhero-network.com',
port: <PORT>,
username: 'root',
password: '<ROOT_PASSWORD>',
database: 'root',
entities: [],
synchronize: true,
ssl: {}
});
Używanie MySQL z Prisma
Aby połączyć się za pomocą Prisma, dodaj opcję sslaccept=strict, aby upewnić się, że szyfrowanie SSL jest włączone. Oto przykład użycia użytkownika "root" i połączenia z bazą danych "root":
datasource db {
provider = "mysql"
url = "mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?sslaccept=strict"
}
Używanie MySQL z Django
Jeśli moduł mysqlclient nie jest jeszcze zainstalowany, zainstaluj go, ponieważ będzie używany do połączenia z MySQL:
pip install mysqlclient
Jeśli napotkasz błąd
Exception: Can not find valid pkg-config namepodczas instalacjimysqlclient, zainstaluj pakietlibmysqlclient. Na Ubuntu/Debian możesz uruchomić:apt-get update && apt-get install --no-install-recommends -y libmysqlclient-dev
W tym początkowym kroku hasło jest przechowywane bezpośrednio w pliku settings.py wyłącznie w celach testowych. Zaleca się użycie bardziej bezpiecznego podejścia, jak opisano później w tej dokumentacji.
Otwórz plik settings.py i dodaj następujące:
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>'
}
}
Uwaga: ten przykład nie jest zalecany do produkcji i jest przeznaczony wyłącznie do celów testowych!
Po pomyślnym połączeniu możesz użyć zalecanej metody do bezpiecznego przechowywania danych uwierzytelniających. W tym przykładzie używany jest django-environ do zarządzania zmiennymi środowiskowymi.
Najpierw zainstaluj django-environ za pomocą polecenia:
pip install django-environ
Następnie otwórz plik settings.py i dodaj następujące:
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')
}
}
Następnie otwórz lub utwórz plik .env w tym samym katalogu co settings.py i dodaj następujące:
STACKHERO_MYSQL_HOST=<XXXXXX>.stackhero-network.com
STACKHERO_MYSQL_PORT=<PORT>
STACKHERO_MYSQL_ROOT_PASSWORD=<ROOT_PASSWORD>
Na koniec dodaj .env do swojego pliku .gitignore, aby upewnić się, że Twoje dane uwierzytelniające nie zostaną zapisane w repozytorium Git:
echo ".env" >> .gitignore
Łączenie MySQL z Java/Spring
Aby połączyć swoją aplikację Spring, ustaw zmienną środowiskową SPRING_DATASOURCE_URL z adresem URL bazy danych, poprzedzonym jdbc::
SPRING_DATASOURCE_URL=jdbc:mysql://root:<ROOT_PASSWORD>@<XXXXXX>.stackhero-network.com:<PORT>/root?useSSL=true&requireSSL=true
Łączenie MySQL z Groovy/Grails
Poniższy przykład pokazuje, jak połączyć aplikację Grails z MySQL:
dataSource {
pooled = true
driverClassName = "com.mysql.cj.jdbc.Driver"
dialect = org.hibernate.dialect.MySQL8Dialect
// Właściwości specyficzne dla SSL
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" // Zastąp "/root" bazą danych, do której chcesz się połączyć.
username = "root" // Zaleca się utworzenie dedykowanego użytkownika zamiast używania danych "root".
password = System.env.STACKHERO_MYSQL_ROOT_PASSWORD // Zaleca się utworzenie dedykowanego użytkownika zamiast używania danych "root".
properties {
maxActive = 50
minEvictableIdleTimeMillis = 1800000
timeBetweenEvictionRunsMillis = 1800000
numTestsPerEvictionRun = 3
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
validationQuery = "SELECT 1"
}
}
}
}
Tworzenie użytkownika w MySQL za pomocą phpMyAdmin
Najlepszą praktyką jest utworzenie dedykowanego użytkownika dla swojej aplikacji zamiast używania użytkownika "root".
Najprostszym sposobem na to jest użycie phpMyAdmin.
-
W phpMyAdmin kliknij
Konta użytkownikówna górze.
-
Kliknij
Dodaj konto użytkownika.
-
Wypełnij formularz tworzenia użytkownika:
- Wybierz nazwę konta (zazwyczaj nazwę swojej aplikacji)
- Kliknij
Generuj hasło, aby utworzyć bezpieczne hasło (skopiuj je do schowka) - Zaznacz opcję
Utwórz bazę danych o tej samej nazwie i przyznaj wszystkie uprawnienia
Po zatwierdzeniu formularza nowy użytkownik zostanie utworzony wraz z odpowiadającą mu bazą danych o tej samej nazwie co nazwa użytkownika.