Has gaitezen datu-base batera konexioa duen aplikazio bat egin behar dela kasuak. Hau egiten da backend garapenean gehiegi ez sakontzeko eta frontend-ean kontzentratzeko esku eta trebetasun faltagatik. Ezin dut esan nire irtenbidea segurua izango denik, baina funtzionatzen du.
Hostingagatik ordaintzea gustatzen ez zaidanez, nire lanean sarea erabili dut, hor IP zuri bat dago. Hona hemen bere egitura:
Hainbat ordenagailutarako sarbidea daukat, zehatzago, 192.168.1.2 (aka 192.168.0.2) Linux instalatuta eta 192.168.0.3 Windowsekin. Orokorrean, mysql aukeratu nuen nire aplikaziorako eta Linux-en eskuragarri zegoena aztertu nuen. Dagoeneko han instalatuta zegoen, baina inork ez daki pasahitza, eta zekitenek ahaztu egin zuten (ni baino lehen lan egin zutenek). Inork behar ez zuela ikasita, ezabatu egin nuen eta berriro instalatzen saiatu nintzen. Ez zegoen nahikoa memoria, eta errore hau konpontzeko monitorea eta teklatua sagu batekin konektatu beharko nituzkeenez, gai honi uko egitea erabaki nuen. Gainera, Windows-eko makina askoz indartsuagoa da eta gainera, nire ordenagailu eramangarrian daukat etxean. Printzipioz, ez dut instalazioa bera deskribatuko; horri buruzko eskuliburu eta bideo asko daude. Mysql Windows makina batean instalatu ondoren, mahaien babeskopia egitea erabaki nuen ordenagailu eramangarritik lan-estaziora.
Honela egiten da (nire kasuan):
mysqldump -uroot -p your_base > dump_file.sql
Ondoren, datu-base bat sortuko dugu datu-base berrian eta babeskopia berrezartzen dugu makina "berrian".
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Babeskopia-fitxategia makina berrian jarri behar da eta, agian, erabilgarritasuna duen direktorioan ez bada, haren bide osoa. (Bakopia GitHub-era igo eta makina berri batean klonatu dut). Taulak beraiek nola sortzen diren gehituko nuke, baina ez ditut pantaila-argazkiak gorde, eta uste dut 2-3 urteko ikasle batentzat ere ez dela zaila.
Taula guztiak leheneratu direnean, datu-baserako urruneko sarbidea eskuragarri jartzeko garaia da. Oro har, horrelako komandoek ez zuten arrakastarik ekarri (hautatzeko irakurtzeko baimena bakarrik ematen zuen)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
Zehatzago esanda, datu-basera komandoarekin soilik konekta nezakeen,
mysql -h localhost -u client -pclient
baina honek ezin zuen gehiago egin
mysql -h 192.168.0.3 -u client -pclient
Honek ez zidan funtzionatu eta ezin izan nuen helbide honen bidez konektatu root gisa.
Mysql workbench programak lagundu zuen; ezarpenetan, aldatu localhost %-ra eta funtzionatzen du, bezeroak lagundu ez zuen arren. Orain datu-basera konekta zaitezke kontsolatik edo edozein helbidetako kodetik.
Etxeko edo negozioko sare bat ere egin behar duzu eta Windows suebakia itzali, bestela ezingo duzu makina honi ping-a egin ere egin (are gutxiago datu-basera konektatu).
Lan erdia eginda dago, orain datu-basera etxetik konektatu ahal izan behar dut.
Sare-diagraman ikusten denez, Internetera heltzeko 192.168.0.3-tik 192.168.1.1-era (bideratzailea) joan behar da, goazen kontrako norabidean. Konfigura dezagun ibilbidea 192.168.1.1-tik 192.168.1.2-ra honela:
Oro har, irudia ez da agertzen, beraz, eskuz idatziko dut:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Hau azpisare batean bakarrik egin daiteke, hau da, ezin duzu berehala birbidali 192.168.0.2 edo 192.168.0.3 helbidera.
Hau beharrezkoa da bideratzaileak 192.168.0.0/24 azpisarea non dagoen jakin dezan (sareen oinarriak ikastea erabilgarria da).
Orain 3306 ataka birbidaltzea gehitzen dugu (mysql ataka lehenetsia (instalazioan zehar aldatu ez bazenuen)) 192.168.1.2 helbidean.
Egiteko zailena Linux makina batean birbidaltzea da (bi sare-txartel ditu 192.168.1.2 (enp3s1 interfazea) eta 192.168.0.2 (enp3s0 interfazea), sare-txartelek 192.168.1.2tik zer transferitu behar duten jakin dezaten. 192.168.0.2ra, eta gero gure Windows makinara MySql-rekin.
sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -p tcp --syn --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i enp3s0 -o enp3s1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i enp3s1 -p tcp --dport 3306 -j DNAT --to-destination 192.168.0.3
sudo iptables -t nat -A POSTROUTING -o enp3s0 -p tcp --dport 3306 -d 192.168.0.3 -j SNAT --to-source 192.168.1.2
ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΡΠΊΠ° ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π²Π²Π΅Π΄Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅ ΠΎΡΠΈ Π½Π΅ ΡΡΠ΅ΡΠ»ΠΈΡΡ
sudo service iptables-persistent save
Horiek. 1. lerroak lehen konexioa onartzen dugula esan nahi du, 2. eta 3.ak paketeak bi noranzkoetan bidal ditzakegula, 4. eta 5.ak helmuga eta iturburu helbideak aldatzea esan nahi du. Eta listo, etxetik konekta zaitezke mysql bidez. Eta azkenik, hau egiten duen nire C++ kodea:
//DataBaseConnection.cpp
#include "DataBaseConnection.h"
DataBaseConnection::DataBaseConnection()
{
}
void DataBaseConnection::Connect()
{
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
conn = mysql_init(NULL);
if (conn == NULL)
{
// ΠΡΠ»ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ β Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅
fprintf(stderr, "Error: can'tcreate MySQL-descriptorn");
//exit(1); //ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
}
// ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ
if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
{
// ΠΡΠ»ΠΈ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ
// Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅
fprintf(stderr, "Error: can't connect to database: %sn", mysql_error(conn));
}
else
{
// ΠΡΠ»ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΡΠ°Π·Ρ - "Success!"
fprintf(stdout, "Success!n");
}
}
std::vector<std::string> DataBaseConnection::Query()
{
vectordrum.clear();
std::string query = "SELECT * FROM drum where id=0";
const char * q = query.c_str();
qstate = mysql_query(conn, q);
if (!qstate)
{
res = mysql_store_result(conn);
while (row = mysql_fetch_row(res))
{
//printf("ID: %s,Position: %s, Image: %sn", row[0], row[1], row[2]);
vectordrum.push_back(row[2]);
}
}
else
{
std::cout << "Query failed:" << mysql_error(conn) << std::endl;
}
return vectordrum;
}
void DataBaseConnection::Close()
{
// ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
mysql_close(conn);
}
DataBaseConnection::~DataBaseConnection()
{
vectordrum.clear();
}
//DataBaseConnection.h
#pragma once
#include <iostream>
#include <mysql.h>
#include <vector>
#pragma comment(lib,"mysqlcppconn.lib")
#pragma comment(lib,"libmysql.lib")
class DataBaseConnection
{
public:
DataBaseConnection();
void Connect();
std::vector<std::string> Query();
void Close();
~DataBaseConnection();
MYSQL *conn;
MYSQL_ROW row;
MYSQL_RES *res;
int qstate;
std::vector<std::string> vectordrum;
};
Orain segurtasunez bidal diezaiokezu programa hau edonori, eta ez duzu berridatzi behar lokalean funtziona dezan.
Iturria: www.habr.com