เริ่มจากข้อเท็จจริงที่ว่ามีหลายกรณีที่คุณจำเป็นต้องสร้างแอปพลิเคชันที่มีการเชื่อมต่อกับฐานข้อมูล สิ่งนี้ทำเพื่อไม่ให้เจาะลึกการพัฒนาแบ็กเอนด์มากเกินไปและมุ่งความสนใจไปที่ส่วนหน้าเนื่องจากขาดมือและทักษะ ฉันไม่สามารถพูดได้ว่าโซลูชันของฉันจะปลอดภัย แต่ใช้งานได้
เนื่องจากฉันไม่ชอบจ่ายค่าโฮสติ้ง ฉันจึงใช้เครือข่ายในที่ทำงาน มี IP สีขาวอยู่ที่นั่น นี่คือโครงสร้างของมัน:
ฉันสามารถเข้าถึงคอมพิวเตอร์หลายเครื่องได้แม่นยำยิ่งขึ้น 192.168.1.2 (หรือที่รู้จักในชื่อ 192.168.0.2) โดยติดตั้ง Linux ที่นั่นและ 192.168.0.3 พร้อม Windows โดยทั่วไป ฉันเลือก mysql สำหรับแอปพลิเคชันของฉัน และดูว่ามีอะไรบ้างบน Linux มีการติดตั้งไว้ที่นั่นแล้ว แต่ไม่มีใครรู้รหัสผ่าน และผู้ที่รู้ก็ลืม (ผู้ที่ทำงานก่อนหน้าฉัน) เมื่อรู้ว่าไม่มีใครต้องการมัน ฉันจึงลบมันออกแล้วลองติดตั้งอีกครั้ง มีหน่วยความจำไม่เพียงพอ และเนื่องจากเพื่อแก้ไขข้อผิดพลาดนี้ ฉันจะต้องเชื่อมต่อจอภาพและคีย์บอร์ดด้วยเมาส์ ฉันจึงตัดสินใจล้มเลิกในเรื่องนี้ ยิ่งกว่านั้นเครื่องที่ใช้ Windows ยังทรงพลังกว่ามากและยังมีมันอยู่ในแล็ปท็อปที่บ้านอีกด้วย โดยหลักการแล้ว ฉันจะไม่อธิบายการติดตั้ง มีคู่มือและวิดีโอมากมายเกี่ยวกับเรื่องนี้ หลังจากติดตั้ง mySQL บนเครื่อง Windows ฉันจึงตัดสินใจสำรองข้อมูลตารางจากแล็ปท็อปไปยังเวิร์กสเตชัน
มันทำได้เช่นนี้ (ในกรณีของฉัน):
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;
ต้องวางไฟล์สำรองไว้ในเครื่องใหม่และบางทีหากไม่อยู่ในไดเร็กทอรีที่มียูทิลิตี้ก็อาจเป็นเส้นทางแบบเต็ม (ฉันเพิ่งอัปโหลดข้อมูลสำรองไปยัง GitHub และโคลนลงในเครื่องใหม่) ฉันจะเพิ่มวิธีการสร้างตารางเอง แต่ฉันไม่ได้บันทึกภาพหน้าจอ และฉันคิดว่ามันไม่ใช่เรื่องยากแม้แต่สำหรับนักเรียน 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 workbench ช่วยได้ ในการตั้งค่าให้เปลี่ยน localhost เป็น % และใช้งานได้แม้ว่าไคลเอ็นต์จะไม่ช่วยก็ตาม ตอนนี้คุณสามารถเชื่อมต่อกับฐานข้อมูลจากคอนโซลหรือจากรหัสจากที่อยู่ใดก็ได้
คุณต้องสร้างเครือข่ายในบ้านหรือธุรกิจและปิดไฟร์วอลล์ Windows ไม่เช่นนั้นคุณจะไม่สามารถ ping เครื่องนี้ได้ (ไม่ต้องพูดถึงการเชื่อมต่อกับฐานข้อมูล)
เสร็จไปครึ่งหนึ่งแล้ว ตอนนี้ฉันต้องสามารถเชื่อมต่อกับฐานข้อมูลจากที่บ้านได้
ดังที่คุณเห็นจากแผนภาพเครือข่ายในการเข้าถึงอินเทอร์เน็ตคุณต้องเปลี่ยนจาก 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
สิ่งที่ยากที่สุดที่ต้องทำคือการส่งต่อบนเครื่อง Linux (มีการ์ดเครือข่ายสองตัว 192.168.1.2 (อินเทอร์เฟซ enp3s1) และ 192.168.0.2 (อินเทอร์เฟซ enp3s0) เพื่อให้การ์ดเครือข่ายรู้ว่าจะถ่ายโอนอะไรจาก 192.168.1.2 เป็น 192.168.0.2 จากนั้นไปที่เครื่อง Windows ของเราที่มี 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
เหล่านั้น. บรรทัดที่ 1 หมายความว่าเรายอมรับการเชื่อมต่อครั้งแรก บรรทัดที่ 2 และ 3 ที่เราสามารถส่งแพ็กเก็ตได้ทั้งสองทิศทาง บรรทัดที่ 4 และ 5 หมายถึงการเปลี่ยนปลายทางและที่อยู่ต้นทาง และคุณสามารถเชื่อมต่อจากที่บ้านผ่าน 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;
};
ตอนนี้คุณสามารถส่งโปรแกรมนี้ให้ใครก็ได้อย่างปลอดภัย และคุณไม่จำเป็นต้องเขียนมันใหม่เพื่อให้มันทำงานในเครื่องได้
ที่มา: will.com