Aller au contenu

Remplacer INSERT par UPDATE


Sujets conseillés

Posté

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.

Posté (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é par petit-ourson
Posté

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:

Posté

Merci petit-ourson,

mais il reste la valeur x du champ 'id' pour la clasuse WHERE ...

comment la recuperer stp ?

Posté

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 ....

;)

Posté

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)

Posté

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.

Posté (modifié)

Merci petit-ourson pour tes encouragements :D

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é par apt
Posté

Pour Multimania, je ne sais pas. Mais je sais qu'elle peut 'écraser' la valeur chez pas mal d'hébergeurs en mutualisés.

Posté

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.

Posté

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

Posté

J'ai fait ce code :

<?
set_time_limit(120);
sleep(40);
echo"coucou";
?>

Et ca fonctionne tres bien :o

C'est merveilleux :D

Merci Nicolas :)

Posté

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 :)

Posté

Je ne comprend pas où tu veux en venir, avec ton code :/

Il est sensé faire quoi, s'il te plait ?

Posté

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à :lol:

Posté

ou alors enlèves ta ligne, carrément, et teste ton $handle.

if($handle)

fclose($handle)

Posté

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

???

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...