Portal SAMP
[Pedido] Comando Online e Offline - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Pedido] Comando Online e Offline (/showthread.php?tid=4903)



Comando Online e Offline - Enila182 - 19/10/2024

Eae pessoal tudo bem? como faço pra procurar no banco de dados MySQL todos os jogadores de uma organização? 
Alguém poderia me dar um exemplo de comando?

Tipo:
/pcc

Variavel da organização do banco de dados 'Org_PCC'

ai vai mostrar todos que estão nessa organização sendo offline ou online
Nick_exemplo_01 (Offiline) - Dono do PCC
Nick_exemplo_02 (Online) - Traficante


RE: Comando Online e Offline - White_Blue - 19/10/2024

Código PHP:
SELECT FROM tabela WHERE org 'nome'

A query acima deve retornar todos os dados da tabela. Daí basta você mostrar esses dados da forma que quiser para o jogador na callback da query.


RE: Comando Online e Offline - Enila182 - 19/10/2024

(19/10/2024 04:40)White_Blue Escreveu:
Código PHP:
SELECT FROM tabela WHERE org 'nome'

A query acima deve retornar todos os dados da tabela. Daí basta você mostrar esses dados da forma que quiser para o jogador na callback da query.

Você tem um exemplo de comando? Tentei fazer um aqui. só que nao da certo.

Código:
CMD:pccnew(playerid) {
    BuscarMembrosPCC(playerid);
    return 1;
}

forward BuscarMembrosPCC(playerid);
public BuscarMembrosPCC(playerid)
{
    new query[256]; // Define o tamanho da query
    format(query, sizeof(query), "SELECT Nome, Status FROM jogadores WHERE Org_PCC > 0");

    // Execute a query no banco de dados
    mysql_tquery(Conexao, query, "OnBuscarMembrosPCC", "i", playerid);
}

public OnBuscarMembrosPCC(playerid, cacheid) {
    new total_rows = cache_get_row_count(); // Pega o total de resultados

    if (total_rows == 0) {
        SendClientMessage(playerid, -1, "Nenhum membro encontrado.");
        return;
    }

    new listaMembros[1024]; // Buffer para armazenar os membros

    for (new i = 0; i < total_rows; i++)
    {
        new nome[24], status[16], orgPCC[32];
        new org_id;

        cache_get_field_content(i, "Nome", nome); // Pega o nome
        cache_get_field_content(i, "Status", status); // Pega o status (online/offline)
        org_id = cache_get_field_content_int(i, "Org_PCC"); // Pega o ID da organização

        // Verifica o cargo de acordo com o valor de Org_PCC
        switch (org_id) {
            case 1: format(orgPCC, sizeof(orgPCC), "Traficante 1");
            case 2: format(orgPCC, sizeof(orgPCC), "Traficante 2");
            case 3: format(orgPCC, sizeof(orgPCC), "Traficante 3");
            case 4: format(orgPCC, sizeof(orgPCC), "Traficante 4");
            case 5: format(orgPCC, sizeof(orgPCC), "Dono");
        }

        format(listaMembros, sizeof(listaMembros), "%s%s (%s) - %s\n", listaMembros, nome, orgPCC, (strcmp(status, "1") == 0) ? "Online" : "Offline");
    }

    // Mostra o dialog com a lista de membros
    ShowPlayerDialog(playerid, D_COMANDOS_GERAL, DIALOG_STYLE_MSGBOX, "Lista de Membros PCC", listaMembros, "Fechar", "");
}



RE: Comando Online e Offline - White_Blue - 21/10/2024

(19/10/2024 17:55)Enila182 Escreveu:
(19/10/2024 04:40)White_Blue Escreveu:
Código PHP:
SELECT FROM tabela WHERE org 'nome'

A query acima deve retornar todos os dados da tabela. Daí basta você mostrar esses dados da forma que quiser para o jogador na callback da query.

Você tem um exemplo de comando? Tentei fazer um aqui. só que nao da certo.

Código:
CMD:pccnew(playerid) {
    BuscarMembrosPCC(playerid);
    return 1;
}

forward BuscarMembrosPCC(playerid);
public BuscarMembrosPCC(playerid)
{
    new query[256]; // Define o tamanho da query
    format(query, sizeof(query), "SELECT Nome, Status FROM jogadores WHERE Org_PCC > 0");

    // Execute a query no banco de dados
    mysql_tquery(Conexao, query, "OnBuscarMembrosPCC", "i", playerid);
}

public OnBuscarMembrosPCC(playerid, cacheid) {
    new total_rows = cache_get_row_count(); // Pega o total de resultados

    if (total_rows == 0) {
        SendClientMessage(playerid, -1, "Nenhum membro encontrado.");
        return;
    }

    new listaMembros[1024]; // Buffer para armazenar os membros

    for (new i = 0; i < total_rows; i++)
    {
        new nome[24], status[16], orgPCC[32];
        new org_id;

        cache_get_field_content(i, "Nome", nome); // Pega o nome
        cache_get_field_content(i, "Status", status); // Pega o status (online/offline)
        org_id = cache_get_field_content_int(i, "Org_PCC"); // Pega o ID da organização

        // Verifica o cargo de acordo com o valor de Org_PCC
        switch (org_id) {
            case 1: format(orgPCC, sizeof(orgPCC), "Traficante 1");
            case 2: format(orgPCC, sizeof(orgPCC), "Traficante 2");
            case 3: format(orgPCC, sizeof(orgPCC), "Traficante 3");
            case 4: format(orgPCC, sizeof(orgPCC), "Traficante 4");
            case 5: format(orgPCC, sizeof(orgPCC), "Dono");
        }

        format(listaMembros, sizeof(listaMembros), "%s%s (%s) - %s\n", listaMembros, nome, orgPCC, (strcmp(status, "1") == 0) ? "Online" : "Offline");
    }

    // Mostra o dialog com a lista de membros
    ShowPlayerDialog(playerid, D_COMANDOS_GERAL, DIALOG_STYLE_MSGBOX, "Lista de Membros PCC", listaMembros, "Fechar", "");
}

Verifique e anexe o log de erro do MySQL (/logs/plugins/mysql.log), muitas vezes, ele registra a exata causa pela qual a query falhou.



P.S.:
Notei que você está utilizando uma versão ultrapassada do MySQL. Eu recomendaria migrar para a versão mais recente.

Também notei alguns problemas no código:

1- Você está usando a função `format` padrão, para formatar queries, sempre utilize a função `mysql_format`para evitar criar vulnerabilidades de SQL injection.
2 - Não faz sentido encapsular o código do comando em uma função separada, já que não será reutilizado em outro ponto.
3 - A callback da query tem um parâmetro `cacheid`, mas em momento nenhum esse parâmetro é usado ou tem um valor atribuído.
4 - Não faz sentido a `status` ser tratada como uma string, uma vez que pode ser armazenada como um inteiro.