Ocorreu um erro - Wrong value type sent to the database IPv4 or IPv6 expected(ip

Iniciado por candidosa2, 28 de Abril de 2026, 20:31

Tópico anterior - Tópico seguinte

0 Membros e 5 Visitantes estão a ver este tópico.

candidosa2


Sim, o ficheiro que enviaste (Subs-Db-mysql.php) é exatamente o motor que processa todas as comunicações entre o SMF e a tua base de dados MySQL.

O erro "Wrong value type sent to the database. IPv4 or IPv6 expected.(ip)" que estás a receber é gerado especificamente dentro da função smf_db_replacement__callback, no bloco que lida com o tipo de dado inet.

Aqui está a análise técnica do porquê de o erro continuar no teu servidor:

A função isValidIP($replacement) está a falhar. Como usas Cloudflare, o IP pode estar a chegar vazio ou num formato que o PHP 8 não valida como um IP real (como uma string "unknown"). Quando isso acontece, o SMF interrompe a execução com o erro crítico em vez de tentar usar um valor padrão.

3. Como corrigir este ficheiro agora
Para resolver isso de forma definitiva e "forçar" o fórum a funcionar mesmo quando a detecção de IP falha, deves alterar o bloco case 'inet' e o case 'array_inet'.

Substitui as linhas 310 a 316 pelo seguinte código:

case 'inet':
if ($replacement == 'null' || $replacement == '')
return 'null';

// Se o IP não for válido, forçamos um IP padrão para não quebrar a query
if (!isValidIP($replacement))
$replacement = '127.0.0.1';

return sprintf('unhex(\'%1$s\')', bin2hex(inet_pton($replacement)));

case 'array_inet':
if (is_array($replacement))
{
if (empty($replacement))
smf_db_error_backtrace('Database error, given array of IPv4 or IPv6 values is empty. (' . $matches[2] . ')', '', E_USER_ERROR, __FILE__, __LINE__);

foreach ($replacement as $key => $value)
{
if ($value == 'null' || $value == '')
$replacement[$key] = 'null';
elseif (!isValidIP($value))
$replacement[$key] = sprintf('unhex(\'%1$s\')', bin2hex(inet_pton('127.0.0.1')));
else
$replacement[$key] = sprintf('unhex(\'%1$s\')', bin2hex(inet_pton($value)));
}

return implode(', ', $replacement);
}
else
smf_db_error_backtrace('Wrong value type sent to the database. Array of IPv4 or IPv6 expected. (' . $matches[2] . ')', '', E_USER_ERROR, __FILE__, __LINE__);
break;

Outro detalhe importante: SQL Mode
Reparei que na linha 95 do teu ficheiro, o SMF força o STRICT_TRANS_TABLES:

mysqli_query($connection, 'SET SESSION sql_mode = \'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT\'');
Sugestão: Se a alteração no case 'inet' não bastar, podes remover o ,STRICT_TRANS_TABLES dessa linha 95 para tornar a conexão mais tolerante a erros de dados.

Aplica a alteração no bloco case 'inet' primeiro. Isso vai impedir o smf_db_error_backtrace de ser disparado e o fórum voltará a abrir imediatamente.