mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows etc… espera que o parâmetro 1 seja um recurso


960

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'];
}

15
você pode obter mais útil eroor msg usando :: QUERY ou die (mysql_error ());
Nik

123
Também a nota obrigatória: seu código é propenso a injeção de SQL . Você deve validar e / ou escapar da entrada do usuário. Dê uma olhada mysql_real_escape_string. Nunca confie nos dados do usuário.
precisa

7
Na verdade, o código do OP irá causar um erro de sintaxe no servidor MySQL, mas pelo menos é não vulnerável a injeção SQL, porque aspas simples não tem interpolação variável.
Szgal

4
@FelixKling Sei que isso é muito antigo e provavelmente o mais preciso possível no momento, mas seu comentário agora está perigosamente errado de uma maneira: mysql_real_escape_stringnã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.
Fund Monica's Lawsuit

2
Gah. Estender esta questão para incluir o MySQLi e o DOP foi uma má ideia. Cada um deles tem sua própria sintaxe e mensagens de erro um pouco diferentes e poderiam perfeitamente ter suas próprias perguntas. A combinação de tudo em uma questão gigante de três partes apenas torna isso menos Googleable e força as pessoas que chegam aqui a percorrer conteúdo irrelevante para alcançar o que desejam. Também invalidou muitas das respostas abaixo e torna essa pergunta "muito ampla" pelos padrões que normalmente aplicamos. É uma bagunça, na minha opinião, mas é tarde demais para consertar agora.
Mark-Amery #

Respostas:


667

Uma consulta pode falhar por vários motivos; nesse caso, a extensão mysql_ * e a extensão mysqli retornam falsede suas respectivas funções / métodos de consulta. Você precisa testar essa condição de erro e manipulá-la adequadamente.

extensão mysql_ * :

NOTA As funções do mysql_ estão obsoletas e foram removidas no php versão 7.

Verifique $resultantes de passá-lo para mysql_fetch_array. Você verá que é falseporque a consulta falhou. Consulte a mysql_querydocumentação para obter possíveis valores de retorno e sugestões de como lidar com eles.

$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}


estilo procedural da extensão mysqli :

$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");

// mysqli_query returns false if something went wrong with the query
if($result === FALSE) { 
    yourErrorHandler(mysqli_error($mysqli));
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
        ...

estilo oo :

$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

usando uma declaração preparada:

$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
    $result = $stmt->get_result();
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

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 diena 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 .


9
Certo, mas usar um dado () se a consulta falhar é um pouco demais.
2ndkauboy

28
Eu projetaria um mecanismo inteiro de tratamento de erros para o OP, mas decidi que isso poderia estar além do escopo da minha resposta.
Edward Dale

@ scompt.com Sim, também é abordado em várias outras respostas. Acho que estava apenas afirmando que, como essa é a resposta aceita em uma pergunta de alta visibilidade, além dos conselhos (excelentes) sobre como detectar corretamente erros no futuro, ela deve (IMHO) realmente responder à pergunta específica (por exemplo, explique por que existe um erro neste caso).
Sepster

2
Em vez de if($result === FALSE)você pode usar if(! $result). Me corrija se eu estiver errado
anestv

1
mysql_query (): A extensão mysql está obsoleta e será removida no futuro: use mysqli
Greg

165

Essa 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:

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
  • 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). Usarmysql_real_escape_string() para escapar de sua entrada.

  • Verifique se você não está mixando mysqli_*e mysql_*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 .


1
Dada essa pergunta hoje, stackoverflow.com/q/43804651/1415724 e outras similares recentemente; Acho que vale a pena atualizar sua resposta para conter algo como "Esse erro também pode ser causado pela não execução da consulta com mysql_query()/ mysqli_query($connection)etc." ; pensamentos? Como nenhuma outra resposta nesta seção de perguntas e respostas menciona isso.
Funk Quarenta Niner

111

O erro ocorreu aqui foi devido ao uso de aspas simples ( '). Você pode colocar sua consulta assim:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Está sendo usado mysql_real_escape_stringpara 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_stringserá necessário.


5
Por que adicionar ruído com concatenação de string em vez de apenas colocar a variável na string de consulta?
Matteo Riva

1
@ Matteo Riva Sim, mas eu pensei que esta é uma maneira mais limpa de separar variáveis ​​de string. :)
nik

60

Como o scompt.com explicou , a consulta pode falhar. Use este código para obter o erro da consulta ou o resultado correto:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

Consulte a documentação paramysql_query() obter mais informações.

O erro real foi entre aspas simples, para que a variável $usernamenão fosse analisada. Mas você realmente deve usar mysql_real_escape_string($username)para evitar injeções de SQL.


52

Coloque aspas $username. Os valores de sequência, em oposição aos valores numéricos, devem ser colocados entre aspas.

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

Além disso, não faz sentido usar a LIKEcondição se você não estiver usando caracteres curinga: se você precisar de uma correspondência exata, use em =vez de LIKE.


1
E se $ username for: "'; DROP TABLES;" ? Essa é a vantagem de usar declarações preparadas e valores vinculados, que acho que o solicitante gostaria de manter.
HoldOffHunger

42

Verifique se o banco de dados selecionado não é porque, algumas vezes, o banco de dados não está selecionado

Verifica

mysql_select_db('database name ')or DIE('Database name is not available!');

antes da consulta do MySQL e, em seguida, vá para a próxima etapa

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

f($result === FALSE) {
    die(mysql_error());

40

Seu código deve ser algo como isto

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

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.


3
Não use esse código. Está aberto a ataques de injeção de SQL.
Brad

34
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

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:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php para mais informações.


2
Não use esse código, mesmo se você adicionar aspas. Está aberto a ataques de injeção de SQL.
Brad

33

Esta consulta deve funcionar:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

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.


28
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Às vezes, suprimir a consulta como @mysql_query(your query);


2
Não use esse código. Está aberto a ataques de injeção de SQL.
Brad

27

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_cie tudo funcionou.


25
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

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.


Lembre-se de usar 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.
Brad

25

Tente isso, deve funcionar, caso contrário, você precisará imprimir o erro para especificar seu problema

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

8
1) Bem aberto à injeção de SQL, 2) não inclui tratamento de erros que está causando o erro no caso do OP.
deceze

+1. @ deceze Sim, está bem aberto. Mas não mais do que o código do OP ou do atendedor aceito ;-) E não é a falta de tratamento de erros no código do OP que está causando o erro ... é o erro , e esta resposta pelo menos tenta resolver isso (colocando um único aspas ao redor da cadeia literal na LIKEexpressão).
Sepster

1
+1 Adicione um espaço entre LIKE e '$ username', o resto parece estar correto, exceto a injeção SQL. Por que não usar = em vez de como o usuário operador deve ser exatamente igual
asim-ishaq

21

Pode haver dois motivos:

  1. 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. Vejophp.net/manual/en/function.mysql-connect.php

  2. 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.


20

Tente o seguinte código. Pode funcionar bem.

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

4
Este código está sujeito à injeção SQL e não deve ser usado.
Brad

15

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.


15

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

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>

Sua postagem não lida com os problemas abordados pela pergunta, que são uma consulta inválida e um relatório de erro insuficiente. Esta postagem está fora do tópico.
Paul Spiegel

14
<?php
    $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'];
    }
?>

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á:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");

3
Este código está aberto à injeção de SQL e não deve ser usado.
Brad

@AnujGarg Este código recebe entrada direta e concatena na consulta. Alguém poderia escrever seu próprio SQL nos dados de postagem usernamee eles serão executados.
28415 Brad

Então, o que usar para impedir que o código seja injetado em SQL?
Anuj Garg

14

Inclua uma variável de cadeia de conexão antes da consulta do MySQL. Por exemplo, $conntneste código:

$results = mysql_query($connt, "SELECT * FROM users");

1
Isso não resolve os problemas da pergunta. Também está errado e geraria outro erro.
Paul Spiegel

12

Sempre que você obtém o ...

"Aviso: mysqli_fetch_object () espera que o parâmetro 1 seja mysqli_result, dado booleano"

... é provável que haja um problema com sua consulta. O prepare()ou query()pode retornar FALSE(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 <?phptag de abertura :

error_reporting(E_ALL);
ini_set('display_errors', 1);

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:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

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.

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

Se algo estiver errado, você pode emitir uma mensagem de erro que o leva diretamente ao problema. Nesse caso, não há foocoluna 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.


2
Como você pode escrever "Certifique-se de lidar com os erros normalmente e nunca revele a verdadeira causa de qualquer problema para seus usuários". e echo $error;em um post?
Paul Spiegel

Obrigado pela atenção @PaulSpiegel. Já faz um tempo desde que escrevi ou revisitei a resposta e perdi que havia deixado o eco lá.
Jay Blanchard

11
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>

11

Tente isto

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}

4
O @panjehra mysql_ * está obsoleto e será removido do php 7. Use mysqli_ * vez
Manoj Kumar

9

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:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}

2
Não use esse código. Está aberto a ataques de injeção de SQL.
Brad

9

Verifique se você não está fechando o banco de dados usando db_close () antes de executar sua consulta:

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.


8

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.


7

Verifique sua conexão primeiro.

Então, se você deseja buscar o valor exato do banco de dados, escreva:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

Ou você deseja buscar o LIKEtipo de valor e escrever:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");

3
Este código está aberto à injeção de SQL e não deve ser usado.
Brad

6

Você também pode verificar se $resultestá falhando assim, antes de executar a matriz de busca

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}

3
Não use esse código. Está aberto a ataques de injeção de SQL.
Brad

Mas se o código funcionar, acho que você deve editar o código e inserir os filtros necessários em vez de castigar o código.
user28864

O uso simples de filtros não corrigirá o que há de errado com este código. A melhor solução é usar consultas preparadas / parametrizadas com DOP ou similar. Não vejo sentido em corrigi-lo, pois a resposta correta já foi publicada aqui. Idealmente, esta resposta será excluída. No entanto, você pode corrigir sua resposta e eu votarei de bom grado se ela estiver correta.
8284 Brad

Bem, se você acha que a resposta não vale a pena considerar, pode prosseguir e ler sobre ela. No entanto, pensei que todo o objetivo desta comunidade é compartilhar e contribuir com conhecimento. Se você tem algo para compartilhar, em vez de mostrar e afastar as pessoas.
user28864

2
Você está correto, o objetivo dessa comunidade é compartilhar conhecimento. É por isso que adicionei explicações com meu voto negativo e expliquei mais por que sua sugestão de filtro não foi suficiente. Eu preferiria alertá-lo, juntamente com qualquer outra pessoa que encontrar sua resposta, de que o código acima é inseguro. É melhor que todos aprendam os métodos corretos, em vez de perpetuar o código incorreto. E não posso excluir sua resposta, nem eu. Isso depende de você, se você optar por fazê-lo.
8284 Brad

4

Geralmente, ocorre um erro quando a conectividade do banco de dados falha, portanto, conecte-o ou inclua o arquivo.

include_once(db_connetc.php');

OU

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • A melhor prática é executar a consulta no sqlyog e copiá-la no código da página.
  • Sempre armazene sua consulta em uma variável e faça eco nessa variável. Então passe para mysql_query($query_variable);.

2
1) Você não sabe se votei ou não em alguma resposta aqui, para cima ou para baixo. 2) Como expliquei no meu primeiro comentário; sua resposta não faz referência ao problema ( boolean passado para mysql_fetch_array ) e você tem erros de sintaxe
Phil

2
Você tem aspas incorretas nos dois exemplos de código. O destaque da sintaxe aplicado ao seu segundo bloco de código é um aviso de que algo está errado
Phil

4
Este código está sujeito à injeção SQL e não deve ser usado. @EngrZardari, se você estiver usando esse código em seus sistemas de produção, sem dúvida foi invadido e deve remediar a situação comprando usando consultas preparadas / parametrizadas com DOP ou similar. Existem bots que têm testes automatizados para essas vulnerabilidades.
Brad

1
@EngrZardari Sobre o seu "não há nenhum erro, colei aqui o código que estou usando atualmente." comente acima. Havia uma cotação ausente na consulta que eu corrigi. Isso geraria um erro de análise (PHP).
Funk Quarenta Niner

2

Tente este código funciona bem

atribuir a variável de postagem à variável

   $username = $_POST['uname'];

   $password = $_POST['pass'];

  $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}

3
Este código está sujeito a ataques de injeção SQL e não deve ser usado.
Brad

1

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. "').

$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'];
     }

$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'];
     }

mas o uso do Mysql depreciou muito, use o DOP em seu lugar. é simples, mas muito seguro


Mas o uso do MySQL foi depreciado. você pode usar o DOP. Deixe-me dar um exemplo de login.
Dennis Kiptugen 04/10/2015

2
As senhas NUNCA devem ser armazenadas em forma de texto sem formatação, use as funções incorporadas que o PHP possui para lidar com o hash de senhas e a verificação de senhas com hash!
SpacePhoenix #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.