Paghimo sa database nga magamit alang sa hilit nga koneksyon

Magsugod kita sa kamatuoran nga adunay mga panahon nga kinahanglan nimo nga maghimo usa ka aplikasyon nga adunay koneksyon sa database. Gihimo kini aron dili kaayo masusi ang pag-uswag sa back-end ug pag-concentrate sa front-end tungod sa kakulang sa mga kamot ug kahanas. Dili ko moingon nga ang akong solusyon mahimong luwas, apan kini molihok.

Kay di man ko ganahan mubayad sa hosting, gigamit nako ang network sa akong trabaho, naay white IP. Ania ang istruktura niini:

Paghimo sa database nga magamit alang sa hilit nga koneksyon

Ako adunay access sa pipila ka mga computer, mas tukma sa 192.168.1.2 (aka 192.168.0.2) adunay Linux ug 192.168.0.3 uban sa Windows. Sa kinatibuk-an, alang sa akong aplikasyon, gipili nako ang mysql ug gitan-aw kung unsa ang naa sa Linux. Na-install na kini didto, apan wala’y nahibal-an ang password, ug kadtong nahibal-an nakalimot (kadtong nagtrabaho una kanako). Pagkahuman nahibal-an nga wala’y kinahanglan niini, gitangtang nako kini ug gisulayan nga i-install kini pag-usab. Walay igo nga panumduman, ug tungod kay aron ayohon kini nga sayup kinahanglan nako nga ikonektar ang usa ka monitor ug usa ka keyboard nga adunay mouse niini, nakahukom ko nga moundang niini nga negosyo. Dugang pa, ang usa ka makina sa Windows labi ka kusgan, ug dugang sa tanan, ako mismo adunay kini sa akong laptop sa balay. Sa prinsipyo, dili nako ihulagway ang pag-instalar mismo, adunay daghang mga manwal ug mga video bahin niini. Na-install ang mysql sa usa ka makina sa Windows, nakahukom ko nga i-backup ang mga lamesa gikan sa usa ka laptop hangtod sa usa ka workstation.

Gihimo kini sama niini (sa akong kaso):

mysqldump -uroot -p your_base > dump_file.sql

Sunod, maghimo kami usa ka database sa bag-ong database ug ibalik ang backup sa "bag-ong" makina.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Ang file nga adunay backup kinahanglan ibutang sa usa ka bag-ong makina, ug kung wala sa direktoryo nga adunay utility, nan ang tibuuk nga agianan niini posible. (Nag-upload lang ako usa ka backup sa github ug gi-clone kini sa usa ka bag-ong makina). Akong idugang kung giunsa paghimo ang mga lamesa mismo, apan wala nako gitipig ang mga screenshot, ug sa akong hunahuna dili kini lisud bisan sa usa ka 2-3 ka tuig nga estudyante.

Kung akong gipahiuli ang tanan nga mga lamesa, panahon na aron magamit ang layo nga pag-access sa database. Sa kinatibuk-an, ang maong mga sugo wala mosangpot sa kalampusan (gihatagan lamang og katungod sa pagbasa sa pinili)

create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;

Sa mas tukma, makakonektar lamang ako sa database gamit ang sugo,

mysql -h localhost -u client -pclient

ug kining usa dili makahimo

mysql -h 192.168.0.3 -u client -pclient

Dili kini angay kanako, dili usab ako makakonektar pinaagi niini nga adres isip gamut.

Nakatabang ang mysql workbench program, didto sa mga setting imong giusab ang localhost sa% ug kini molihok, bisan kung ang kliyente wala makatabang. Karon mahimo ka makonektar sa database gikan sa console o gikan sa code gikan sa bisan unsang adres.

Paghimo sa database nga magamit alang sa hilit nga koneksyon

Kinahanglan ka usab nga maghimo usa ka network sa balay o negosyo ug i-off ang firewall sa Windows, kung dili, dili nimo ma-ping kini nga makina (dili nga kini magkonektar sa database).

Ang katunga sa trabaho nahuman na, nan kinahanglan nako nga makakonektar sa database gikan sa balay.

Sama sa imong makita gikan sa network diagram, kinahanglan ka nga moadto sa Internet gikan sa 192.168.0.3 hangtod sa 192.168.1.1 (router), moadto kita sa atbang nga direksyon. Magbutang kita ug ruta gikan sa 192.168.1.1 hangtod sa 192.168.1.2 sama niini:

Paghimo sa database nga magamit alang sa hilit nga koneksyon

Sa kinatibuk-an, ang hulagway wala magpakita - Ako mosulat sa akong mga kamot:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Mahimo ra kini sa usa ka subnet, sa ato pa, dili nimo dayon ipadayon ang adres nga 192.168.0.2 o 192.168.0.3.

Kinahanglan kini aron mahibal-an sa router kung diin nahimutang ang 192.168.0.0/24 subnet (pagkat-on ang sukaranan sa mga network mapuslanon).

Karon among gidugang ang port forwarding 3306 (mysql port pinaagi sa default (kon wala nimo kini usba sa panahon sa pag-instalar)) sa address 192.168.1.2

Paghimo sa database nga magamit alang sa hilit nga koneksyon

Karon ang labing lisud nga butang nga buhaton mao ang paghimo sa pagpasa sa usa ka makina sa Linux (kini adunay duha ka network card 192.168.1.2 (enp3s1 interface) ug 192.168.0.2 (enp3s0 interface) aron ang mga network card mahibal-an kung unsa ang ibalhin gikan sa 192.168.1.2. ngadto sa 192.168.0.2, ug dayon sa among Windows machine nga adunay MySql.

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

Mga. Ang 1st line nagpasabot nga gidawat nato ang unang koneksyon, ang 2nd ug 3rd nga posible nga ipadala ang mga packet sa duha ka direksyon, ang 4th ug 5th nagpasabot sa pagpuli sa destinasyon ug source address. Ug voila, makakonektar ka gikan sa balay pinaagi sa mysql. Ug sa katapusan, ang akong C++ code nga naghimo niini:

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

Karon mahimo nimong luwas nga ilabay kini nga programa sa bisan kinsa, ug dili nimo kinahanglan nga isulat kini pag-usab aron kini molihok sa lokal.

Source: www.habr.com

Idugang sa usa ka comment