Pourquoi ce code PHP se bloquer sur les appels à la fonction mysql_query ()?

voix
3

Je vais avoir du mal avec ce script PHP où je reçois l'erreur

Fatal error : le temps d'exécution maximum de 30 secondes dépassée dans /var/www/vhosts/richmondcondo411.com/httpdocs/places.php sur la ligne 77

Le code se bloque ici:

function getLocationsFromTable($table){

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

    return mysql_fetch_array($queryResult, MYSQL_ASSOC);

}

et ici (à ce jour):

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;

}

à la fois sur la ligne avec le mysql_query () appeler.

Je sais que j'utilise des styles différents pour chaque extrait de code, c'est parce que je joue avec le premier à essayer d'isoler la question.

Le $tabledans le premier exemple est « école » qui est une table qui existe sans aucun doute. Je ne sais pas pourquoi il est assis là et attend en temps au lieu de jeter à une erreur de retour à moi.

Les requêtes MySQL du reste du site fonctionnent correctement. J'ai essayé de faire que j'étais connecté comme ça

//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;

et il fait passé cette amende. Des idées?

Mettre à jour


Ce n'est pas la taille des tables. J'ai essayé d'obtenir seulement cinq dossiers et encore expiré. En outre, avec cette ligne:

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

il est à la recherche que pour un enregistrement spécifique, ce qui est là où il est maintenant suspendu.

Créé 27/08/2009 à 00:42
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
3

On dirait que MySQL est en train de transmettre des données valides retour à PHP, mais il y a tellement de ce qu'il n'y a pas le temps de terminer le processus avant Apache arrête le processus PHP pour dépasser son temps d'exécution maximum.

Est - il vraiment nécessaire de choisir tout de cette table? Quelle quantité de données est - il? Y at - il BLOBou des TEXTcolonnes qui expliqueraient le décalage particulier?

L'analyse de ce qui est sélectionné et ce que vous avez vraiment besoin serait un bon endroit pour commencer.

Créé 27/08/2009 à 00:45
source utilisateur

voix
2

Le temps passé en attente pour les requêtes MySQL pour renvoyer des données ne compte pas pour le temps d'exécution. Vois ici.

Le problème est très probablement ailleurs dans le code - les fonctions que vous accusez sont peut-être appelés dans une boucle infinie. Essayez de commenter le code MySQL pour voir si je ne me trompe pas.

Créé 27/08/2009 à 04:31
source utilisateur

voix
1

-si vous fait monter le temps d'exécution à 300 et il encore passé par ces 300 secondes, je pense que, par définition, vous avez quelque chose comme une boucle infinie va.

-mon premier suspect serait votre code php depuis MySQL est utilisé pour traiter de grands ensembles de données, donc certainement faire en sorte que vous êtes sûr d'atteindre effectivement la requête MySQL en question (mourir juste avant avec un message d'erreur ou quelque chose).

-si qui fonctionne, en cours d'exécution puis essayez en fait cette requête avec les données connues sur votre base de données via une interface de base de données ou via l'accès en ligne de commande à la base de données si vous avez, ou remplacer le code avec de bons chiffres connus si vous ne le faites pas.

-si la requête fonctionne sur son propre, je vérifierais pour injection sql accidentelle provenant de la HouseNumber $ ou variables de $, comme VolkerK mentionné.

Créé 27/08/2009 à 15:36
source utilisateur

voix
1

À moins que les paramètres $ HouseNumber et streetName $ pour hasCoordinates () sont déjà assainis pour la requête MySQL (très peu probable) , vous devez les traiter avec mysql_real_escape_string () pour éviter les injections SQL (intentionnelles ou non). Pour mysql_real_escape_string () fonctionne correctement (par exemple si vous avez changé le jeu de caractères via mysql_set_charset ) , vous devez également passer la ressource de connexion MySQL à la fonction.

Est -ce le rapport d'erreur mis à E_ALL et regardez - vous error.log du serveur Web (ou ont mis display_erorrs = On)?

Essaye ça

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

et se référer à http://dev.mysql.com/doc/refman/5.0/en/using-explain.html pour interpréter la sortie.

Créé 27/08/2009 à 09:11
source utilisateur

voix
1

Je ne sais pas la taille de votre table, mais essayer d' utiliser LIMIT 10et voir si plane encore.

Il se pourrait que votre table est juste grand pour aller chercher dans une requête.

Créé 27/08/2009 à 00:52
source utilisateur

voix
1

Est-ce que votre délai d'attente de code tente de se connecter ou se connecter et il ne se bloquer sur la requête?

Si votre code se fait passé l'appel mysql_query (même si elle doit attendre beaucoup de temps à délai d'attente), vous pouvez utiliser la fonction mysql_error pour déterminer ce qui est arrivé:

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

Ensuite, vous pouvez utiliser le numéro d'erreur pour déterminer la raison détaillée de l'erreur: les codes d'erreur MySQL

Si votre code est suspendu à la requête, vous pouvez essayer de décrire et d'exécuter la requête dans un client de ligne de commande MySQL pour voir si elle est un problème de taille des données. Vous pouvez également augmenter le temps d'exécution maximum pour permettre à la requête de remplir et de voir ce qui se passe:

ini_set('max_execution_time', 300); // Allow 5 minutes for execution
Créé 27/08/2009 à 00:52
source utilisateur

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