View Single Post
Old 06/05/2019, 12:05 AM   #1
Johhnyllll
Huge Clucker
 
Johhnyllll's Avatar
 
Join Date: Sep 2014
Posts: 253
Reputation: 12
Question MySQL запросы.

Приветствую.

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

Вот код:
1. При нажатии на нужный диалог, идет запрос к БД.
PHP Code:
DialogCreate:d_user_friends(playerid) {
    
getPlayerNameFromDB(playerid,
        
P[playerid][p_friends][0] != -? (P[playerid][p_friends][0]) : (-1),
        
P[playerid][p_friends][1] != -? (P[playerid][p_friends][1]) : (-1),
        
P[playerid][p_friends][2] != -? (P[playerid][p_friends][2]) : (-1)
        );
    
printf("1:%i\n2:%i\n3:%i\n4:%i\n5:%i\n6:%i\n7:%i\n8:%i\n9:%i\n10:%i\n11:%i\n",
    
P[playerid][p_friends][0], P[playerid][p_friends][1], P[playerid][p_friends][2], P[playerid][p_friends][3], P[playerid][p_friends][4], P[playerid][p_friends][5],
    
P[playerid][p_friends][6], P[playerid][p_friends][7], P[playerid][p_friends][8], P[playerid][p_friends][9], P[playerid][p_friends][10]);

Сама функция.
Закомментированная строка, это то что я использовал до этого.
PHP Code:
stock getPlayerNameFromDB(playeriduiduid1uid2){
    new 
query[256+1];
    
// mysql_format(g_MySQL_DB, query, sizeof(query), "SELECT * FROM `accounts` WHERE `UID` = '%i';SELECT * FROM `accounts` WHERE `UID` = '%i';SELECT * FROM `accounts` WHERE `UID` = '%i';", uid, uid1, uid2);
    
mysql_format(g_MySQL_DBquerysizeof(query), "SELECT * FROM accounts WHERE UID = '%i' OR UID = '%i' OR UID = '%i';"uiduid1uid2);
    
mysql_pquery(g_MySQL_DBquery"OnMySQL_GetNameByUID""iiii"playeriduiduid1uid2);
    return 
true;

Ну и сама обработка запроса.
PHP Code:
forward OnMySQL_GetNameByUID(playeriduid0uid1uid2);
public 
OnMySQL_GetNameByUID(playeriduid0uid1uid2) {
    new 
mysql_Name[24],
    
mysql_Name1[24],
    
mysql_Name2[24];
    if(
cache_num_rows() == 0)
        return 
SendClientMessage(playerid0xB22222FF"[Справка]: {FFFFFF}Ошибка [OnMySQL_GetNameByUID].");
    else {
        new 
rowsx;
        
cache_get_row_count(rows);
        
printf("rows: %i"cache_get_row_count(rows));
        
/* new result_count;
        if(!cache_get_result_count(result_count))
            return printf("couldn't retrieve result count");

        printf("we will now go through all %d results:", result_count);
        for(new r; r < result_count; r++)
        {
            cache_set_result(r);
            new rowss = cache_num_rows();
            printf("\t%d rows in %d. result", rowss, r+1);
        } */
        
printf("num rows: %d"cache_num_rows());
        
cache_get_value_name(0"Name"mysql_Name);
        
printf("1num rows: %d"cache_num_rows());
        
cache_get_value_name(cache_get_row_count(rows) + 1"Name"mysql_Name1);
        
printf("2num rows: %d"cache_num_rows());
        
cache_get_value_name(cache_get_row_count(rows) + 1"Name"mysql_Name2);
        
printf("rows end: %i"cache_get_row_count(rows));
        
printf("name: %s | 2: %s | 3: %s"mysql_Namemysql_Name1mysql_Name2);
    }
    return 
true;

Дело в том что, если cache_get_value_name поставить от 0 до 3-х,
т.е.
PHP Code:
cache_get_value_name(0"Name"mysql_Name);
cache_get_value_name(1"Name"mysql_Name1);
cache_get_value_name(2"Name"mysql_Name2); 
Всё будет работать хорошо, но только в "идеальных" условиях, когда все ID действительны и запрос с мог их обработать.

Если например сделать недействительным уже 2 ID, дав ему число -1 или 99, то оно уже выведет ошибку: cache_get_value_name: invalid row index '2'. И даже если на 3 запросе существует такой аккаунт, он уже не пройдет как успешный.

В идеале, всё должно идти так как в БД:



В чём мой вопрос:
Как можно улучшить запросы и их получения из БД, чтобы MySQL не выдавал ошибку, даже если не нашел такого результата и продолжил выполнять "команду"?
Johhnyllll is offline   Reply With Quote