Estou tentando selecionar dados de uma tabela MySQL, mas recebo uma das seguintes mensagens de erro:
mysql_fetch_array () espera que o parâmetro 1 seja um recurso, dado booleano
Este é o meu código:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
while($row = mysql_fetch_array($result)) {
echo $row['FirstName'];
}
mysql_real_escape_string
. Nunca confie nos dados do usuário.mysql_real_escape_string
não é a proteção total contra a injeção de SQL; ainda está vulnerável a vários ataques. (Não, você nunca disse que era perfeito, mas sugeriu que era a única solução necessária). A melhor solução agora é a DOP, tanto quanto eu sei.Respostas:
Uma consulta pode falhar por vários motivos; nesse caso, a extensão mysql_ * e a extensão mysqli retornam
false
de suas respectivas funções / métodos de consulta. Você precisa testar essa condição de erro e manipulá-la adequadamente.extensão mysql_ * :
Verifique
$result
antes de passá-lo paramysql_fetch_array
. Você verá que éfalse
porque a consulta falhou. Consulte amysql_query
documentação para obter possíveis valores de retorno e sugestões de como lidar com eles.estilo procedural da extensão mysqli :
estilo oo :
usando uma declaração preparada:
Esses exemplos ilustram apenas o que deve ser feito (tratamento de erros), não como fazê-lo. O código de produção não deve ser usado
or die
na saída de HTML, senão (pelo menos) gerará HTML inválido. Além disso, as mensagens de erro do banco de dados não devem ser exibidas para usuários não administradores, pois divulgam muitas informações .fonte
if($result === FALSE)
você pode usarif(! $result)
. Me corrija se eu estiver erradoEssa mensagem de erro é exibida quando você tem um erro na sua consulta que causou a falha. Ele se manifestará ao usar:
mysql_fetch_array
/mysqli_fetch_array()
mysql_fetch_assoc()
/mysqli_fetch_assoc()
mysql_num_rows()
/mysqli_num_rows()
Nota : Este erro não aparece se nenhuma linha for afetada pela sua consulta. Somente uma consulta com uma sintaxe inválida gerará esse erro.
Etapas de solução de problemas
Verifique se o servidor de desenvolvimento está configurado para exibir todos os erros. Você pode fazer isso colocando isso no topo de seus arquivos ou em seu arquivo de configuração:
error_reporting(-1);
. Se você tiver algum erro de sintaxe, isso os indicará.Usar
mysql_error()
.mysql_error()
reportará quaisquer erros que o MySQL tenha encontrado ao executar sua consulta.Uso da amostra:
Execute sua consulta na linha de comando do MySQL ou em uma ferramenta como phpMyAdmin . Se você tiver um erro de sintaxe na sua consulta, isso informará o que é.
Verifique se suas cotações estão corretas. Uma cotação ausente em torno da consulta ou de um valor pode causar uma falha na consulta.
Verifique se você está escapando de seus valores. As cotações na sua consulta podem causar uma falha na consulta (e também deixá-lo aberto para injeções de SQL). Usar
mysql_real_escape_string()
para escapar de sua entrada.Verifique se você não está mixando
mysqli_*
emysql_*
funcionando. Eles não são a mesma coisa e não podem ser usados juntos. (Se você escolher uma ou outra opção,mysqli_*
veja abaixo o porquê.)Outras dicas
mysql_*
funções não devem ser usadas para novo código. Eles não são mais mantidos e a comunidade iniciou o processo de depreciação . Em vez disso, você deve aprender sobre instruções preparadas e usar o DOP ou o MySQLi . Se você não conseguir decidir, este artigo ajudará a escolher. Se você quer aprender, aqui está um bom tutorial sobre DOP .fonte
mysql_query()
/mysqli_query($connection)
etc." ; pensamentos? Como nenhuma outra resposta nesta seção de perguntas e respostas menciona isso.O erro ocorreu aqui foi devido ao uso de aspas simples (
'
). Você pode colocar sua consulta assim:Está sendo usado
mysql_real_escape_string
para prevenção de injeção de SQL. Embora devamos usar a extensão MySQLi ou PDO_MYSQL para a versão atualizada do PHP (PHP 5.5.0 e posterior), mas para as versões mais antigas,mysql_real_escape_string
será necessário.fonte
Como o scompt.com explicou , a consulta pode falhar. Use este código para obter o erro da consulta ou o resultado correto:
Consulte a documentação para
mysql_query()
obter mais informações.O erro real foi entre aspas simples, para que a variável
$username
não fosse analisada. Mas você realmente deve usarmysql_real_escape_string($username)
para evitar injeções de SQL.fonte
Coloque aspas
$username
. Os valores de sequência, em oposição aos valores numéricos, devem ser colocados entre aspas.Além disso, não faz sentido usar a
LIKE
condição se você não estiver usando caracteres curinga: se você precisar de uma correspondência exata, use em=
vez deLIKE
.fonte
Verifique se o banco de dados selecionado não é porque, algumas vezes, o banco de dados não está selecionado
Verifica
antes da consulta do MySQL e, em seguida, vá para a próxima etapa
fonte
Seu código deve ser algo como isto
Uma vez feito isso, você obteria a consulta impressa na tela. Tente esta consulta no seu servidor e veja se produz os resultados desejados. Na maioria das vezes o erro está na consulta. O restante do código está correto.
fonte
Você define a cadeia usando aspas simples e o PHP não analisa cadeias delimitadas por aspas simples. Para obter a interpolação variável, você precisará usar aspas duplas OU concatenação de cadeias (ou uma combinação delas). Veja http://php.net/manual/en/language.types.string.php para mais informações.
Além disso, você deve verificar se o mysql_query retornou um recurso de resultado válido; caso contrário, fetch_ *, num_rows, etc, não funcionarão no resultado, pois não é um resultado! IE:
http://us.php.net/manual/en/function.mysql-query.php para mais informações.
fonte
Esta consulta deve funcionar:
O problema são aspas simples, portanto, sua consulta falha e retorna FALSE e seu loop WHILE não pode ser executado. O uso de% permite que você corresponda a qualquer resultado que contenha sua string (como SomeText- $ username-SomeText).
Esta é simplesmente uma resposta à sua pergunta, você deve implementar as coisas mencionadas nos outros posts: tratamento de erros, usar seqüências de escape (os usuários podem digitar qualquer coisa no campo e você DEVE se certificar de que não é um código arbitrário), use o PDO em vez do mysql_connect que agora está privado.
fonte
Às vezes, suprimir a consulta como
@mysql_query(your query);
fonte
Se você tentou de tudo aqui, e ele não funciona, convém verificar o agrupamento do banco de dados MySQL. Mina foi definida para um agrupamento sueco. Então eu mudei para
utf8_general_ci
e tudo funcionou.fonte
Em vez de usar uma consulta WHERE, você pode usar essa consulta ORDER BY. É muito melhor que isso para o uso de uma consulta.
Eu fiz essa consulta e não estou recebendo erros como parâmetro ou booleano.
fonte
htmlspecialchars()
ao usar dados arbitrários no contexto do HTML. Caso contrário, você corre o risco de criar HTML válido quando caracteres reservados são usados nos dados.Tente isso, deve funcionar, caso contrário, você precisará imprimir o erro para especificar seu problema
fonte
LIKE
expressão).Pode haver dois motivos:
Você abriu a conexão com o banco de dados antes de chamar a função mysql_query? Não vejo isso no seu código. Use mysql_connect antes de fazer a consulta. Vejo
php.net/manual/en/function.mysql-connect.php
A variável $ username é usada dentro de uma sequência de aspas simples, portanto, seu valor não será avaliado dentro da consulta. A consulta definitivamente falhará.
Em terceiro lugar, a estrutura da consulta é propensa à injeção de SQL . Você pode usar instruções preparadas para evitar essa ameaça à segurança.
fonte
Tente o seguinte código. Pode funcionar bem.
fonte
Vá para o seu
config.php
. Eu tive o mesmo problema. Verifique o nome de usuário e a senha e também sql select é o mesmo nome que a configuração.fonte
Não use a função mysql_ * privada (a privação no php 5.5 será removida no php 7). e você pode fazer isso com mysqli ou pdo
aqui está a consulta de seleção completa
fonte
E se houver um usuário com um nome de usuário exclusivo, você poderá usar "=" para isso. Não há necessidade de gostar.
Sua consulta será:
fonte
username
e eles serão executados.Inclua uma variável de cadeia de conexão antes da consulta do MySQL. Por exemplo,
$connt
neste código:fonte
Sempre que você obtém o ...
... é provável que haja um problema com sua consulta. O
prepare()
ouquery()
pode retornarFALSE
(um booleano), mas essa mensagem de falha genérica não deixa muita coisa para você. Como você descobre o que há de errado com sua consulta? Você pergunta !Primeiro, verifique se o relatório de erros está ativado e visível: adicione essas duas linhas na parte superior do (s) arquivo (s) logo após a
<?php
tag de abertura :Se o seu relatório de erros foi definido no php.ini, você não precisa se preocupar com isso. Apenas lembre-se de lidar com os erros normalmente e nunca revele a verdadeira causa de quaisquer problemas para seus usuários. Revelar a verdadeira causa ao público pode ser um convite gravado em ouro para aqueles que desejam prejudicar seus sites e servidores. Se você não deseja enviar erros ao navegador, sempre pode monitorar os logs de erros do servidor da web. As localizações dos logs variam de servidor para servidor, por exemplo, no Ubuntu, o log de erros geralmente está localizado em
/var/log/apache2/error.log
. Se você estiver examinando logs de erro em um ambiente Linux, poderá usartail -f /path/to/log
em uma janela do console para ver os erros que ocorrem em tempo real ... ou enquanto os cria.Quando você estiver concentrado nos relatórios de erros padrão, a adição de verificação de erros na conexão e nas consultas ao banco de dados fornecerá muito mais detalhes sobre os problemas. Veja este exemplo em que o nome da coluna está incorreto. Primeiro, o código que retorna a mensagem de erro fatal genérica:
O erro é genérico e não ajuda muito a resolver o que está acontecendo.
Com mais algumas linhas de código, você pode obter informações muito detalhadas que podem ser usadas para resolver o problema imediatamente . Verifique a
prepare()
declaração quanto à veracidade e, se estiver bom, continue com a ligação e a execução.Se algo estiver errado, você pode emitir uma mensagem de erro que o leva diretamente ao problema. Nesse caso, não há
foo
coluna na tabela, resolver o problema é trivial.Se você escolher, poderá incluir essa verificação em uma função ou classe e estendê-la, manipulando os erros normalmente, conforme mencionado anteriormente.
fonte
echo $error;
em um post?fonte
Tente isto
fonte
Primeiro, verifique sua conexão com o banco de dados. Está conectado com sucesso ou não?
Se estiver pronto, depois que eu escrevi este código, e funciona bem:
fonte
Se você estiver usando várias consultas em um script, mesmo incluindo outras páginas que contenham consultas ou conexão com o banco de dados, pode ser possível que em qualquer lugar você use db_close () que feche sua conexão com o banco de dados, verifique se você está não cometer esse erro em seus scripts.
fonte
Se você não tiver nenhum erro do MySQL aparecendo durante a verificação, certifique-se de ter criado corretamente sua tabela de banco de dados. Isso aconteceu comigo. Procure vírgulas ou aspas indesejadas.
fonte
Verifique sua conexão primeiro.
Então, se você deseja buscar o valor exato do banco de dados, escreva:
Ou você deseja buscar o
LIKE
tipo de valor e escrever:fonte
Você também pode verificar se
$result
está falhando assim, antes de executar a matriz de buscafonte
Geralmente, ocorre um erro quando a conectividade do banco de dados falha, portanto, conecte-o ou inclua o arquivo.
OU
mysql_query($query_variable);
.fonte
Tente este código funciona bem
atribuir a variável de postagem à variável
fonte
como $ username é uma variável php, precisamos passá-la como string para o mysqli; portanto, na consulta que você iniciou com uma aspas simples, usaremos aspas duplas, aspas simples e um ponto final para fins de concatinação ("'. $ username. '") se você começasse com aspas duplas, as aspas seriam revertidas ('". $ username. "').
mas o uso do Mysql depreciou muito, use o DOP em seu lugar. é simples, mas muito seguro
fonte