Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, tudo bem?
Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
O que tentei até agora
Ex1
$busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
$busca->bindParam('campo', $_REQUEST['campo_form']);
Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
Inseri dados numéricos, da seguinte maneira para testar: 01234567; 12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
Ex2
$busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
Esse número está cadastrado, mas não retorna.
Ex3
$busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
Esse número está cadastrado, mas não retorna.
Ex4
$busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
Esse número está cadastrado, mas não retorna.
Ex5
$busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
Esse número está cadastrado, mas não retorna.
Ex6
$busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
Esse número está cadastrado, mas não retorna.
Ex7
$busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
$busca->bindParam('campo', $_REQUEST['campo_form'])
Não retorna dados.
O $_REQUEST['campo_form'] é envio via AJAX de um formulário.
Usei o gettype para verificar o post, e ele retorna string.
Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
Esse tipo de varchar foi usado porque os números que serão gravados nesse campo, terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
Agradeço desde já.olá.
cara, não me leve a mal, mas não adianta você ficar sofrendo c/ PHP,
se pelo jeito o q está t faltando é uma (razoável) base em SQL.
Considere "atacar" isso 1o.
ex: em todas as suas sqls está
>
Citar
"(...)campo form tabela(...)"
- isso não existe...
1a. dica: ative as mensagens de erro, conforme aqui:
Orientações e Regras do Fórum de PHP
2a: se você quer pesquisar se determinado campo começa ou termina com zero, sua sql deve ser assim:
"select * from tabela where campo like '0%' or campo like '%0';"
outro ex: se você quer pesquisar se determinado campo tem a letra "a" em qualquer posição:
"select * from tabela where campo like '%a%';"
(pesquise sobre o "like" em SQL).
e habitue-se a 1o. testar as sqls antes de "atacar" PHP.
Boa sorte.>
21 horas atrás, Fernando C disse:
olá.
cara, não me leve a mal, mas não adianta você ficar sofrendo c/ PHP,
se pelo jeito o q está t faltando é uma (razoável) base em SQL.
Considere "atacar" isso 1o.
ex: em todas as suas sqls está
- isso não existe...
1a. dica: ative as mensagens de erro, conforme aqui:
Orientações e Regras do Fórum de PHP
2a: se você quer pesquisar se determinado campo começa ou termina com zero, sua sql deve ser assim:
"select * from tabela where campo like '0%' or campo like '%0';"
outro ex: se você quer pesquisar se determinado campo tem a letra "a" em qualquer posição:
"select * from tabela where campo like '%a%';"
(pesquise sobre o "like" em SQL).
e habitue-se a 1o. testar as sqls antes de "atacar" PHP.
Boa sorte.
Obrigado pela ajuda.
O form foi a digitação aqui no forum. Passou despercebido.
Eu usei o LIKE como você indicou, mas também não retornou dados.
Quando executo um select sem where para identificar o tipo de dados que o MYSQL retorna, é tipo string e o que recebo do FORM HTML também. O estranho que nesse caso ele retorna os valores como estão gravados, até mesmo os zeros.
Na tabela da database alterei para testar o campo para INT(8), mas não teve efeito, então retornei para VARCHAR(8).
Vou pesquisa mais sobre o LIKE em SQL.>
Em 26/03/2025 at 09:46, luiz monteiro disse:
Obrigado pela ajuda.
O form foi a digitação aqui no forum. Passou despercebido.
Eu usei o LIKE como você indicou, mas também não retornou dados.
Quando executo um select sem where para identificar o tipo de dados que o MYSQL retorna, é tipo string e o que recebo do FORM HTML também. O estranho que nesse caso ele retorna os valores como estão gravados, até mesmo os zeros.
Na tabela da database alterei para testar o campo para INT(8), mas não teve efeito, então retornei para VARCHAR(8).
Vou pesquisa mais sobre o LIKE em SQL.
Boa noite
Hoje tentei novamente estudar algumas coisas para tentar entender o que está acontecendo e, dessa maneira
..."select * from tabela where campo = :busca ".....
Só não retorna se a busca terminar com 4 zeros. Tipo 2340000
Qualquer outro numero retorna, apenas esses com 4 zeros no final não.
Li o manual do SQL mas não encontrei nada que pudesse me ajudar.
Se alguém tiver algo mais para me ajudar. Agradeço.Trabalhar com números armazenados como strings (VARCHAR) que contêm zeros à esquerda ou à direita exige atenção especial nas comparações em SQL, devido à forma como o MySQL pode tentar fazer conversões de tipo implicitamente.
O problema principal que você está enfrentando é que, ao usar o operador = ou LIKE sem os devidos cuidados, o MySQL pode tentar converter tanto o valor da coluna VARCHAR quanto o valor fornecido para números antes de comparar. Nesse processo, zeros à esquerda ou à direita podem ser perdidos (por exemplo, '0123' vira 123, e às vezes '12300' pode ser tratado como 12300 numericamente).
Para garantir que você está comparando as strings exatamente como elas são, incluindo os zeros, você deve:
1 - Usar o operador =: Ele é adequado para comparações exatas.
2 - Garantir que ambos os lados da comparação sejam tratados como strings: A forma mais segura de fazer isso ao usar Prepared Statements com PDO é especificar o tipo do parâmetro como string.
Exemplo:
<?php
...
// Prepare a consulta SQL usando '=' para comparação exata
$sql = "SELECT campo FROM tabela WHERE campo = :campo_form";
$busca = $conexao->prepare($sql);
$busca->bindParam(':campo_form', $valor_form, PDO::PARAM_STR);
$busca->execute();
// Busque os resultados
$resultados = $busca->fetchAll(PDO::FETCH_ASSOC); // Ou fetch(), dependendo do que precisar
...Bom dia **Williams Duarte**
Obrigado por responder. Tentei e não deu certo.
Até dei um tempo nisso para não pirar. kkkkk
Mas quero encontrar a solução.Sugiro também sempre assegurar que o está manipulando seja o que espera, então a melhor forma é converter para o formato por vias das dúvidas, e sempre checar antes de prosseguir com o código
$_REQUEST['campo_form'] = 01234567;
var_dump($_REQUEST['campo_form']); // int
$_REQUEST['campo_form'] = '01234567';
var_dump($_REQUEST['campo_form']); // str
$_REQUEST['campo_form'] = (int) '01234567'; // string para integer
var_dump($_REQUEST['campo_form']); // int
$_REQUEST['campo_form'] = (string) 01234567; // integer para string
var_dump($_REQUEST['campo_form']); // str
Pelo que entendi a busca é pelo valor específico então eu não usaria o operador like, a não ser que quisesse todos registros começando ou terminando com o desejado. De qualquer forma executei a query aqui em pdo e o resultado foi alcançado
$selecinar = $conexao->prepare("SELECT * FROM tabela WHERE coluna = :buscar");
$selecinar->execute([':buscar' => '12340000']);
$resultado = $selecinar->fetchAll(PDO::FETCH_ASSOC);
var_dump($resultado);
Mas quando tentei buscar todos registros que tinham o zero no início ou no fim eu não consegui, confesso que faltou tentar mais.
Então de improviso busquei todos registors e usei o php para isolar todos índices que eu desejo em uma nova array exemplo:
/*
* função que verifica se o caractere existe no texto
* $caractere: qual string verficar
* $texto: em qual texto verificar
*/
function noInicioFim($caractere, $texto) {
if ($caractere == substr($texto, 0, 1) || $caractere == substr($texto, -1)) {
return (true);
} else {
return (false);
}
}
$registros_do_banco_de_dados = [ // simulando todos registros da tabela
['id' => 0, 'campo_str' => '01234567'],
['id' => 1, 'campo_str' => '12345670'],
['id' => 2, 'campo_str' => '12345678'],
['id' => 3, 'campo_str' => '12340000'],
['id' => 4, 'campo_str' => '11111111'],
['id' => 5, 'campo_str' => '22222222'],
['id' => 6, 'campo_str' => '33333333'],
['id' => 7, 'campo_str' => '44444444'],
['id' => 8, 'campo_str' => '55555555'],
['id' => 9, 'campo_str' => '00000000'],
['id' => 10, 'campo_str' => '10000009']
];foreach ($registros_do_banco_de_dados as $valor) {
if (noInicioFim($string_de_busca, $valor['campo_str'])) {
array_push($indices_encontrados_com_zero, ['id' => $valor['id'], 'campo_str' => $valor['campo_str']]);
}
}
Não é a melhor alternativa dependendo do cenário que a aplicação deva funcionar.
Olá.
Hoje tentei também
Primeiro