2010-09-21 2 views
0

Mon code est icitableau cant mise à jour de MySQL avec plus de 10000 enregistrements

$query = "SELECT * FROM `table`"; 
$result = mysql_query($query); 
$arr = array(); 
while($info = mysql_fetch_array($result)) { 

if (!in_array($info['row'], $arr)) { 
$arr[] = $info['row']; 
} 
} 

foreach ($arr as $v) { 
$pass = "pass"; 
$query2 = "UPDATE `table` SET pass = '$pass' WHERE row = '$v'"; 
$result2 = mysql_query($query2); 
} 

il traite pendant 2 minutes et rien ne se passe dans db. où pourrais-je avoir tort?

Merci

EDIT: OK j'ai trouvé mon erreur. Il s'agissait du code que j'ai écrit pour générer un laissez-passer aléatoire que je n'ai pas inclus dans ma question. merci tout le monde

+0

Je l'ai vu « mysql disparu » en traitant avec un grand ensemble de données. Pas sûr dans ce cas mais que se passe-t-il lorsque vous essayez avec des plus petits comme "select column1 from tableName"? Aussi, si vous pouvez mettre un peu de journalisation pour affiner le problème. Peut-être exécuter la première requête et assurez-vous qu'il fonctionne bien alors essayez une deuxième requête au lieu de les faire en un seul coup? –

+0

Votre code n'a pas d'erreurs évidentes. Essayez d'imprimer la première requête et d'arrêter le script. Puis collez ce code SQL dans votre interface de base de données. Est-ce que ça marche? – vassilis

+0

lorsque j'imprime le tableau (après la première boucle while) il imprime bien sans problème mais le problème est dans la mise à jour. Je vais essayer de ne dépanner que la première ligne maintenant –

Répondre

1

Une des possibilités est que vous manquez de mémoire: en stockant toutes les lignes d'un tableau, vous aurez besoin de beaucoup de mémoire avant même d'arriver à la partie mise à jour - dans ce cas, cela explique entièrement pourquoi vous ne voyez aucun changement; le script n'arrive jamais à cette partie.

Une autre possibilité est que votre script runs for too long et est arrêté. En fonction de la configuration de votre serveur, set_time_limit peut être une option dans ce cas.

Cependant, l'effet du script que vous nous montrez ici est exactement le même que cette seule requête:

UPDATE `table` SET pass = 'pass' 

puisque vous avez pas de conditions sur les lignes de la sélection, et le seul filtrage vous faire est de ne pas stocker plusieurs lignes avec la même valeur dans la colonne de la ligne - mais quand vous arrivez à la carte de mise à jour, vous identifions chaque ligne via la colonne de la ligne, ce qui signifie qu'il mettra à jour toutes les lignes avec la même valeur dans la colonne de la ligne . Si les valeurs de ligne sont uniques pour chaque ligne, il n'est pas nécessaire de vérifier si vous avez déjà vu la ligne; Si ce n'est pas unique, alors vous avez besoin d'un critère différent lors de la mise à jour.

Si vous exécutez la mise à jour directement, PHP ne sera pas nécessaire d'utiliser une tonne de mémoire et MySQL ne doivent rechercher chaque ligne individuelle lors de la mise à jour; il peut simplement les parcourir en une seule fois. À moins que vous ne laissiez quelque chose ici, vous feriez bien mieux de faire cette simple requête.

+0

première boucle fonctionne bien je peux imprimer_r le tableau avec 8000 enregistrements. les valeurs ne sont pas uniques, que "pass" est des nombres générés aléatoirement (je n'ai pas écrit le code ici) et j'ai voulu mettre à jour les lignes avec les mêmes données en donnant à chaque qui passe var. je vais vérifier cette limite de temps va mettre set_time_limit (0); –

Questions connexes