Jump to content

NULL em resultado da base de dados


VascoMarques
 Share

Recommended Posts

Boa noite!

Estou a desenvolver uma pequena aplicação em php/javascript/ajax, apenas para treinar o meu código. Esta aplicação consiste apenas em pesquisar países e cidades, e vai buscar informação a uma base de dados. Podem dar uma vista de olhos aqui: http://vascomarques.bugs3.com/

O utilizador faz uma pesquisa na search box e essa informação é transferida para o ficheiro search.php através de AJAX:

var searchTerm = $(this).val();
$.post('includes/search.php', { search_term: searchTerm }, function( data ) {
$(".section").html(data);
});

E em search.php, faço uma pesquisa na base de dados:

if ( isset($_POST["search_term"]) ) {
$search_term = htmlentities($_POST["search_term"]);

if ( !empty($search_term) ) {

$query = "SELECT * FROM countries WHERE name LIKE '%{$search_term}%'";
$results_set = mysqli_query($connection, $query);
$results_count = mysqli_num_rows($results_set);

$suffix = ($results_count != 1) ? "s" : "";
$count = "<p>Your search for <strong>" . $search_term . "</strong> returned " . $results_count . " result" . $suffix . "</p>";

echo "<div class='results-num'>" . $count . "</div>";

foreach ($results_set as $result) {
echo "<div class='result'>";
echo "<h2>" . $result["name"] . "</h2>";
echo "<p>" . $result["content"] . "</p>";
echo"</div>";
}
}
}

Todo o desenvolvimento na minha máquina correu bem. No entanto, após ter feito o upload para um servidor, os valores de $result["name"] e de $result["content"] são NULL. Apesar disso, existe a contagem correta do número de rows!

Não entendo o que se passa! A base de dados está corretamente conectada, e as tabelas têm todas o nome correto!

Será que me podem ajudar?

Obrigado desde já!

Link to comment
Share on other sites

Faz:

echo $results_set;
echo ' ';

foreach ($results_set as $result) {
 echo $result;
}

E mostra a output.

Isto porque, saber a composicão do granito, os estágios da evolucão psicológica humana ou as deambulacões do Sartre não indicam puto sobre as competências de alguém num determinado campo específico e muito menos sobre o que as pessoas gostam de fazer ou a sua capacidade de aprendizagem. - bubulindo, 15 de Fevereiro de 2013 - 02:01

Link to comment
Share on other sites

Parece-me que tens versões diferentes de PHP a correr nos dois ambientes.

precisas de ir buscar as linhas usando mysql_assoc. Por alguma razão a tua máquina trata o mysql_result como array. Suponho que seja algo novo no PHP.

http://php.net/manual/en/function.mysql-fetch-array.php

Tem também atenção que htmlentities não te protege contra SQL Injection. A função correcta a usar seria mysql_real_escape_string.

http://php.net/manual/en/function.mysql-real-escape-string.php

Por último mas muito mais importante, usa PDO ou MySQLi com prepared statements. O uso da livraria mysql_* é desencorajada e deprecated.

PS: Também é boa practica transferir json em vez de HTML no ajax e depois construir o HTML usando Javascript.

Link to comment
Share on other sites

Parece-me que tens versões diferentes de PHP a correr nos dois ambientes.

precisas de ir buscar as linhas usando mysql_assoc. Por alguma razão a tua máquina trata o mysql_result como array. Suponho que seja algo novo no PHP.

http://php.net/manual/en/function.mysql-fetch-array.php

Tem também atenção que htmlentities não te protege contra SQL Injection. A função correcta a usar seria mysql_real_escape_string.

http://php.net/manual/en/function.mysql-real-escape-string.php

Por último mas muito mais importante, usa PDO ou MySQLi com prepared statements. O uso da livraria mysql_* é desencorajada e deprecated.

PS: Também é boa practica transferir json em vez de HTML no ajax e depois construir o HTML usando Javascript.

Já consegui resolver o problema. O código agora está assim:

if ( isset($_POST["search_term"]) ) {

$search_term = preg_replace("/[^A-Za-z0-9]/", " ", $_POST['search_term']);
$search_term = $connection->real_escape_string($search_term);

// Check Length More Than One Character
if (strlen($search_term) >= 1 && $search_term !== ' ') {

$query = "SELECT * FROM countries WHERE name LIKE '%{$search_term}%'";
$result = $connection->query($query);
$results_count = $result->num_rows;

$suffix = ($results_count != 1) ? "s" : "";
$count = "<div class='results-num'><p>Your search for <strong>" . $search_term . "</strong> returned " . $results_count . " result" . $suffix . "</div></p>";
echo $count;

while ($results = $result->fetch_array()) {
$result_array[] = $results;
}

if (isset($result_array)) {

  foreach ($result_array as $result) {
   echo $result["name"] . "<br>";
  }
} else{

  echo('Nothing to display.');
}
}

}

E agora para passar um objeto json utilizo "json_encode()" certo?

Link to comment
Share on other sites

Parece-me que tens versões diferentes de PHP a correr nos dois ambientes.

Por último mas muito mais importante, usa PDO ou MySQLi com prepared statements. O uso da livraria mysql_* é desencorajada e deprecated.

+1

Tenta ter sempre o teu ambiente de desenvolvimento igual ao ambiente de produção - mesmas versões de software.

Todo o desenvolvimento na minha máquina correu bem. No entanto, após ter feito o upload para um servidor,

O workflow de atualização deve ser pelo menos:

Versão dev => Versão staging => versão de produção

Se houverem quebras/bugs, estas são detectadas na versão de estágio, e nunca na versão de produção. A versão de estágio deve conter samples dos dados em produção.

Por isso... NUNCA faças upload directamente para a versão de produção. E utiliza um sistema de controlo de versões para simplificar o workflow 😉

Edited by taviroquai
  • Vote 1
Link to comment
Share on other sites

+1

Tenta ter sempre o teu ambiente de desenvolvimento igual ao ambiente de produção - mesmas versões de software.

O workflow de atualização deve ser pelo menos:

Versão dev => Versão staging => versão de produção

Se houverem quebras/bugs, estas são detectadas na versão de estágio, e nunca na versão de produção. A versão de estágio deve conter samples dos dados em produção.

Por isso... NUNCA faças upload directamente para a versão de produção. E utiliza um sistema de controlo de versões para simplificar o workflow 😉

Eu ainda não tenho muita noção de como montar um workflow de forma correta, pelo que todos esses conceitos me estão ainda a passar um pouco ao lado! Tenho de investigar

Link to comment
Share on other sites

Eu ainda não tenho muita noção de como montar um workflow de forma correta, pelo que todos esses conceitos me estão ainda a passar um pouco ao lado! Tenho de investigar

Máquinas virtuais é a solução. Cria uma máquina virtual no teu pc com a mesma configuração do servidor que tens

Não sei que servidor usas para colocar os teus trabalhos mas a nível profissional, deves usar uma VPS, onde tens total controlo da máquina, inclusivé usar o Git para o workflow que indiquei. Vê por exemplo o serviço da DigitalOcean.

Link to comment
Share on other sites

funções mysqi e mysql para fazer conecao á base de dados já não são usadas, e os servidores que estão actualizados já nem aceita esses comandos, agora usa-se as funções PDO, que evita SQL injection e trás mais outros parametros de segurança e simplicidade

Link to comment
Share on other sites

funções mysqi e mysql para fazer conecao á base de dados já não são usadas, e os servidores que estão actualizados já nem aceita esses comandos, agora usa-se as funções PDO, que evita SQL injection e trás mais outros parametros de segurança e simplicidade

As funções mysql já estão obsoletas, mas o mesmo não acontece com as funções mysqli, que, tanto quanto sei, são suportadas em qualquer sistema recente, e que também permitem usar prepared statement para lidar com SQL injection.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.