shape1
shape2
shape3
shape4
shape7
shape8

Не подключает мод к Базе Данных MySQL


Статус
Закрыто для дальнейших ответов.

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
Доброго времени суток.
Писал код под MySQL по видео мануалу, на просторах интернета.

По завершению мануала все получилось в точности как у автора, но с одним неприятным НО.
Мой мод не подключается к созданной базе данных, помогите разобраться новичку пожалуйста.

Код:
#define MYSQL_LOG 1
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_BASE "palacerp"
#define MYSQL_PASSWORD ""
Код:
stock mysql_connects()
{
dbHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_BASE, MYSQL_PASSWORD);
  if(mysql_errno()) print("Подключение к базе данных MYSQL успешно");
else print("Подключение к базе данных MYSQL НЕ успешно");
   mysql_log(LOG_ALL);
}
 

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
Замените stock mysql_connects() на:

stock mysql_connects()
{
dbHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_BASE, MYSQL_PASSWORD);
switch(mysql_errno(dbHandle))
{
case 0: printf("Подключение к базе данных состоялось успешно.");
case 1044: printf("При подключении к базе данных возникла ошибка: неверное имя пользователя.");
case 1045: printf("При подключении к базе данных возникла ошибка: неверный пароль.");
case 1049: printf("При подключении к базе данных возникла ошибка: неверное имя базы данных.");
case 2003: printf("При подключении к базе данных возникла ошибка: хостинг не отвечает");
case 2005: printf("При подключении к базе данных возникла ошибка: неизвестный адрес хостинга.");
default: printf("При подключении к базе данных возникла ошибка. Код ошибки: %d.", mysql_errno(dbHandle));
}
mysql_log(LOG_ALL);
return true;
}

И смотрите что пишет в логах.

 

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
Заменил.

В логах пишет то же самое, что и до замены.

Код:
[20:59:36] [ERROR] mysql_connect - empty connection data specified[20:59:36] [ERROR] "mysql_errno" - invalid connection handle (id: 1)
@Elrmrnt-Kritik,

Так же после замены появился варнинг в строке switch(mysql_errno(dbHandle))

Код:
warning 217: loose indentation
 
Последнее редактирование модератором:

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
@Elrmrnt-Kritik

Логи MySQL

[00:30:01] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[00:30:01] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[00:30:01] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
[00:30:01] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
[00:30:01] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
[00:30:24] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
[00:30:24] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[00:30:24] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[00:30:24] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'root'@'localhost' (using password: YES)
[00:30:55] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[00:30:55] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[00:30:55] [DEBUG] CMySQLConnection::Connect - connection was successful
[00:30:55] [DEBUG] CMySQLConnection::Connect - connection was successful
[00:30:55] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[00:30:55] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[00:30:55] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[00:31:55] [DEBUG] mysql_tquery - connection: 1, query: "SELECT 'id' FROM 'accounts' WHERE 'login' = 'Mark_Daniels'", callback: "player_check", format: "ii"
[00:31:55] [DEBUG] CMySQLQuery::Execute[player_check] - starting query execution
[00:31:55] [ERROR] CMySQLQuery::Execute[player_check] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''accounts' WHERE 'login' = 'Mark_Daniels'' at line 1
[00:31:55] [DEBUG] CMySQLQuery::Execute[player_check] - error will be triggered in OnQueryError
[00:31:55] [DEBUG] Calling callback "OnQueryError"..

Логи сервера

Код:
----------
Loaded log file: "server_log.txt".
----------

SA-MP Dedicated Server
----------------------
v0.3e, (C)2005-2012 SA-MP Team

[00:30:55] filterscripts = ""  (string)
[00:30:55] 
[00:30:55] Server Plugins
[00:30:55] --------------
[00:30:55]  Loading plugin: dc_cmd
[00:30:55]   Daniel's CMD plugin v2.8
[00:30:55]     (c) 2014 Daniel_Cortez
[00:30:55] 	www.pro-pawn.ru
[00:30:55]   Loaded.
[00:30:55]  Loading plugin: mysql
[00:30:55]  >> plugin.mysql: R39-2 successfully loaded.
[00:30:55]   Loaded.
[00:30:55]  Loading plugin: sscanf
[00:30:55] 

[00:30:55]  ===============================

[00:30:55]       sscanf plugin loaded.     

[00:30:55]          Version:  2.8.1        

[00:30:55]    (c) 2012 Alex "Y_Less" Cole  

[00:30:55]  ===============================

[00:30:55]   Loaded.
[00:30:55]  Loading plugin: streamer
[00:30:55] 

*** Streamer Plugin v2.7.4 by Incognito loaded ***

[00:30:55]   Loaded.
[00:30:55]  Loaded 4 plugins.

[00:30:55] 
[00:30:55] Filterscripts
[00:30:55] ---------------
[00:30:55]   Loaded 0 filterscripts.

[00:30:55] Подключение к базе данных состоялось успешно.
[00:30:55] 
----------------------------------
[00:30:55] -------------Palace Rp------------
[00:30:55] ----------------------------------

[00:30:55] Number of vehicle models: 1
[00:31:55] Incoming connection: 127.0.0.1:53250
[00:31:55] [join] Mark_Daniels has joined the server (0:127.0.0.1)
[00:33:06] [part] Mark_Daniels has left the server (0:1)
 

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
@Elrmrnt-Kritik,

Заранее извиняюсь если что-то лишнее приложил,я в этом деле новичок.
 

Код:
forward player_connect(playerid);
public player_connect(playerid)
{
	new query[48+24];
	format (query, sizeof(query), "SELECT 'id' FROM 'accounts' WHERE 'login' = '%s'", sendername(playerid));
	mysql_function_query(dbHandle, query, true, "player_check", "ii", playerid, 0);
	return 1;
}
forward player_check(playerid);
public player_check(playerid)
{
	new rows[2];
	cache_get_data(rows[0], rows[1]);
	if (rows[0]) show_login(playerid);
	else show_register(playerid);
	return 1;
}
forward player_login(playerid);
public player_login(playerid)
{
	new rows[2], temp [128];
	cache_get_data(rows[0], rows[1]);
	if(rows[0])
	{
	    cache_get_field_content(0, "id", temp), player_info[playerid][ID] = strval(temp);
	}
}
 

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
mysql_function_query(dbHandle, query, true, "player_check", "i", playerid);
Мне нужно добиться вызова окна регистрации при заходе в игру, уже прописанного в коде, но этого не происходит.

Аккаунт не создается в Базе данных, созданной мной в phpAdmins MySQL.

 

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
@Elrmrnt-Kritik

Да, естественно.
Заменил, перепроверил.
На всякий случай Логи MySQL

Код:
[01:23:27] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[01:23:27] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[01:23:27] [DEBUG] CMySQLConnection::Connect - connection was successful
[01:23:27] [DEBUG] CMySQLConnection::Connect - connection was successful
[01:23:27] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[01:23:27] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[01:23:27] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[01:24:02] [DEBUG] mysql_tquery - connection: 1, query: "SELECT 'id' FROM 'accounts' WHERE 'login' = 'Mark_Daniels'", callback: "player_check", format: "i"
[01:24:02] [DEBUG] CMySQLQuery::Execute[player_check] - starting query execution
[01:24:02] [ERROR] CMySQLQuery::Execute[player_check] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''accounts' WHERE 'login' = 'Mark_Daniels'' at line 1
[01:24:02] [DEBUG] CMySQLQuery::Execute[player_check] - error will be triggered in OnQueryError
[01:24:02] [DEBUG] Calling callback "OnQueryError"..
 

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
format (query, sizeof(query), "SELECT `id` FROM `accounts` WHERE `login` = '%s'", sendername(playerid));
Данная поправка стала вызывать прописанное окно регистрации аккаунта.

Но после прохождения регистрации,не создался аккаунт в самой БД MySQL

Логи:

Код:
[01:36:43] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[01:36:43] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[01:36:43] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[01:36:43] [DEBUG] CMySQLConnection::Connect - connection was successful
[01:36:43] [DEBUG] CMySQLConnection::Connect - connection was successful
[01:36:43] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[01:36:43] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[01:37:07] [DEBUG] mysql_tquery - connection: 1, query: "SELECT `id` FROM `accounts` WHERE `login` = 'Mark_Daniels'", callback: "player_check", format: "i"
[01:37:07] [DEBUG] CMySQLQuery::Execute[player_check] - starting query execution
[01:37:07] [DEBUG] CMySQLQuery::Execute[player_check] - query was successfully executed within 0.574 milliseconds
[01:37:07] [DEBUG] CMySQLResult::CMySQLResult() - constructor called
[01:37:07] [DEBUG] Calling callback "player_check"..
[01:37:07] [DEBUG] cache_get_data - connection: 1
[01:37:07] [DEBUG] CMySQLResult::~CMySQLResult() - deconstructor called
[01:37:29] [DEBUG] mysql_escape_string - source: "qwerty12345", connection: 1, max_len: 16
[01:37:29] [DEBUG] mysql_tquery - connection: 1, query: "INSERT INTO 'accounts' ('login', 'password') VALUES ('Mark_Danie", callback: "(null)", format: "(null)"
[01:37:29] [DEBUG] mysql_tquery - connection: 1, query: "SELECT * FROM 'accounts' WHERE 'login' = 'Mark_Daniels' AND 'pas", callback: "player_login", format: "i"
[01:37:29] [DEBUG] CMySQLQuery::Execute[] - starting query execution
[01:37:29] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''accounts' ('login', 'password') VALUES ('Mark_Daniels','qwerty12345')' at line 1
[01:37:29] [DEBUG] CMySQLQuery::Execute[] - error will be triggered in OnQueryError
[01:37:29] [DEBUG] CMySQLQuery::Execute[player_login] - starting query execution
[01:37:29] [ERROR] CMySQLQuery::Execute[player_login] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''accounts' WHERE 'login' = 'Mark_Daniels' AND 'password' = 'qwerty12345' LIMIT 1' at line 1
[01:37:29] [DEBUG] CMySQLQuery::Execute[player_login] - error will be triggered in OnQueryError
[01:37:29] [DEBUG] Calling callback "OnQueryError"..
[01:37:29] [DEBUG] Calling callback "OnQueryError"..
 

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
@Elrmrnt-Kritik,

Код:
stock show_register(playerid)
{
	SPD(playerid, 1 , DIALOG_STYLE_INPUT, "{0099FF}Регистрация", "Добро пожаловать на сервер Palace Role Play\nЧтобы начать игру вам необходимо пройти регистрацию\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз когда вы заходите на сервер\n\n\t\t{30DB2A}Примечания:\n\t\tПароль может состоять из русских и латинских символов\n\t\tПароль чувствителен к регистру\n\t\tДлинна пароля от 6 до 15-ти символов", "Далее", "");
} 
 

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
@SpongeBOZZ, в OnDialogResponse ищите if(dialogid == 1) или case 1 и показывайте.
 

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	switch(dialogid)
	{
	    case 1:
	    {
		if(!strlen(inputtext) || strlen(inputtext) < 6 ||strlen(inputtext) > 16)
	    	{
	            show_register(playerid);
	    	}
	    	else
	    	{
	    	    new query[128], temp[16];
    	    	mysql_real_escape_string(inputtext, temp);
    	    	format(query, sizeof(query), "INSERT INTO 'accounts' ('login', 'password') VALUES ('%s','%s')", sendername(playerid), temp);
    	    	mysql_function_query(dbHandle, query, false, "", "");
    	    	format(query, sizeof(query), "SELECT * FROM 'accounts' WHERE 'login' = '%s' AND 'password' = '%s' LIMIT 1", sendername(playerid), temp);
    	    	mysql_function_query(dbHandle, query, true, "player_login", "i", playerid);
	    	}
	    }
	}
	return 1;
}
 

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
@SpongeBOZZ, замените на это:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case 1:
{
if(!strlen(inputtext) || strlen(inputtext) < 6 ||strlen(inputtext) > 16)
show_register(playerid);
else
{
new query[128], temp[16];
mysql_real_escape_string(inputtext, temp);
format(query, sizeof(query), "INSERT INTO `accounts` (`login`, `password`) VALUES ('%s','%s')", sendername(playerid), temp);
mysql_function_query(dbHandle, query, false, "", "");
format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `login` = '%s' AND `password` = '%s' LIMIT 1", sendername(playerid), temp);
mysql_function_query(dbHandle, query, true, "player_login", "i", playerid);
}
}
}
return 1;

В апостроф (') нужно брать только типы данных в SQL запросах ('%s', '%d', '%f'), а названия таблиц, столбцов - в тальду (`). Например,

SELECT * FROM `accounts` WHERE `name` = '%s' 
:261D:  accounts и name - названия таблиц и столбцов соответственно - пишем `. '%s' - тип данных, которые мы получаем, потому используем '.

 
Последнее редактирование модератором:

SpongeBOZZ

Новичок
Пользователь
17.06.2017
0
0
0
В апостроф (') нужно брать только типы данных в SQL запросах ('%s', '%d', '%f'), а названия таблиц, столбцов - в тальду (`). Например, ? 1 SELECT * FROM `accounts` WHERE `name` = '%s'   accounts и name - названия таблиц и столбцов соответственно - пишем `. '%s' - тип данных, которые мы получаем, потому используем '.
Огромное вам спасибо, проблема решена, аккаунт добавился в БД.
Отдельное спасибо за приведенные примеры. :D83DDE0A:

 
Статус
Закрыто для дальнейших ответов.