Por que esse código PHP pendurar em chamadas para mysql_query ()?

votos
3

Estou tendo problemas com este script PHP onde eu recebo o erro

Erro fatal : o tempo de execução máximo de 30 segundos ultrapassado em /var/www/vhosts/richmondcondo411.com/httpdocs/places.php na linha 77

O código paira aqui:

function getLocationsFromTable($table){

    $query = SELECT * FROM `$table`;
    if( ! $queryResult = mysql_query($query)) return null;

    return mysql_fetch_array($queryResult, MYSQL_ASSOC);

}

e aqui (até agora):

function hasCoordinates($houseNumber, $streetName){

    $query = SELECT lat,lng FROM geocache WHERE House = '$houseNumber' AND StreetName = '$streetName';
    $row = mysql_fetch_array(mysql_query($query), MYSQL_ASSOC);
    return ($row) ? true : false;

}

tanto na linha com o mysql_query () chamar.

Eu sei que usar estilos diferentes para cada trecho de código, é porque eu tenho jogado com o primeiro a tentar isolar o problema.

O $tableno primeiro exemplo é 'escola' que é uma tabela que definitivamente existe. Eu só não sei por que ele fica lá e espera para expirar em vez de jogar um erro de volta para mim.

As consultas mysql do resto do site estão funcionando corretamente. Eu tentei ter certeza que eu estava conectado como este

//connection was opened like this:
//$GLOBALS['dbh']=mysql_connect ($db_host, $db_user, $db_pswd) or die ('I cannot connect to the database because: ' . mysql_error());

if( ! $GLOBALS['dbh']) return null;

e tornou passado que bem. Alguma ideia?

Atualizar


Não é o tamanho das tabelas. Tentei ficar apenas cinco registros e ainda expirou. Além disso, com esta linha:

$query = SELECT lat,lng FROM geocache WHERE House = '$houseNumber' AND StreetName = '$streetName';

ele só está à procura de um registro específico e é aí que está pendurado agora.

Publicado 27/08/2009 em 00:42
fonte usuário
Em outras línguas...                            


6 respostas

votos
3

Parece que o MySQL está ocupado transmissão de dados válidos de volta para PHP, mas há tanto dele que não há tempo para terminar o processo antes de Apache encerra o processo PHP por exceder seu tempo máximo de execução.

É realmente necessário para selecionar tudo daquela mesa? A quantidade de dados é? Há BLOBou TEXTcolunas que seriam responsáveis por determinado lag?

Analisando o que está sendo selecionado e que você realmente precisa seria um bom lugar para começar.

Respondeu 27/08/2009 em 00:45
fonte usuário

votos
2

Tempo de espera para consultas mysql para retornar dados não conta para o tempo de execução. Veja aqui.

O problema é mais provável em outro lugar no código - as funções que você está culpando são, possivelmente, chamado em um loop infinito. Tente comentar o código mysql para ver se eu estou certo.

Respondeu 27/08/2009 em 04:31
fonte usuário

votos
1

-Se você aumentou o tempo de execução de 300 e ainda passou por isso 300 segundos, eu acho que, por definição, você tem algo como um loop infinito indo.

-Meu primeiro suspeito seria seu código PHP desde o MySQL é usado para lidar com grandes conjuntos de dados, por isso definitivamente se certificar de que você está realmente atingindo a consulta mysql em questão (die direito perante ela com uma mensagem de erro ou algo assim).

-Se que funciona, então tente realmente executar essa consulta com os dados conhecidos em seu banco de dados através de algum gui banco de dados ou através do acesso à linha de comando para o banco de dados se você tem que, ou substituir o código com bons números conhecidos se não o fizer.

-Se a consulta funciona por si própria, então eu iria verificar se há injeção de SQL acidental vindo com os US $ housenumber ou US $ streetname variáveis, como VolkerK mencionado.

Respondeu 27/08/2009 em 15:36
fonte usuário

votos
1

A menos que os parâmetros $ housenumber e US $ streetname para hasCoordinates () já são higienizados para a consulta MySQL (muito improvável), você precisa tratá-los com mysql_real_escape_string () para evitar injeções SQL (intencionais ou não). Para mysql_real_escape_string () para funcionar corretamente (por exemplo, se você tiver alterado o charset via mysql_set_charset ) você também deve passar o recurso de conexão MySQL para a função.

É o relato de erros definido para E_ALL e você olhar para o error.log do servidor web (ou ter definido display_erorrs = On)?

tente este

function hasCoordinates($houseNumber, $streetName) {
  $houseNumber = mysql_real_escape_string($houseNumber);
  $streetName = mysql_real_escape_string($streetName);
  $query = "
    EXPLAIN SELECT
      lat,lng
    FROM
      geocache
    WHERE
      House='$houseNumber'
      AND StreetName='$streetName'
  ";
  $result = mysql_query($query) or die(mysql_error());
  while ( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
    echo htmlspecialchars(join(' | ', $row)), "<br />\n";
  }
  die;
}

e referem-se a http://dev.mysql.com/doc/refman/5.0/en/using-explain.html para interpretar a saída.

Respondeu 27/08/2009 em 09:11
fonte usuário

votos
1

Eu não sei sobre o tamanho de sua mesa, mas tente usar LIMIT 10e ver se ainda paira.

Pode ser que sua tabela é apenas a grande para buscá-lo em uma consulta.

Respondeu 27/08/2009 em 00:52
fonte usuário

votos
1

Será que o seu tempo limite código tentar ligar ou ele ligar e pendurar na consulta?

Se o seu código realmente consegue passar a chamada mysql_query (mesmo que tenha que esperar um longo tempo para tempo limite), então você pode usar a função mysql_error para determinar o que aconteceu:

mysql_query("SELECT * FROM table");
echo mysql_errno($GLOBALS['dbh']) . ": " . mysql_error($GLOBALS['dbh']) . "\n";

Então, você pode usar o número de erro para determinar a razão detalhada para o erro: códigos de erro do MySQL

Se o seu código está pendurado na consulta, você pode tentar descrever e executar a consulta em um cliente de linha de comando mysql para ver se é uma questão de tamanho de dados. Você também pode aumentar o tempo máximo de execução para permitir a consulta para completar e ver o que está acontecendo:

ini_set('max_execution_time', 300); // Allow 5 minutes for execution
Respondeu 27/08/2009 em 00:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more