د ریموټ اتصال لپاره ډیټابیس چمتو کول

راځئ چې د دې حقیقت سره پیل وکړو چې ځینې وختونه شتون لري کله چې تاسو اړتیا لرئ د ډیټابیس اتصال سره غوښتنلیک جوړ کړئ. دا د دې لپاره ترسره کیږي چې د شاته پای پراختیا ته ډیر پام ونه کړي او د لاسونو او مهارتونو نشتوالي له امله په مخکني پای تمرکز وکړي. زه نه وایم چې زما حل به خوندي وي، مګر دا کار کوي.

څرنګه چې زه د کوربه توب لپاره پیسې نه غواړم، ما په خپل کار کې شبکه کارولې، یو سپین IP شتون لري. دلته یې جوړښت دی:

د ریموټ اتصال لپاره ډیټابیس چمتو کول

زه څو کمپیوټرونو ته لاس رسی لرم، په دقیق ډول 192.168.1.2 (aka 192.168.0.2) ته لینکس او 192.168.0.3 د وینډوز سره. په عموم کې ، زما د غوښتنلیک لپاره ، ما mysql غوره کړ او وګوره چې په لینکس کې څه دي. دا لا دمخه هلته نصب شوی و، مګر هیڅوک یې پټنوم نه پیژني، او هغه څوک چې پوهیدل هېر کړي (هغه څوک چې زما څخه مخکې کار کاوه). وروسته له دې چې پوه شو چې هیڅوک ورته اړتیا نلري، ما دا حذف کړه او بیا یې د نصبولو هڅه وکړه. کافي حافظه نه وه ، او له هغه وخته چې د دې غلطۍ د حل کولو لپاره زه باید یو مانیټر او کیبورډ له موږک سره وصل کړم ، ما پریکړه وکړه چې دا سوداګرۍ پریږدم. سربیره پردې ، د وینډوز ماشین خورا پیاوړی دی ، او د هرڅه سربیره ، زه پخپله دا په خپل لپ ټاپ کې په کور کې لرم. په اصولو کې، زه به پخپله نصب نه کړم، د دې په اړه ډیری لارښودونه او ویډیوګانې شتون لري. په وینډوز ماشین کې د مای ایس کیو ایل نصبولو سره ، ما پریکړه وکړه چې له لپ ټاپ څخه کار سټیشن ته میزونه بیک اپ کړم.

دا د دې په څیر ترسره کیږي (زما په قضیه کې):

mysqldump -uroot -p your_base > dump_file.sql

بیا ، موږ په نوي ډیټابیس کې ډیټابیس رامینځته کوو او په "نوي" ماشین کې بیک اپ بحال کوو.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


د بیک اپ سره فایل باید په نوي ماشین کې واچول شي ، او که چیرې د یوټیلیټ سره لارښود کې نه وي ، نو دې ته بشپړ لاره ممکنه ده. (ما یوازې ګیتوب ته بیک اپ اپلوډ کړی او نوي ماشین ته یې کلون کړی). زه به اضافه کړم چې میزونه پخپله څنګه رامینځته کیږي ، مګر ما سکرین شاټونه نه دي خوندي کړي ، او زه فکر کوم چې دا حتی د 2-3 کلن زده کونکي لپاره ستونزمن ندي.

کله چې ما ټول میزونه بحال کړل، دا وخت دی چې ډیټابیس ته لیرې لاسرسی چمتو کړئ. په عموم کې، دا ډول حکمونه د بریالیتوب لامل نه شول (یوازې د انتخاب لوستلو حق ورکړل شوی)

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

په ډیر دقیق ډول، زه کولی شم یوازې د کمانډ سره ډیټابیس سره وصل کړم،

mysql -h localhost -u client -pclient

او دا نشي کولی

mysql -h 192.168.0.3 -u client -pclient

دا زما لپاره مناسب نه و، زه هم نشم کولی د دې پتې له لارې د روټ په توګه وصل شم.

د mysql ورک بینچ برنامه مرسته وکړه ، هلته په ترتیباتو کې تاسو لوکل هوسټ٪ ته بدل کړئ او دا کار کوي ، که څه هم پیرودونکي مرسته نده کړې. اوس تاسو کولی شئ د ډیټابیس سره د کنسول یا کوډ څخه د کوم پته څخه وصل شئ.

د ریموټ اتصال لپاره ډیټابیس چمتو کول

تاسو اړتیا لرئ د کور یا تصدۍ شبکه هم جوړه کړئ او د وینډوز فایر وال بند کړئ ، که نه نو تاسو به حتی د دې ماشین پینګ کولو توان ونلرئ (نه دا چې دا به ډیټابیس سره وصل شي).

نیمایي کار بشپړ شوی، بیا زه اړتیا لرم چې د کور څخه ډیټابیس سره وصل شم.

لکه څنګه چې تاسو د شبکې ډیاګرام څخه لیدلی شئ، تاسو اړتیا لرئ د 192.168.0.3 څخه تر 192.168.1.1 (روټر) پورې انټرنیټ ته لاړ شئ، راځئ چې مخالف لوري ته لاړ شو. راځئ چې له 192.168.1.1 څخه تر 192.168.1.2 پورې داسې لاره جوړه کړو:

د ریموټ اتصال لپاره ډیټابیس چمتو کول

په عموم کې، انځور نه ښیې - زه به د خپلو لاسونو سره ولیکم:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

دا یوازې په یوه فرعي نیټ کې ترسره کیدی شي، دا دی، تاسو نشئ کولی سمدستي 192.168.0.2 یا 192.168.0.3 پتې ته ولیږئ.

دا اړینه ده چې روټر پوه شي چې 192.168.0.0/24 سبنټ چیرته موقعیت لري (د شبکې اساسات زده کړئ ګټور دي).

اوس موږ د پورټ فارورډینګ 3306 اضافه کوو (د ډیفالټ له مخې د mysql پورټ (که تاسو دا د نصب کولو پرمهال نه وي بدل کړی)) پته 192.168.1.2 ته.

د ریموټ اتصال لپاره ډیټابیس چمتو کول

اوس تر ټولو ستونزمن کار دا دی چې په لینکس ماشین کې فارورډینګ ترسره کړئ (دا دوه شبکې کارتونه 192.168.1.2 (enp3s1 انٹرفیس) او 192.168.0.2 (enp3s0 انٹرفیس) لري ترڅو د شبکې کارتونه پوه شي چې له 192.168.1.2 څخه څه شی لیږدوي. 192.168.0.2 ته، او بیا د 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

هغوی. لومړۍ کرښه پدې معنی ده چې موږ لومړی اړیکه منو، دویمه او دریمه چې دا ممکنه ده چې پاکټونه په دواړو خواوو کې واستول شي، څلورم او پنځم معنی د منزل او سرچینې پته بدلوي. او وویلا، تاسو کولی شئ د کور څخه د mysql له لارې وصل شئ. او په نهایت کې ، زما C++ کوډ چې دا کوي:

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

اوس تاسو کولی شئ دا برنامه په خوندي ډول هرچا ته وغورځوئ ، او تاسو اړتیا نلرئ دا بیا ولیکئ ترڅو دا په ځایی توګه کار وکړي.

سرچینه: www.habr.com

Add a comment