2010-02-13 5 views
0

i a écrit un code pour mettre à jour le cryptage de mot de passe dans mon site .. le code est ..Erreur fatale en php (dépassé 60 de temps exec)

<?php 
$db= mysql_pconnect("localhost","root","root"); 
mysql_select_db("nitconnect"); 
$query="select password from register limit 1000"; 
$result=mysql_query($query); 
$c=0; 
while($ans=mysql_fetch_array($result)) 
{ 
    $newpass=sha1($ans[0].'Q*iV%qKz$&!C'); 
    $newone="update register set password='{$newpass}' where password='{$ans[0]}'"; 
    mysql_query($newone); 
} 
?> 

Comment je ne corriger cette erreur?

+0

Combien de requêtes faites-vous? Pouvez-vous tester les sorties 'echo' pour déterminer à quel moment se produit le timeout? Ajoutez également la gestion des erreurs mysql afin de savoir si le script parvient à se connecter à la base de données. www.php.net/mysql_error –

+0

Pourrait aider si vous formatez le code pour une meilleure visibilité (utilisez l'option de code dans l'éditeur) et montrez l'erreur que vous obtenez. –

+0

"Erreur fatale en php (** dépassé 60s de temps d'exécution **)" – badp

Répondre

1

il n'y a pas de solution réelle autre que la mise élevée dans php.ini de max_execution_time de php, mais:

MySQL supporte nativement SHA1, vous pouvez peut-être juste faire quelque chose comme

update register set password = sha1(concat(password, 'Q*iV%qKz$&!C')) 

cela devrait être beaucoup plus rapide que votre solution php.

encore la performance de votre requête semble très faible sauf si vous êtes sur une ancienne boîte. peut-être n'avez-vous aucun index défini pour le champ de mot de passe?

+0

merci .. mais mon max_execution_time est d'environ 500secs .. je l'ai édité .. encore l'erreur apparaît .. aucune idée de l'erreur? – kgdinesh

+0

avez-vous redémarré votre serveur Web? :) – roman

+0

yup .. btw je l'ai interrogé directement en utilisant votre commande dans phpmyadmin .. il a fallu jus 0,013 secs .. merci beaucoup .. !! oh im tel un n00b .. :( – kgdinesh

1
<?php 

    $db= mysql_pconnect("localhost","root","root"); 
    mysql_select_db("nitconnect"); 
    $query="UPDATE register SET password = SHA1(CONCAT(password, 'Q*iV%qKz$&!C')) WHERE 1"; 
    $result=mysql_query($query); 

?> 
0

En supposant la méthode SHA1 native de MySQL (comme le suggère roman) ne fonctionne pas, essayez d'ajouter ceci dans votre boucle:

set_time_limit(10); 

Il sera essentiellement réinitialiser le délai d'attente de PHP à chaque fois que cette fonction est appelée, donner il 10 secondes de plus pour terminer.

0

Vous sélectionnez 1000 enregistrements, puis en utilisant chaque valeur en boucle foreach et mise à jour du db à nouveau, cela est probablement ce que vous fait hors du temps, essayez d'augmenter le délai en mettant cela sur le dessus de votre script:

ini_set('max_execution_time', 14000); // or whatever value 
0

Une autre solution serait de faire des enregistrements en morceaux, puis d'utiliser un en-tête pour vous renvoyer au même script, en passant l'index de la dernière mise à jour, et ensuite le prochain morceau.

Quelque chose comme:

if(issset($_GET['start']) { 
    $start = $_GET['start']; 
} else { 
    $start = 0; 
} 

$query="select password from register limit $start, 50"; 
... do your stuff ... 

$start = $start + 50; 
header("Location: http://www.example.com/yourscript.php?start=$start"); 
Questions connexes