Ubuntu Linux中開啟MySQL遠程訪問功能的方法


Ubuntu Linux中開啟MySQL遠程訪問功能的方法

一個真實的運行環境,今天在內網中部署了一台UbuntuLinux服務器,其中最頭疼的就是MySQL的安裝,apt下載更新的速度太慢了,於是就自行編譯了一下MySQL的源碼,具體的編譯方法可以參考網上的一些資料吧,

為了給服務器一個真實的運行環境,今天在內網中部署了一台UbuntuLinux服務器,其中最頭疼的就是MySQL的安裝,apt下載更新的速度太慢了,於是就自行編譯了一下MySQL的源碼,具體的編譯方法可以參考網上的一些資料吧,這里只對如何開始MySQL的遠程訪問功能做個簡單的講述:

1)確認一下3306是否對外開放,MySQL默認狀態下是不開放對外訪問功能的。查看的辦法如下:

Java代碼

~# netstat -an | grep 3306

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

從上面可以看出,mysql3306端口只是監聽本地的連接,這樣就阻礙了外部IP對該數據庫的訪問,修改的辦法其實很簡單,進入到mysql的配置文件所在目錄(/etc/mysql/my.cnf)下,找到文件中的如下內容:

Java代碼

# Instead of skip-networking the default is now to listen only on  

# localhost which is more compatible and is not less secure.  

bind-address = 127.0.0.1

bind-address注釋掉,或者改成你想要使用的客戶端主機IP

這樣mysql的遠程訪問端口就算開啟了,下面還有一個更重要的步驟,就是要給遠程用戶授權。

2)確認客戶端用戶是否具有訪問權限。

為了讓訪問mysql的客戶端的用戶有訪問權限,我們可以通過如下方式為用戶進行授權:

Java代碼

mysql> grant all on *.* to user_name@'%' identified by 'user_password';

上面的命令授予的用戶權限可以訪問mysql中的任意數據庫(database)和表(table)

完成上面的兩個步驟,重啟mysql即可在遠程登陸mysql服務器了。Mysql的重啟命令如下:

Java代碼

sudo /etc/init.d/mysql restart

上面只是簡單的一些介紹,不能包治百病,具體的情況還需要根據自己的運行環境來定,希望對大家有所幫助。

 

LinuxMySQL Error 1130 不能遠程訪問

內容簡介:遠程連接MySQL時總是報出erro 2003: Can't connect to MySQL server on '211.87.***.***' (111),昨天查了好幾個小時才找到解決方案,如下:……

最近做Linux項目用到MySQL數據庫,可是遠程連接MySQL時總是報出erro 2003: Can't connect to MySQL server on '211.87.***.***' (111),昨天查了好幾個小時才找到解決方案,如下:

 

1.sudo gedit /etc/mysql.my.cnf

 

找到bind-address =127.0.0.1

 

修改為bind-address =0.0.0.0

 

2.sudo /etc/init.d/ mysql restart

 

在這種情況下如果再嘗試遠程連接,則會報出ERROR 1130 (HY000): Host '211.87.***.***'is not allowed to connect to this MySQL server提示信息,不能遠程連接數據庫。

 

MySQL host上按如下命令操作

 

mysql -u root -ppassword //進入mysql控制台

 

mysql>use mysql;

 

mysql>update user set host = '%' where user = 'root'; //這個命令執行錯誤時可略過

 

mysql>flush privileges;

 

mysql>select host, user from user; //檢查‘%’ 是否插入到數據庫中

 

mysql>quit

 

 

http://dev.firnow.com/course/3_program/c++/cppjs/20091024/179951_3.html

Linux下使用C/C++訪問數據庫——MySQL

文章出處:飛諾網(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/20091024/179951.html

本文出自 “玄武·巴依” 博客

 

最近打算寫一套OA系統,為了方便進行數據庫操作,特意抽出一周的時間來研究C/C++訪問各種數據庫的方法,並打算封裝一套數據庫操作類,現在奉上最簡單的一部分:在Linux下訪問MySQL數據庫。

本文中使用的MySQL API代碼為C語言,如果各位對C++有興趣,可以考慮使用mysql++

一、配置開發環境

 

首先需要編譯、安裝MySQL,安裝完成后,將MySQL目錄中的lib目錄添加到環境變量中。

新建C/C++工程,把$MYSQL_ROOT/include添加到編譯環境的包含路徑下面。在編譯選項中,增加$MYSQL_ROOT/lib目錄。在Link選項中增加-lmysqlclient(已經把lib目錄增加到系統環境變量中),或者直接引用libmysqlclient.so文件。

 

二、程序代碼

 

不多說了,直接上代碼,注釋都很詳細。

 

/*

* MySQLManager.h

*

* Created on: Feb 18, 2009

* Author: Steven Wee

*/

 

#ifndef MYSQLMANAGER_H_

#define MYSQLMANAGER_H_

 

#include "../Common/CheckStringTools.h"

 

#include <mysql.h>

 

#include <string>

#include <iostream>

#include <vector>

 

#include <string.h>

 

using namespace std;

 

class MySQLManager

{

public:

/*

* Init MySQL

* @param hosts: Host IP address

* @param userName: Login UserName

* @param password: Login Password

* @param dbName: Database Name

* @param port: Host listen port number

*/

MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);

~MySQLManager();

void initConnection();

/*

* Making query from database

* @param mysql: MySQL Object

* @param sql: Running SQL command

*/

bool runSQLCommand(std::string sql);

/**

* Destroy MySQL object

* @param mysql MySQL object

*/

void destroyConnection();

bool getConnectionStatus();

vector< vector<string> > getResult();

protected:

void setUserName(std::string userName);

void setHosts(std::string hosts);

void setPassword(std::string password);

void setDBName(std::string dbName);

void setPort(unsigned int port);

private:

bool IsConnected;

vector< vector<string> > resultList;

MYSQL mySQLClient;

unsigned int DEFAULTPORT;

char * HOSTS;

char * USERNAME;

char * PASSWORD;

char * DBNAME;

};

 

#endif /* MYSQLMANAGER_H_ */

 

/*

* MySQLManager.cpp

*

* Created on: Feb 18, 2009

* Author: Steven Wee

*/

#include "MySQLManager.h"

 

MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port)

{

IsConnected = false;

this ->setHosts(hosts); // 設置主機IP地址

this ->setUserName(userName); // 設置登錄用戶名

this ->setPassword(password); // 設置登錄密碼

this ->setDBName(dbName); // 設置數據庫名

this ->setPort(port); // 設置端口號

}

 

MySQLManager::~MySQLManager()

{

this ->destroyConnection();

}

 

void MySQLManager::setDBName(string dbName) &nbs

p;

{

if ( dbName.empty() )

{// 用戶沒有指定數據庫名

std::cout << "DBName is null! Used default value: mysql" << std::endl;

this ->DBNAME = new char[5];

strcpy(this ->DBNAME, "mysql");

}

else

{

this ->DBNAME = new char[dbName.length()];

strcpy(this ->DBNAME, dbName.c_str());

}

}

 

void MySQLManager::setHosts(string hosts)

{

if ( hosts.empty() )

{// 用戶沒有指定數據庫IP地址

std::cout << "Hosts is null! Used default value: localhost" << std::endl;

this ->HOSTS = new char[9];

strcpy(this ->HOSTS, "localhost");

}

else

{

this ->HOSTS = new char[hosts.length()];

strcpy(this ->HOSTS, hosts.c_str());

}

}

 

void MySQLManager::setPassword(string password)

{// 用戶沒有指定密碼

if ( password.empty() )

{

std::cout << "Password is null! Used default value: " << std::endl;

this ->PASSWORD = new char[1];

strcpy(this ->PASSWORD, "");

}

else

{

this ->PASSWORD = new char[password.length()];

strcpy(this ->PASSWORD, password.c_str());

}

}

 

void MySQLManager::setPort(unsigned int port)

{// 用戶沒有指定端口號,使用默認端口號

if ( port )

{

std::cout << "Port number is null! Used default value: 0" << std::endl;

this ->DEFAULTPORT = 0;

}

else

{

this ->DEFAULTPORT = port;

}

}

 

void MySQLManager::setUserName(string userName)

{// 用戶沒有指定登錄用戶名

if ( userName.empty() )

{

std::cout << "UserName is null! Used default value: root" << std::endl;

this ->USERNAME = new char[4];

strcpy(this ->USERNAME, "root");

}

else

{

this ->USERNAME = new char[userName.length()];

strcpy(this ->USERNAME, userName.c_str());

}

}

 

void MySQLManager::initConnection()

{

if ( IsConnected )

{// 已經連接到服務器

std::cout << "Is connected to server!" <<std::endl;

return;

}

mysql_init(&mySQLClient);// 初始化相關對象 &n

bsp;

if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, 0) )

{// 連接到服務器

std::cout << "Error connection to database: %s\n" << mysql_error(&mySQLClient) << std::endl;

}

IsConnected = true;// 修改連接標識

}

 

bool MySQLManager::runSQLCommand(string sql)

{

if ( !IsConnected )

{// 沒有連接到服務器

std::cout << "Not connect to database!" << std::endl;

return false;

}

if ( sql.empty() )

{// SQL語句為空

std::cout << "SQL is null!" << std::endl;

return false;

}

 

MYSQL_RES *res;

MYSQL_ROW row;

 

unsigned int i,j = 0;

 

StringTools stringTools;

sql = stringTools.filterString(sql);

 

i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));// 執行查詢

if ( i )

{

std::cout << "Error query from database: %s\n" << mysql_error(&mySQLClient) << std::endl;

return false;

}

res = mysql_store_result(&mySQLClient);

vector<string> objectValue;

while( (row = mysql_fetch_row(res)) )

{// 遍歷結果集

objectValue.clear();

for ( j = 0 ; j < mysql_num_fields(res) ; j++ )

{

objectValue.push_back(row[j]);

}

this ->resultList.push_back(objectValue);

}

mysql_free_result(res); //free result after you get the result

 

return true;

}

 

vector< vector<string> > MySQLManager::getResult()

{

return resultList;

}

 

void MySQLManager::destroyConnection()

{

mysql_close(&mySQLClient);

this ->IsConnected = false;

}

 

bool MySQLManager::getConnectionStatus()

{

return IsConnected;

}

 

 

三、修改建議

 

本人在以后的完善中,打算把runSQLCommand(char * sql)函數分解成兩個或者三個函數,分別執行selectinsert等語句。

在程序中,我並沒有強制要求參數必須為const,可能會出現一些安全問題。

本文僅起拋磚引玉的作用,希望有高手可以指點我程序中的問題。

通過VC開發MySQL數據庫應用軟件有多種方式:  
 
一、通過MyODBC界面  
 
二、通過Connector/C++l界面  
 
三、通過MySQL   C   API界面  
 
四、第三方封裝的MySQL類  
   
 
在經過反復比較,我還是選擇了MySQL   C   API方式來進行MySQL的開發。  
 
VC中使用MySQL的步驟如下:  
   
  1
、下載MySQL的服務器/客戶端安裝包  
 
官方下載地址如下:  
  http://www.mysql.com/downloads/mysql-4.0.html  
 
由於我的開發環境是Windows,所以我下載的是MySQL   for   Windows   V4.0.12  
   
  2
、安裝MySQL服務器/客戶端包  
 
一般情況,選擇下一步就行了。  
 
默認情況,MySQL會安裝到C:\mysql下。  
   
  3
、在VC中設置其開發環境  
  a.
設置包含路徑為c:\mysql\include  
  b.
設置引用路徑為c:\mysql\include  
  c.
設置庫路徑為c:\mysql\lib\debug  
  d.
設置鏈接器-輸入-附加依賴項為libmySQL.lib  
  e.
stdafx.h中加入以下行:  
  #include   <winsock.h>  
  #include   "mysql.h"  
   
  4
、至此就可以使用C   API函數進行開發了。  
   
  MySQL
提供了很多函數來對數據庫進行操作,大致可以分為以下幾類:  
   
 
第一部分   控制類函數  
   
  mysql_init()
初始化MySQL對象   

  mysql_options()
設置連接選項    //字符集的轉換. 要注意當漢字寫到mysql時設這個選項 就好了,unsinged int  ret = mysql_options(myData, MYSQL_SET_CHARSET_NAME, "gb2312");  不要設就會寫進去亂碼.

  mysql_real_connect()
連接到MySQL數據庫  
   
  mysql_real_escape_string()
將查詢串合法化  
  mysql_query()
發出一個以空字符結束的查詢串  
  mysql_real_query()
發出一個查詢串  
   
  mysql_store_result()
一次性傳送結果  
  mysql_use_result()
逐行傳送結果  
   
  mysql_free_result()
釋放結果集  
   
  mysql_change_user()
改變用戶  
  mysql_select_db()
改變默認數據庫  
   
  mysql_debug()
送出調試信息  
  mysql_dump_debug_info()
轉儲調試信息  
   
  mysql_ping()
測試數據庫是否處於活動狀態  
  mysql_shutdown()
請求數據庫SHUTDOWN  
   
  mysql_close()
關閉數據庫連接  
   
 
第二部分   信息獲取類函數  
  mysql_character_set_name()
獲取默認字符集  
  mysql_get_client_info()
獲取客戶端信息  
  mysql_host_info()
獲取主機信息  
  mysql_get_proto_info()
獲取協議信息  
  mysql_get_server_info()
獲取服務器信息  
  mysql_info()
獲取部分查詢語句的附加信息  
  mysql_stat()
獲取數據庫狀態  
   
  mysql_list_dbs()
獲取數據庫列表  
  mysql_list_tables()
獲取數據表列表  
  mysql_list_fields()
獲取字段列表  
   
 
第三部分   行列類操作函數  
  mysql_field_count()
獲取字段數  
  mysql_affected_rows()
獲取受影響的行數  
  mysql_insert_id()
獲取AUTO_INCREMENT列的ID值  
   
  mysql_num_fields()
獲取結果集中的字段數  
  mysql_field_tell()
獲取當前字段位置  
  mysql_field_seek()
定位字段  
  mysql_fetch_field()
獲取當前字段  
  mysql_fetch_field_direct()
獲取指定字段  
  mysql_frtch_fields()
獲取所有字段的數組  
   
   
   
  mysql_num_rows()
獲取行數  
  mysql_fetch_lengths()
獲取行長度  
  mysql_row_tell()
獲取當前行位置  
  mysql_row_seek()
行定位  
  mysql_data_seek()
行定位  
  mysql_fetch_row()
獲取當前行  
   
   
 
第四部分   線程類操作函數  
  mysql_list_processes()
返回所有線程列表  
  mysql_thread_id()
獲取當前線程ID  
  mysql_thread_safe()
是否支持線程方式  
  mysql_kill()
殺列一個線程  
   
   
 
第五部分   出錯處理類函數  
  mysql_errno()
獲取錯誤號  
  mysql_error()
獲取錯誤信息  
   
 
第六部分   已過時的函數  
  mysql_connect()  
  mysql_create_db()  
  mysql_drop_db()  
  mysql_eof()  
  mysql_reload()  
  mysql_escape_string()    
   
   
 
以上是我的一點筆記,當然還有操作的標准代碼,正在整理中。  

【共享】一個LINUX下操作mysqlC++接口

//MYSQL數據庫操作模塊類
#include <mysql.h>

MYSQL mydb;
MYSQL_RES *res;
MYSQL_ROW myrow;

void *mysqlDllHandler;//mysql dll
句柄
const char *dllError;//dll
錯誤信息
char *sysMsg;//
系統信息

//MYSQL
接口函數
//
數據庫連接
MYSQL *(*mysqlConnect)(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int clientflag);
//
數據庫查詢
int (*mysqlQuery)(MYSQL *mysql, const char *q);

//
結果數
my_ulonglong (*mysqlNumRows)(MYSQL_RES *res);

//
數據結果集
MYSQL_RES *(*mysqlStoreResult)(MYSQL *mysql);
//
單條結果
MYSQL_ROW (*mysqlFetchRow)(MYSQL_RES *result);
//
關閉數據庫、釋放內存空間
void (*mysqlFreeResult)(MYSQL_RES *result);

//
打開mysql動態共享庫,並進行初始模塊
void initMysql()
{
mysqlDllHandler=dlopen("/data1/webshop/www/cgi-bin/app/bbs/libmysqlclient.cdll",RTLD_LAZY);//
打開mysql動態共享庫
if(!mysqlDllHandler)
{
sysMsg="Open libmysqlclient.cdll file failed!";
sysInternalError(sysMsg);
}

//
打開外部接口函數
mysqlConnect=(MYSQL *(*)(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned int clientflag))dlsym(mysqlDllHandler,"mysql_real_connect");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_real_connect failed!";
sysInternalError(sysMsg);
}

mysqlQuery=(int (*)(MYSQL *mysql, const char *q))dlsym(mysqlDllHandler,"mysql_query");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_query failed!";
sysInternalError(sysMsg);
}

mysqlNumRows=(my_ulonglong (*)(MYSQL_RES *res))dlsym(mysqlDllHandler,"mysql_num_rows");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_num_rows failed!";
sysInternalError(sysMsg);
}

mysqlStoreResult=(MYSQL_RES *(*)(MYSQL *mysql))dlsym(mysqlDllHandler,"mysql_store_result");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_store_result failed!";
sysInternalError(sysMsg);
}

mysqlFetchRow=(MYSQL_ROW (*)(MYSQL_RES *result))dlsym(mysqlDllHandler,"mysql_fetch_row");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_fetch_row failed!";
sysInternalError(sysMsg);
}

mysqlFreeResult=(void (*)(MYSQL_RES *result))dlsym(mysqlDllHandler,"mysql_free_result");
dllError=dlerror();
if(dllError)
{
sysMsg="Open libmysqlclient.cdll's function mysql_free_result failed!";
sysInternalError(sysMsg);
}

}

 

 

rpm包安裝的MySQL是不會安裝/etc/my.cnf文件的,

至於為什么沒有這個文件而MySQL卻也能正常啟動和作用,在點有兩個說法,

第一種說法,my.cnf只是MySQL啟動時的一個參數文件,可以沒有它,這時MySQL會用內置的默認參數啟動,

第二種說法,MySQL在啟動時自動使用/usr/share/mysql目錄下的my-medium.cnf文件,這種說法僅限於rpm包安裝的MySQL

解決方法,只需要復制一個/usr/share/mysql目錄下的.cnf文件到/etc目錄,並改名為my.cnf即可。

 

Mysql默認只能本機訪問.如果需要其他機器遠程訪問,需要設置

1> 增加一個用戶, 用來進行遠程登陸.用上方法6中的localhost登陸mysql,執行sql語句" GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; "增加一個用戶名為myuser,密碼為mypassword.其中的"%"表示所有機器都可以訪問.用上方法4重新啟動MySql. /etc/init.d/mysql restart 

 

2> 這樣過后,在本機上可以用命令"mysql -h <自己機器的IP> -u myuser -p"來登陸MySql.說明設置成功

 

3> 最重要一點.你這個時候可以發現,在本機器上可以連接MySql.但是在其他機器上用相同方法,會出現" Can't connect to MySQL server on '9.186.100.178' (10065)"的錯誤.分析原因是AS4的防火牆導致.用下面方法設置防火牆:打開文件/etc/sysconfig/iptables,在最后一條之前加一條:-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT. 然后執行 /etc/init.d/iptables restart. 至此設置AS4防火牆完畢.

 

現在,您就可以在其他的機器上用MySqlclient端訪問該數據庫了,登陸方法還是"mysql -h <IP> -u myuser -p".但如果總用這個控制台管理總不爽,建議用一些管理軟件管理就很不錯了,本人用的是MySQL-Front,很不錯的軟件.可以試試.大家有什么問題,請指出,謝謝

 

 

問題

 

1) 出現以下DEBUG信息時:

 

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_close@4

 

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_select_db@8

 

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_real_connect@32

 

TestNewSql.obj : error LNK2001: unresolved external symbol _mysql_init@4

 

解決方法:

 

VC工程中project—>setting—>link—>object/library modules中添加:

 

libmysql.lib,然后編譯就可以通過了

 

2) 如果是在其他文件中引用的,在tools —>options —>directories—>show directories for :include files對應的項目中包含這些頭文件。

 

3) 編譯通過后,在運行時彈出對話框找不到libmysql.dll文件,在所安裝的mysql目錄下的lib\debug目錄下可以找到該文件。將其復制到編譯好的release/debug目錄下即可。或是通過“控制面板”—>“系統” —>“高級”—>“環境變量”—>“系統變量”—>“paht”中添加D:\mysql\lib\debug。注:d:\mysql為筆者安裝的mysql目錄。

 

4) 如果出現以下編譯問題

 

error C2146: syntax error : missing ';' before identifier 'fd'

 

這是mysql_com.h中出現的問題。如果將這句聲明注釋掉,下面會出現這個編譯問題:

 

error C2065: 'SOCKET' : undeclared identifier

 

可以將int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,unsigned int timeout);該函數注釋掉。或在包含mysql.h之前包含winsock.h.

 

則編譯可以通過。

 

出現的原因分析:在用VC向導生成文檔/視圖時,在第四步中應該選擇windows sockets。不然編譯時就會出現上述問題。

 

最好的解決方式是在stdafx.h文件中添加#include <afxsock.h>,即可解決上述問題。

 

5) 如果連接數據庫時,出現不能連接的情況時,則應該將所在網絡斷開。出現問題的原因同上。

 

如果是數據庫連接錯誤的話,則因為在MYSQL *STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int clientflag);

 

對於passwd應該設置為NULL。對於user可以隨意設置。

 

原因暫時不清楚。

 

上述情況下只能對用戶使用“root”和,就可以連接數據庫了。

 

a. 如果以其他用戶的身份,則需要添加相應的用戶和密碼。

 

步驟一:在命令行方式下運行MYSQL

 

格式: mysql -h主機地址 -u用戶名 -p用戶密碼

 

例如:連接到本機上的MYSQL

 

首先在打開DOS窗口,然后進入目錄 mysqlbin,再鍵入命令mysql -uroot -p,回車后提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql>

 

2、例2:連接到遠程主機上的MYSQL。假設遠程主機的IP為:110.110.110.110,用戶名為root,密碼為abcd123。則鍵入以下命令:

 

mysql -h110.110.110.110 -uroot -pabcd123

 

步驟二:增加新用戶

 

格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by "密碼"

 

1、增加一個用戶test1密碼為abc,讓他可以在任何主機上登錄,並對所有數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入MYSQL,然后鍵入以下命令:

 

grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

 

但例1增加的用戶是十分危險的,你想如某個人知道test1的密碼,那么他就可以在internet上的任何一台電腦上登錄你的mysql數據庫並對你的數據可以為所欲為了,解決辦法見例2

 

2、增加一個用戶test2密碼為abc,讓他只可以在localhost上登錄,並可以對數據庫mydb進行查詢、插入、修改、刪除的操作(localhost指本地主機,即MYSQL數據庫所在的那台主機),這樣用戶即使用知道test2的密碼,他也無法從internet上直接訪問數據庫,只能通過MYSQL主機上的web頁來訪問了。 grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc"

 

 

 

 

 

例子:

 

(1)程序

 

#include <stdio.h>

#include <stdlib.h>

#include <winsock.h>

//#include <afxsock.h>

#include "mysql.h"

int main(int avgc,char *argv[]){

MYSQL *conn_ptr;

conn_ptr = mysql_init(NULL);

if(!conn_ptr){

fprintf(stderr,"mysql init failed/n");

return EXIT_FAILURE;

}

conn_ptr = mysql_real_connect(conn_ptr,"172.20.97.228","root","qwertyuiop","mysql",3306,NULL,0);

if(conn_ptr){

printf("Connection success/n");

}else{

printf("Connection failed/n");

}

mysql_close(conn_ptr);

return EXIT_SUCCESS;

}

2)工程-連接-對象/模塊中加入libmysql.lib

 

3)將Mysql目錄下的lib\debug下的libmysql.dll復制到程序編譯后的debug文件夾里

 

VCMySQL編程

一、在你的程序中使用數據庫是不錯的注意。如果已經有可用的MySQL服務器,在VC中可以按照如下方法實現與數據庫的連接。
1
、找來MySQL(Win32)安裝目錄下的include文件夾,將其添加到VC頭文件目錄列表中;
VC6 -> Options -> Directories -> 加入此目錄)
VC2005 -> 工具 -> 選擇 ->項目和解決方案 -> VC++目錄 -> 顯示以下內容的目錄 -> 包含文件 -> 加入此目錄)2、找來MySQL(Win32)安裝目錄下的lib文件夾,將 其添加到VC庫文件目錄列表中;
VC6 -> Options -> Directories -> 加入此目錄)
VC2005 -> 工具 ->選擇 -> 項目和解決方案 -> VC++目錄 -> 顯示以下內容的目錄 -> 庫文件 -> 加入此目錄,注意是lib\debuglib\opt
3
、新建一個工程,參考如下代碼:
// mysql.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
#include <windows.h>
#pragma comment(lib, "libmysql.lib")
int main(int argc, char* argv[])
{
    unsigned short Port = 3306;
    char *IPAddress = "192.168.31.56";
    char *UserName = "root";
    char *Password = "";
    char *DBName = "SAS_1_2_0";
    printf("Start... ");

    MYSQL *ssock;
    //char execsql[500];
    ssock = (MYSQL *)malloc(sizeof(MYSQL));   
    //
在某些版本中,不需要該初始化工作,可觀看mysql.H以及readme
    mysql_init(ssock);
    if(ssock == NULL)
    {
        printf("EROR: MySQL ssock init error. ");
        return FALSE;
    }

    //
連接到指定的數據庫
    ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);
    if(!ssock)
    {
        printf("conn fail... ");
        //memcpy(eee, mysql_error(ssock), 20);
        //fprintf(stderr, "Failed to connect to database: Error: %s ", mysql_error(ssock));
       
        //printf("%c ", eee);
        unsigned int mtint = mysql_errno(ssock);
        //printf("%d ");
        return FALSE;
    }
    if(mysql_select_db(ssock, DBName) != 0)
    {
        printf("select db error. ");
        return FALSE;
    }
    printf("version=%d ", mysql_get_server_version(ssock));
    //exec my execsql string
    //sprintf(execsql,"create table girls (name char(10),age int)");
    //mysql_real_query(ssock,execsql,strlen(execsql));
    mysql_close(ssock);
    printf("End... ");
    return TRUE;
}

、怎樣用c/c++編程連接mysql數據庫
    
執行一個查詢有以下幾個步驟要做。首先執行一個查詢,然后保存結果,  
  
得到的是一個子集。這里是一個小例子:  
#include    <stdio.h>  
#include    
#include   <mysql.h>
MYSQL   mysql;  
MYSQL_RES   *res;  
MYSQL_ROW   row;  
void   exiterr(int   exitcode)  
{  
       fprintf(   stderr,   "%s\n",   mysql_error(&mysql)   );  
      exit(   exitcode   );  
}  
int   main()  
{  
        uint   i   =   0;  
        if   (!(mysql_connect(&mysql,"host","username","password")))    
                 exiterr(1);   
        if   (mysql_select_db(&mysql,"payroll"))  
             exiterr(2);   
        if   (mysql_query(&mysql,"SELECT   name,rate   FROM   emp_master"))  
             exiterr(3);  
       if   (!(res   =   mysql_store_result(&mysql)))  
             exiterr(4);   
         while((row   =   mysql_fetch_row(res)))   {  
             for   (i=0   ;   i   <   mysql_num_fields(res);   i++)    
                  printf("%s\n",row[i]);   
         }  
        mysql_free_result(res);  
       mysql_close(&mysql);  
   }  
       mysql_query  
函數將把查詢送給服務器,如果查詢成功,調用mysql_store_result 函數將分配一個MYSQL_RES   結構並且重新從服務器獲得一個結果集。
      
你可以用mysql_fetch_row   函數來查看數據。這樣做你將獲得一個   MYSQL_ROW   指針指向數據中的一行。   MYSQL_ROW   指針是一簡單的字符串數組。所有的數據類型被轉換成字符串送到客戶端。  
      mysql_num_fields
函數將告訴你返回的列數。你可以繼續調用mysql_fetch_row直到它返回一個空指針以得到查詢中的每一行。  
       
注意在這個例子里,我們沒有檢查有空指針的列。如果你不使用非空列的表,那么你必須檢查一個特殊行的列是否為空。一旦你使用完畢一個結果集,你必須釋放它。這通過   mysql_free_result   來完成。  
      
最后調用mysql_close來關閉你和數據庫之間的連接。  
      
查看結果集你可以不用調用mysql_fetch_row就查出返回的結果集共有多少行。這由
      int   mysql_num_rows(MYSQL_RES   *result)
來完成。  
      
改變到被下一個   mysql_fetch_row   調用返回的行,你可以用void   mysql_data_seek(MYSQL_RES   *res,   uint   offset)   改變到任意一行。 獲得更多的信息 你可以使用這幾個額外的函數來找出關於一個查詢的更多的信息,並從服務器獲得這些信息。  
       
如果你執行一個UPDATE,   INSERT   或者   DELETE   查詢,你可以用int   mysql_affected_rows   來查出共有多少行數據被你影響到。  
     
如果在你的數據庫里有二進制數據,那么得知數據的長度將是有用的。unsigned   int   *mysql_fetch_lengths(MYSQL_RES   *mysql)   將返回一指出了結果集中每一列 的長度的整型數組。  
   
當你插入一個帶有   AUTO_INCREMENT   列的表的時候,你可以用int   mysql_insert_id(MYSQL   *mysql)   來查出生成的那一行的ID。  
======================

int main()
{
   MYSQL mysql;
    MYSQL_RES * res ;
    MYSQL_FIELD * fd ;
    MYSQL_ROW row ;
   int id[10000];
    double result[10000][8];
   vector<string> v;

    if(mysql_init(&mysql) == NULL)
    {
      std::cout<<"init mysql data status fail"<<std::endl;
        return false;
}
else
{
   std::cout<<"init mysql data status success"<<std::endl;
}

if(NULL == mysql_real_connect(&mysql,"localhost","root","","wsnss",MYSQL_PORT,NULL,0))
{
   std::cout<<"connect database fail"<<std::endl<<mysql_error(&mysql)<<std::endl;;
   return false;
}
else{
   std::cout<<"connect database success"<<std::endl;
}

char   szSqlText[500]="";
int j = 0;

sprintf(szSqlText,"%s","select * from data_receive ");
if (mysql_query( &mysql, szSqlText))
//
進行數據檢索
{
     //
執行SQL語句出錯
   cout<<"query error"<<endl;
   mysql_close( &mysql ) ;
   return FALSE ;
}
    else
    {
   res = mysql_store_result( &mysql ) ;
   int i;   
   while((row   =   mysql_fetch_row(res)))   {
    id[j] = atoi(row[0]);
    for   (i = 1; i < mysql_num_fields(res); i++)  
    {
     result[j][i-1] = atof(row[i]);
    }
    j++;
   }
    }  
  
  
for(int i = 0 ; i < 10000; i++)
{
   if(i>=j)
    break;
   char str[10000];
   stringstream ss;

        ss<<"insert into data_receive(ID,data1,data2,data3, data4,data5,data6,data7,data8)values('"<<id[i]<<"','"<<
    result[i][0]<<"','"<<result[i][1]<<"','"<<result[i][2]<<"','"<<
    result[i][3]<<"','"<<result[i][4]<<"','"<<result[i][5]<<"','"<<
    result[i][6]<<"','"<<result[i][7]<<"');";
   string s = ss.str();
   v.push_back(s);  
}
for(vector<string>::iterator iter = v.begin(); iter != v.end(); ++iter)
{
  
   if(mysql_query(&mysql,(*iter).c_str())!=0)
   {
    std::cout<<"execute insert syntax fail"<<
      std::endl<<mysql_error(&mysql)<<endl;
    mysql_close(&mysql);
    return 1;
   }
}
    mysql_free_result(res);
    mysql_close(&mysql);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM