Path in the Gestor bibliotecas/banco.php
banco.php is the data access layer of the whole Gestor. It is always loaded ($_GESTOR['bibliotecas']) and talks to MySQL/MariaDB through MySQLi, building SQL by string concatenation. There are no prepared statements: safety depends on escaping every value with banco_escape_field().
Configuration and connection
The connection uses $_BANCO, filled in gestor/config.php from .env:
| Key | .env variable |
Default |
|---|---|---|
tipo |
DB_CONNECTION |
mysqli (the only implemented type) |
host |
DB_HOST |
localhost |
nome |
DB_DATABASE |
— |
usuario / senha |
DB_USERNAME / DB_PASSWORD |
— |
-
The connection is lazy.
banco_query()andbanco_escape_field()callbanco_conectar()the first time; there is no need to connect by hand. -
banco_conectar()enablesMYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT, opens the connection and sets theutf8charset. If the connection fails, it ends the request withdie(), printing the error and the stack built bybanco_erro_debug()(HTML withfile:line => functionfor each frame). -
banco_fechar_conexao()closes and removes$_BANCO['conexao']. -
banco_ping()tests the connection withmysqli_ping()and, when it is down, only increments$_BANCO['RECONECT']: it does not reconnect.
Running SQL
-
banco_query($query)runs any SQL. With$_BANCO['distribuido']enabled, it does not use the local database: it forwards the statement tobanco_distribuido_query()(distributed modules, req-005), which returns aBancoResultadoRemotofor SELECT ortrue/falsefor writes. Locally, amysqli_sql_exceptionis caught, logged witherror_log()(including the SQL) and becomesfalse. No error reaches the screen. -
banco_sql($sql)runs and returns every row with numeric and named indexes (mysqli_fetch_array), ornullwithout results. -
banco_sql_names($sql, $campos)runs and returns associative rows using the names in$campos(comma-separated list, or*). -
banco_linhas_afetadas()returns how many rows the last write changed (ornullin distributed mode). It supports "only the first request claims the action":UPDATE … WHERE <not done yet>affects 1 row for whoever arrives first and 0 for the others. -
banco_last_id()returns theAUTO_INCREMENTof the last INSERT (in distributed mode, the id reported by the remote installation).
Reading a raw result
The wrappers accept a mysqli_result or a BancoResultadoRemoto:
-
banco_num_rows($result)returns 0 forfalse. This avoids the PHP 8.1+TypeErrorwhen the query failed; -
banco_num_fields($result),banco_field_name($result, $i)andbanco_fields_names($table): the last one runsSELECT * … LIMIT 1and returns the column names, ornullwhen there are no columns; -
banco_row($result)returns an indexed row; -
banco_row_array($result)returns an indexed and associative row; -
banco_fetch_assoc($result)returns an associative row.
Structured SELECT: banco_select()
This is the recommended way to query:
$paginas = banco_select(Array(
'tabela' => 'paginas',
'campos' => Array('id', 'nome', 'caminho'),
'extra' => "WHERE status='A' AND language='".banco_escape_field($lang)."' ORDER BY nome",
));
// [ ['id' => 'x', 'nome' => 'X', 'caminho' => 'x/'], ... ] or null-
camposis an array (joined with commas) or a string, or*. -
extrareceives everything afterFROM(JOIN, WHERE, ORDER BY, LIMIT). The table may have an alias:'tabela' => 'paginas AS p'. -
unicoreturns only the first row as a flat array, instead of a list. -
Without results the return is
null, not an empty array.
Positional variants, used by legacy code:
-
banco_select_name($campos, $tabela, $extra)returns associative rows (non-numeric values cast to string); -
banco_select_editar($campos, $tabela, $extra)returns only the first row and sets$_GESTOR['banco-resultado'](true/false).
Keeping the "before" of an edit
The CRUD history pattern:
-
banco_select_campos_antes_iniciar($campos, $tabela, $extra)reads the record and stores its first row in$_GESTOR['banco-antes'](returnstrue/false). -
banco_select_campos_antes($campo)returns a field's old value (ornull) to compare with$_REQUESTand build the history withinterface_historico_incluir().
Writing
INSERT
The most common way is to accumulate fields and insert once:
banco_insert_name_campo('id', $id); // escapes and quotes
banco_insert_name_campo('versao', '1', true); // no quotes (number, NOW(), NULL)
banco_insert_name_campo('html', $html, false, false); // no escaping (already escaped)
banco_insert_name(banco_insert_name_campos(), 'paginas');-
banco_insert_name_campo($nome, $valor, $sem_aspas_simples = false, $escape_field = true)accumulates in$_BANCO['insert-name-campos'], escaping the value by default. -
banco_insert_name_campos()returns the accumulated fields and clears the list. -
banco_insert_name($dados, $tabela)takes[[name, value, no_quotes], …]and buildsINSERT INTO t (…) VALUES (…). It does not escape: either the values came frombanco_insert_name_campo()or you escape them first (as modules do withbanco_escape_field($_REQUEST[...])). Items without a name or value are skipped. -
banco_insert_name_varios(['tabela' => …, 'campos' => [['nome' => …, 'valores' => [...], 'sem_aspas_simples' => true], …]])runs a multi-row INSERT, organized by column.nullbecomesNULL. It does not escape.
Legacy functions without callers in the core, which depend on the physical column order and escape nothing:
-
banco_insert($campos, $tabela):VALUES('0', …); -
banco_insert_tudo($campos, $tabela)andbanco_insert_id($campos, $tabela):VALUES(…); -
banco_insert_varios($campos, $tabela)andbanco_insert_varios_tudo($campos, $tabela): several rows. Both concatenate into an uninitialized variable (PHP 8 warning).
UPDATE
-
banco_update($campos, $tabela, $extra)runsUPDATE t SET <fields> <extra>.$camposis the ready string ("nome='x', versao=versao+1"). -
banco_update_campo($nome, $valor, $sem_aspas_simples = false, $escape_field = true)accumulates in$_BANCO['update-campos'], andbanco_update_executar($tabela, $extra = '')runs and clears it. With nothing accumulated, it does nothing. -
banco_update_varios($campos, $tabela, $campo_nome, $id_nome)updates many records withCASE id WHEN … THEN …, splitting into several queries above ~1 MB. Values are not escaped, and the function concatenates into an uninitialized$sql_fechar. No callers in the core.
Insert or update
banco_insert_update(['tabela' => ['nome' => …, 'id' => …, 'extra' => …], 'dados' => [...], 'dadosTipo' => [...]]) looks up the record by dados[<id>]: UPDATE if it exists, INSERT otherwise. With dadosTipo, bool stores 1/NULL and int stores the number unquoted (empty becomes NULL); everything else is escaped and quoted. It does not filter by language, neither when looking up nor when updating.
DELETE
-
banco_delete($tabela, $extra)runsDELETE FROM t <extra>. Without aWHEREin$extra, it empties the table. -
banco_delete_varios($tabela, $campo_ids, $array_ids)buildsDELETE … WHERE field IN (…).
Unique identifiers (slugs)
CRUDs generate the record's textual id from its name:
$id = banco_identificador(Array(
'id' => $_REQUEST['nome'],
'tabela' => Array(
'nome' => 'paginas', 'campo' => 'id', 'id_nome' => 'id_paginas',
'where' => "language='".$_GESTOR['linguagem-codigo']."'",
),
));-
banco_identificador()normalizes the text withbanco_retirar_acentos(), cuts it at ~90 characters (by word) and, when the text already ends in-<number>, starts from that number. -
banco_identificador_unico()triesid,id-1,id-2… until it finds a free one, ignoring records withstatus='D'.tabelaoptions:-
id_valorexcludes the record itself, when editing; -
statussets another status column; -
sem_statusdisables the status filter; -
whereadds a condition. Withsem_traco, hyphens are removed from the result.
-
banco_retirar_acentos($var, $retirar_espaco = true) replaces accents with ASCII, strips punctuation, turns parentheses and brackets into hyphens and spaces into hyphens (optional), and collapses hyphens.
Utilities
-
banco_escape_field($field)escapes withmysqli_real_escape_string(), connecting if needed. Without an active MySQLi connection it throwsLogicExceptioninstead of returning the value unescaped. -
banco_campos_virgulas($campos)joins an array with commas (''when empty). -
banco_total_rows($tabela, $extra = null)runsSELECT count(*)and returns the total. No callers in the core. -
banco_campos_nomes($tabela)runsSHOW COLUMNSand returns each column's metadata (Field,Type,Null,Key,Default,Extra). -
banco_campo_existe($campo, $tabela)tells whether the column exists. Modules use it to work both before and after a migration (for example,css_source_hash). -
banco_tabelas_lista()runsSHOW TABLESand returns the names. -
banco_smartstripslashes($str)only casts to string. It is kept for compatibility; do not use it in new code.
See also
-
Skills
c2f-database-operations,c2f-database-testingandc2f-mysql-utf8-emoji-encoding.
Functions (generated reference)
Generated from gestor/bibliotecas/banco.php · 47 functions
banco_escape_field
view source · line 30 ↗banco_escape_field(string $field): stringEscapa um valor para uso seguro em queries SQL.
Parameters
$fieldstring- O valor a ser escapado.
Returns
banco_smartstripslashes
view source · line 57 ↗banco_smartstripslashes(mixed $str): stringMantém compatibilidade com módulos que normalizam valores lidos do banco.
Parameters
$strmixed- O valor a ser normalizado.
Returns
banco_erro_debug
view source · line 69 ↗banco_erro_debug(): stringGera informações de debug do backtrace para erros de banco.
Returns
banco_conectar
view source · line 95 ↗banco_conectar(): voidEstabelece conexão com o banco de dados MySQL.
Returns
banco_ping
view source · line 121 ↗banco_ping(): voidVerifica se a conexão com o banco está ativa.
Returns
banco_fechar_conexao
view source · line 142 ↗banco_fechar_conexao(): voidFecha a conexão ativa com o banco de dados.
Returns
banco_query
view source · line 165 ↗banco_query(string $query): mysqli_result|boolExecuta uma query SQL no banco de dados.
Parameters
$querystring- A query SQL a ser executada.
Returns
banco_linhas_afetadas
view source · line 219 ↗banco_linhas_afetadas(): int|nullRetorna quantas linhas a última escrita (INSERT/UPDATE/DELETE) alterou.
Returns
banco_num_rows
view source · line 241 ↗banco_num_rows(mixed $result): intRetorna o número de linhas de um resultado de query.
Parameters
$resultmixed- Resultado mysqli, remoto ou valor inválido retornado pela query.
Returns
banco_num_fields
view source · line 268 ↗banco_num_fields(mysqli_result $result): intRetorna o número de campos/colunas em um resultado de query.
Parameters
$resultmysqli_result- O resultado da query.
Returns
banco_field_name
view source · line 289 ↗banco_field_name(mysqli_result $result, int $num_field): stringRetorna o nome de um campo específico do resultado.
Parameters
$resultmysqli_result- O resultado da query.
$num_fieldint- O índice do campo (começando em 0).
Returns
banco_fields_names
view source · line 312 ↗banco_fields_names(string $table): array|nullRetorna um array com os nomes de todos os campos de uma tabela.
Parameters
$tablestring- Nome da tabela.
Returns
banco_row
view source · line 343 ↗banco_row(mysqli_result $result): array|nullRetorna uma linha do resultado como array indexado.
Parameters
$resultmysqli_result- O resultado da query.
Returns
banco_row_array
view source · line 363 ↗banco_row_array(mysqli_result $result): array|nullRetorna uma linha do resultado como array associativo e indexado.
Parameters
$resultmysqli_result- O resultado da query.
Returns
banco_fetch_assoc
view source · line 383 ↗banco_fetch_assoc(mysqli_result $result): array|nullRetorna a próxima linha como array associativo.
Parameters
$resultmysqli_result- O resultado da query.
Returns
banco_sql
view source · line 404 ↗banco_sql(string $sql): array|nullExecuta uma query SQL e retorna todos os resultados.
Parameters
$sqlstring- A query SQL a ser executada.
Returns
banco_sql_names
view source · line 432 ↗banco_sql_names(string $sql, string $campos): array|nullExecuta uma query SQL e retorna resultados com nomes de campos.
Parameters
$sqlstring- A query SQL a ser executada.
$camposstring- Lista de campos separados por vírgula ou '*' para todos.
Returns
banco_select
view source · line 484 ↗banco_select(array|false $params = false): array|nullSeleciona dados do banco de dados de forma estruturada.
Parameters
$paramsarray|false- Parâmetros da função.
Returns
banco_select_name
view source · line 555 ↗banco_select_name(string $campos, string $tabela, string $extra): array|nullSeleciona dados do banco retornando arrays associativos.
Parameters
$camposstring- Lista de campos separados por vírgula ou '*'.
$tabelastring- Nome da tabela.
$extrastring- Condições extras da query (WHERE, ORDER BY, etc.).
Returns
banco_select_editar
view source · line 612 ↗banco_select_editar(string $campos, string $tabela, string $extra): array|nullSeleciona um único registro para edição.
Parameters
$camposstring- Lista de campos separados por vírgula ou '*'.
$tabelastring- Nome da tabela.
$extrastring- Condições extras da query (WHERE, ORDER BY, etc.).
Returns
banco_select_campos_antes_iniciar
view source · line 677 ↗banco_select_campos_antes_iniciar(string $campos, string $tabela, string $extra): boolSeleciona e armazena campos anteriores para comparação.
Parameters
$camposstring- Lista de campos separados por vírgula ou '*'.
$tabelastring- Nome da tabela.
$extrastring- Condições extras da query (WHERE, etc.).
Returns
banco_select_campos_antes
view source · line 737 ↗banco_select_campos_antes(string $campo): mixed|nullRetorna valor anterior de um campo específico.
Parameters
$campostring- Nome do campo a recuperar.
Returns
banco_update
view source · line 763 ↗banco_update(string $campos, string $tabela, string $extra): voidExecuta query UPDATE no banco de dados.
Parameters
$camposstring- Lista de campos e valores no formato "campo='valor'".
$tabelastring- Nome da tabela.
$extrastring- Condições extras (WHERE, etc.).
Returns
banco_update_campo
view source · line 789 ↗banco_update_campo(string $nome, string $valor, bool $sem_aspas_simples = false, bool $escape_field = true): voidAdiciona campo para atualização em lote.
Parameters
$nomestring- Nome do campo.
$valorstring- Valor a ser atribuído.
$sem_aspas_simplesbool- Se true, não envolve valor em aspas (padrão: false).
$escape_fieldbool- Se true, escapa o valor (padrão: true).
Returns
banco_update_executar
view source · line 819 ↗banco_update_executar(string $tabela, string $extra = ''): voidExecuta update em lote com campos acumulados.
Parameters
$tabelastring- Nome da tabela.
$extrastring- Condições extras como WHERE (padrão: '').
Returns
banco_update_varios
view source · line 858 ↗banco_update_varios(array $campos, string $tabela, string $campo_nome, string $id_nome): voidAtualiza múltiplos registros em massa usando CASE.
Parameters
$camposarray- Array de arrays [id, valor] para atualizar.
$tabelastring- Nome da tabela.
$campo_nomestring- Nome do campo a ser atualizado.
$id_nomestring- Nome do campo ID usado na cláusula CASE.
Returns
banco_insert
view source · line 895 ↗banco_insert(string $campos, string $tabela): voidInsere registro com ID auto-incrementado.
Parameters
$camposstring- Valores separados por vírgula.
$tabelastring- Nome da tabela.
Returns
banco_insert_name
view source · line 911 ↗banco_insert_name(array $dados, string $tabela): voidInsere registro com nomes de campos especificados.
Parameters
$dadosarray- Array de arrays [nome, valor, sem_aspas_simples].
$tabelastring- Nome da tabela.
Returns
banco_insert_name_campo
view source · line 953 ↗banco_insert_name_campo(string $nome, string $valor, bool $sem_aspas_simples = false, bool $escape_field = true): voidAdiciona campo para inserção em lote.
Parameters
$nomestring- Nome do campo.
$valorstring- Valor do campo.
$sem_aspas_simplesbool- Se true, não envolve em aspas (padrão: false).
$escape_fieldbool- Se true, escapa o valor (padrão: true).
Returns
banco_insert_name_campos
view source · line 980 ↗banco_insert_name_campos(): arrayRetorna e limpa campos acumulados para inserção.
Returns
banco_insert_name_varios
view source · line 1007 ↗banco_insert_name_varios(array|false $params = false): voidInsere múltiplos registros de uma única vez.
Parameters
$paramsarray|false- Parâmetros da função.
Returns
banco_insert_varios
view source · line 1077 ↗banco_insert_varios(array $campos, string $tabela): voidInsere vários registros com ID auto-increment.
Parameters
$camposarray- Array de strings com valores para cada registro.
$tabelastring- Nome da tabela.
Returns
banco_insert_varios_tudo
view source · line 1104 ↗banco_insert_varios_tudo(array $campos, string $tabela): voidInsere vários registros com todos os valores especificados.
Parameters
$camposarray- Array de strings com valores para cada registro.
$tabelastring- Nome da tabela.
Returns
banco_insert_id
view source · line 1131 ↗banco_insert_id(string $campos, string $tabela): voidInsere registro com ID especificado.
Parameters
$camposstring- Valores separados por vírgula.
$tabelastring- Nome da tabela.
Returns
banco_insert_tudo
view source · line 1146 ↗banco_insert_tudo(string $campos, string $tabela): voidInsere registro com todos os valores especificados.
Parameters
$camposstring- Valores separados por vírgula.
$tabelastring- Nome da tabela.
Returns
banco_last_id
view source · line 1160 ↗banco_last_id(): int|nullRetorna o último ID inserido.
Returns
banco_delete
view source · line 1179 ↗banco_delete(string $tabela, string $extra): voidExecuta DELETE no banco de dados.
Parameters
$tabelastring- Nome da tabela.
$extrastring- Condições WHERE e outras cláusulas.
Returns
banco_delete_varios
view source · line 1196 ↗banco_delete_varios(string $tabela, array|string $campo_ids, array $array_ids): voidDeleta múltiplos registros usando IN.
Parameters
$tabelastring- Nome da tabela.
$campo_idsarray|string- Nome(s) do(s) campo(s) ID.
$array_idsarray- Array de IDs para deletar.
Returns
banco_campos_virgulas
view source · line 1235 ↗banco_campos_virgulas(array $campos): stringConverte array de campos em string separada por vírgulas.
Parameters
$camposarray- Array de nomes de campos.
Returns
banco_total_rows
view source · line 1263 ↗banco_total_rows(string $tabela, string|null $extra = null): intRetorna total de linhas em uma tabela.
Parameters
$tabelastring- Nome da tabela.
$extrastring|null- Condições WHERE opcionais (padrão: null).
Returns
banco_campos_nomes
view source · line 1285 ↗banco_campos_nomes(string $tabela): arrayRetorna informações sobre colunas de uma tabela.
Parameters
$tabelastring- Nome da tabela.
Returns
banco_campo_existe
view source · line 1318 ↗banco_campo_existe(string $campo, string $tabela): boolVerifica se um campo específico existe em uma tabela.
Parameters
$campostring- Nome do campo a ser verificado.
$tabelastring- Nome da tabela onde verificar o campo.
Returns
banco_retirar_acentos
view source · line 1346 ↗banco_retirar_acentos(string $var, bool $retirar_espaco = true): stringRemove acentos e caracteres especiais de uma string.
Parameters
$varstring- String a ser processada.
$retirar_espacobool- Se true, substitui espaços por hífens (padrão: true).
Returns
banco_identificador_unico
view source · line 1390 ↗banco_identificador_unico(array|false $params = false): stringGera identificador único recursivamente.
Parameters
$paramsarray|false- Parâmetros da função.
Returns
banco_identificador
view source · line 1462 ↗banco_identificador(array|false $params = false): stringGera identificador único a partir de string.
Parameters
$paramsarray|false- Parâmetros da função.
Returns
banco_insert_update
view source · line 1541 ↗banco_insert_update(array|false $params = false): voidInsere ou atualiza registro baseado em existência.
Parameters
$paramsarray|false- Parâmetros da função.
Returns
banco_tabelas_lista
view source · line 1642 ↗banco_tabelas_lista(): arrayRetorna lista de todas as tabelas do banco de dados.
Returns