apt Posté 18 Décembre 2004 Posté 18 Décembre 2004 Salut, j'ai fait une requete pour avoir tout les enregistrements ayant le champ act egal à 2 SELECT `id` FROM `tab` WHERE `act` = 2 j'ai sauvegarde le tout dans un fichier *.sql j'aimerias avoir un petit code php qui fera en sorte de changer dans mon fichier sql tout les lignes : INSERT INTO `tab` VALUES (x); par UPDATE `tab` SET `act` = '2' WHERE `id` = 'x'; et puis lancer le nouveau fichier pour mettre a jour ma table sur mon hebergeur. Merci.
petit-ourson Posté 19 Décembre 2004 Posté 19 Décembre 2004 (modifié) C'est plus facile a faire avec ultraedit. Sinon un code en live : $tab = file("tonfichier.sql"); for($i=0;$i<count($tab); $i++) { $contenu = $tab[$i]; $contenu = str_replace ( "INSERT INTO ", "UPDATE ", $contenu ); $contenu = str_replace ( " VALUES (", " SET `act` = '2' WHERE `id` = '", $contenu ); $contenu = str_replace ( ");", "';", $contenu ); $newtab[] = $contenu; } $handle = fopen("newfichier.sql", 'w+'); for($i=0;$i<count($newtab); $i++) { fwrite($handle, $newtab[$i]); } fclose($handle); Un truc comme ca ? Hum j'ai pris en compte que si ton fichier avait toutes ses lignes à changer sinon il faudrait ajouter un if au niveau du premier "for". Modifié 19 Décembre 2004 par petit-ourson
petit-ourson Posté 19 Décembre 2004 Posté 19 Décembre 2004 Enfin oui et non. Si je met juste un $newtab[], il me crée une nouvelle ligne dans mon tableau à la fin de celui-ci comme un grand. Il en parle pas dans la doc php (ou j'ai pas trouvé mais ça revient à cela : []= could be considered an Array Operator (in the same way that .= is a String Operator).[]= pushes an element onto the end of an array, similar to array_push:
apt Posté 19 Décembre 2004 Auteur Posté 19 Décembre 2004 Merci petit-ourson, mais il reste la valeur x du champ 'id' pour la clasuse WHERE ... comment la recuperer stp ?
petit-ourson Posté 19 Décembre 2004 Posté 19 Décembre 2004 euh... avec les replace que j'ai indiqué, on y touche pas au x.
apt Posté 19 Décembre 2004 Auteur Posté 19 Décembre 2004 Je m'excuse petit-ourson ... reçu 5/5 et ça fonctionne tres bien ... Merci infiniment. je vais essayer d'avoir un code qui partage le fichier initial en petits morceaux pour eviter de passer le temps d'execution de script qui est 30 secondes ensuite je ferais de meme avec le second fichier lequel je devrais lancer sur mon hebergeur ....
petit-ourson Posté 19 Décembre 2004 Posté 19 Décembre 2004 Bon courage. Ce n'est qu'une piste simple. On peut certainement aller plus vite. Je ne me suis pas penché sur les questions de rapidité et de charges ;o)
Anonymus Posté 20 Décembre 2004 Posté 20 Décembre 2004 Bonjour, pour ce qui est de la limitation du temps maximum d'execution des scripts, tu peux jeter un oeil à la fonction : set_time_limit. void set_time_limit ( int seconds) Autrement dit, tu mets set_time_limit ( 86400); au début de ton script, et il s'executera pendant une journée maximum, et non 30 secondes. Nico.
apt Posté 20 Décembre 2004 Auteur Posté 20 Décembre 2004 (modifié) Merci petit-ourson pour tes encouragements Anonymus -> set_time_limit (86400) peut-elle "ecraser" le temps par defaut dans php.ini limité par 30 secondes meme sur des hebergeurs comme multimania ? J'ai modifier le code de petit-ourson pour en avoir des petits morceaux du fichier resultats.sql, le voila : $handle = fopen("res00.sql", 'w+');for($i=0;$i<count($newtab); $i++) { if ($i%40==0) // 40 lignes par fichier { fclose($handle); echo "i = ".$i." "; $j = ceil($i/40); $fich = "res$j"; echo "$fich = ".$j."<br>"; $handle = fopen("$fich.sql", 'w+'); } echo "ii = ".$i."<br>"; fwrite($handle, $newtab[$i]);}fclose($handle); mais j'ai un probleme : j'aimerais bien supprimer la ligne : $handle = fopen("res00.sql", 'w+'); parce que le fichier : res00.sql resultant est vide et il est aussitot ferme apres le premier if (true). Comment faire ? Merci. Modifié 20 Décembre 2004 par apt
Anonymus Posté 21 Décembre 2004 Posté 21 Décembre 2004 Pour Multimania, je ne sais pas. Mais je sais qu'elle peut 'écraser' la valeur chez pas mal d'hébergeurs en mutualisés.
apt Posté 21 Décembre 2004 Auteur Posté 21 Décembre 2004 Je ne sais pas si qqn a essaye cela pour nous dire ce que s'est passe avec lui ... ?
Anonymus Posté 21 Décembre 2004 Posté 21 Décembre 2004 Essaies, ca ne coute rien. Tu as besoin de 2 fonctions, à savoir : max_execution_time(nb_de_secondes_pendant_lequel_le_script_tourne_maxi); sleep(nb_de_secondes_pendant_lequel_le_script_dort); Tu mets : max_execution_time(86400); sleep(100); echo"coucou"; Si ca plante, c'est que la fonction n'est pas acceptée Nico.
apt Posté 21 Décembre 2004 Auteur Posté 21 Décembre 2004 Une erreur : Fatal error: Call to undefined function: max_execution_time()
Anonymus Posté 21 Décembre 2004 Posté 21 Décembre 2004 Désolé max_execution_time, c'est la directive de configuration... La fonction, c'est set_time_limit. Tu remplaces l'un par l'autre
apt Posté 21 Décembre 2004 Auteur Posté 21 Décembre 2004 J'ai fait ce code : <?set_time_limit(120);sleep(40);echo"coucou";?> Et ca fonctionne tres bien C'est merveilleux Merci Nicolas
apt Posté 21 Décembre 2004 Auteur Posté 21 Décembre 2004 Et pour ce code : $handle = fopen("res00.sql", 'w+');for($i=0;$i<count($newtab); $i++) {if ($i%40==0) // 40 lignes par fichier{ fclose($handle); echo "i = ".$i." "; $j = ceil($i/40); $fich = "res$j"; echo "$fich = ".$j."<br>"; $handle = fopen("$fich.sql", 'w+');}echo "ii = ".$i."<br>";fwrite($handle, $newtab[$i]);}fclose($handle); Y'a-t-il une solution ? Merci
Anonymus Posté 21 Décembre 2004 Posté 21 Décembre 2004 Je ne comprend pas où tu veux en venir, avec ton code :/ Il est sensé faire quoi, s'il te plait ?
apt Posté 21 Décembre 2004 Auteur Posté 21 Décembre 2004 Ce code sert a deviser le fichier resultats.sql en petits fihiers de 40 lignes chacun par exemple pur faciliter la mise à jour de mon BDD en auto ou en manuelle ... Il finctionne a merveille mais j'aimerais bien supprimer la ligne : $handle = fopen("res00.sql", 'w+'); parce que le fichier : res00.sql resultant est vide et il est aussitot ferme apres le premier if (true). Comment faire ? Voilà
Anonymus Posté 21 Décembre 2004 Posté 21 Décembre 2004 fais commencer ta boucle for à 1, comme ca, ca évite le '0'.
Anonymus Posté 21 Décembre 2004 Posté 21 Décembre 2004 ou alors enlèves ta ligne, carrément, et teste ton $handle. if($handle) fclose($handle)
apt Posté 22 Décembre 2004 Auteur Posté 22 Décembre 2004 Non non c'est pas un probleme de numero de fichier. mais si j'ecris le code comme suit : for($i=0;$i<count($newtab); $i++) { if ($i%50==0) { fclose($handle); echo "i = ".$i." "; $j = ceil($i/50); $fich = "res$j"; echo "$fich = ".$j."<br>"; $handle = fopen("$fich.sql", 'w+'); } echo "ii = ".$i."<br>"; fwrite($handle, $newtab[$i]);}fclose($handle); en enlevant la ligne : $handle = fopen("res00.sql", 'w+'); ca me donne cette erreur : Warning: fclose(): supplied argument is not a valid File-Handle resource ???
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant