Jump to content
mikelll

mover dados de uma tabela para outra com PHP/MYSQL

Recommended Posts

mikelll

Boas pessoal do PHP!

Necessito da vossa ajuda! Preciso fazer um script em PHP que de uma tabela com mais de 10 valores armazenados, enquanto existirem mais de 10, pega neles e move-os para outra tabela.

Algo deste genero:

<?php

$ligacao = mysql_connect("localhost", "root", ""); 
mysql_select_db("estuda",$ligacao); 

$query = mysql_query("SELECT * FROM tabela"); 
$tabela = mysql_fetch_array($query); 
while(mysql_num_rows($query) > 10){ 
    mysql_query("INSERT INTO tabela2(id, nome, morada) values({$tabela['id']},{$tabela['nome']},{$tabela['morada']}"); 
    mysql_query("DELETE FROM tabela (id, nome, morada) WHERE id = {$query['id']}"); 
    echo "o valor: {$query['id']} foi movido com sucesso!"; 
    }

só que devolve um erro:

Fatal error: Maximum execution time of 30 seconds exceeded:

nesta linha

mysql_query("DELETE FROM tabela (id, nome, morada) WHERE id = {$query['id']}"); 

alguem me pode dar uma ajuda?

Obrigado

Share this post


Link to post
Share on other sites
ruimcosta

O eliminar registo não deveria demorar mais de 30 segundos a executar mesmo que fosse um grande numero de registos a eliminar...

De qualquer forma para eliminar os registos:

mysql_query("DELETE FROM tabela WHERE id = {$query['id']}"); 


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
mikelll

O eliminar registo não deveria demorar mais de 30 segundos a executar mesmo que fosse um grande numero de registos a eliminar...

De qualquer forma para eliminar os registos:

mysql_query("DELETE FROM tabela WHERE id = {$query['id']}"); 

O eliminar registo não deveria demorar mais de 30 segundos a executar mesmo que fosse um grande numero de registos a eliminar...

De qualquer forma para eliminar os registos:

mysql_query("DELETE FROM tabela WHERE id = {$query['id']}"); 

entra em loop ao que parece

Share this post


Link to post
Share on other sites
brunoais

Boas pessoal do PHP!

Necessito da vossa ajuda! Preciso fazer um script em PHP que de uma tabela com mais de 10 valores armazenados, enquanto existirem mais de 10, pega neles e move-os para outra tabela.

Algo deste genero:

<?php

while(mysql_num_rows($query) > 10){ 
    mysql_query("INSERT INTO tabela2(id, nome, morada) values({$tabela['id']},{$tabela['nome']},{$tabela['morada']}"); 
    mysql_query("DELETE FROM tabela (id, nome, morada) WHERE id = {$query['id']}"); 
    echo "o valor: {$query['id']} foi movido com sucesso!"; 
    }

Simples. Se uma vez o:

while(mysql_num_rows($query) > 10){

der true, irá dar true para sempre. Não me admira q entre em loop infinito


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
brunoais

Se calhar isto:

$ligacao = mysql_connect("localhost", "root", ""); 
mysql_select_db("estuda",$ligacao); 

$query = mysql_query("SELECT * FROM tabela"); 

if(mysql_num_rows($query) > 10){ 
    mysql_query("INSERT INTO tabela2(SELECT * FROM tabela)") OR die(mysql_error()); 
    mysql_query("TRUNCATE tabela") OR die(mysql_error()); 
    echo "os valores foram movidos com sucesso!"; 
}

Verifica sff


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mikelll

primeiro deu este erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM tabela' at line 1

depois fui ver à tabela dois e tem os mesmo campos que na tabela original, so que com um zero em cada campo, à excepção do 'id' que e´auto increment.

Na tabela original os dados mantêm-se

Share this post


Link to post
Share on other sites
brunoais

alterei o código.

experimenta outra vez sff


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mikelll

pois...apagou tudo da "tabela" de origem (tinha 13 valores, devia guardar 3) e na de destino meteu um "0" em cada campo, sem contar o o ID que auto incrementa

Share this post


Link to post
Share on other sites
yoda

Muito gostam de escrever e perder tempo.

Umas perguntas :

1. Qual é o objectivo disso (objectivo mesmo, não é o "querer guardar apenas 10 registos")?

2. Como defines o que é para manter e o que é para sair fora (tendo em conta que a query que apresentas não discrimina o conteúdo, e apaga registos de forma semi-aleatória)

Share this post


Link to post
Share on other sites
mikelll

Muito gostam de escrever e perder tempo.

Umas perguntas :

1. Qual é o objectivo disso (objectivo mesmo, não é o "querer guardar apenas 10 registos")?

2. Como defines o que é para manter e o que é para sair fora (tendo em conta que a query que apresentas não discrimina o conteúdo, e apaga registos de forma semi-aleatória)

Se leres o que eu perdi tempo...ups...escrevi, escusavas de perder tempo em escrever essa pergunta e de fazer perder tempo em ter responder:

Primeiro POST:

Necessito da vossa ajuda! Preciso fazer um script em PHP que de uma tabela com mais de 10 valores armazenados, enquanto existirem mais de 10, pega neles e move-os para outra tabela.

O que não entendes?

Objectivo é isso mesmo, ir fazendo backup as dados de uma tabela sempre que ela tem mais de 10 registos, apagando-os na sua fonte depois de estarem copiados

Obrigado

Share this post


Link to post
Share on other sites
yoda

Fiz a pergunta porque o que disses-te não me fez sentido: Porque queres apagar esses registos? Há uma boa razão para isso? A partir da resposta, outro tipo de soluções podem aparecer para o teu caso. Muitas vezes pecamos por pensar mal nos problemas que temos à nossa frente, e procuramos resposta à nossa ideia de resolução quando há outras alternativas mais viáveis.

Share this post


Link to post
Share on other sites
mikelll

Fiz a pergunta porque o que disses-te não me fez sentido: Porque queres apagar esses registos? Há uma boa razão para isso? A partir da resposta, outro tipo de soluções podem aparecer para o teu caso. Muitas vezes pecamos por pensar mal nos problemas que temos à nossa frente, e procuramos resposta à nossa ideia de resolução quando há outras alternativas mais viáveis.

Ora essa...se digo que preciso é porque preciso mesmo! Pode não ter aplicação para ti, mas para mim tem. Agradeço se me quiseres ajudar, mas se não é essa a tua vontade, obrigado na mesma, mas o que eu preciso é de soluções concretas, não de filosofia.

Thanks

Share this post


Link to post
Share on other sites
yoda

Se vens aqui pedirem que te façam o trabalho ou pedir ajuda, acho que não custa nada expor aquilo que realmente pretendes que aconteça e em que contexto. Se te sentes ofendido com isso, boa sorte com a restante comunidade.

No teu caso, a não ser que exista uma razão muito boa para andar a mover registos (que implicaria uma série de queries em cada request e tornaria o site / serviço mais lento, a não ser que fosse feito com cronjobs), podias simplesmente meter uma flag nas moradas com que pudesses apenas ver aquelas que te interessam.

Share this post


Link to post
Share on other sites
brunoais

Se queres a minha ajuda preciso que indiques exactamente o que é que queres que faça. O que indicaste não é suficientemente claro para mim. Falta indicar as regras de selecção (q, pelos vistos, n tem. E se n tem n faz sentido fazer o q indicas), quando é q isso acontece e se tens permissões para triggers.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mikelll

o que pretendo é simplesmente o que disse antes...

passar os dados de uma tabela para outra, utilizando php. A condição para passar os dados é que isso irá acontecer quando a tabela tiver mais de 10 registos.

Pelo que já andei a ler pela net, isso faz-se com um ciclo while, algo do género:

Enquanto (total de linhas na tabela >10){

    insere na tabela dois

  apaga na tabela original

  actualiza total de linhas na tabela

}

Share this post


Link to post
Share on other sites
ruimcosta

O problema de muito programador (opinião pessoal, vá...insultem-me!!) não é a programação em si, mas pensar na lógica da "coisa".

Vê se entendes a solução que proponho e diz-me se funciona:

$sql = "select id from tabela";
$rs  = mysql_query($sql);

if( mysql_num_rows($rs) > 10 ){
    $nreg = mysql_num_rows($rs) - 10; //Obtem o numero de registos acima de 10
    
    $sql = "select id from tabela limit 10, $nreg"; // Selecciona a partir do 10º o número de registos excedentes
    $rs  = mysql_query($sql);
    
    while( $row = mysql_fetch_array($rs) ){
        mysql_query("insert into tabela2(campo1,campo2) values('".$row['campo1']."','".$row['campo2']."')");
        mysql_query("delete from tabela1 where id = '".$row['id']."'");
    }
    
}


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
mikelll

É mesmo isto Rui!

Contudo depois de adaptar ao meu caso especifico:

<?php 

$ligacao = mysql_connect("localhost", "root", "");
if (!$ligacao){
    die("Ocorreu um erro no na ligação");
}
mysql_select_db("estuda",$ligacao);

$sql = "select id from tabela";
$rs  = mysql_query($sql);

if( mysql_num_rows($rs) > 10 ){
    $nreg = mysql_num_rows($rs) - 10; //Obtem o numero de registos acima de 10
    
    $sql = "select id from tabela limit 10, $nreg"; // Selecciona a partir do 10º o número de registos excedentes
    $rs  = mysql_query($sql);
    
    while( $row = mysql_fetch_array($rs) ){
        mysql_query("insert into tabela2(nome2,morada2) values('".$row['nome']."','".$row['morada']."')");
        mysql_query("delete from tabela where id = '".$row['id']."'");
    }
    
}

Recebo estes avisos:

Notice: Undefined index: nome in ...tabelas.php on line 19

Notice: Undefined index: morada in ...tabelas.php on line 19

Notice: Undefined index: nome in ...tabelas.php on line 19

Notice: Undefined index: morada in ...tabelas.php on line 19

Notice: Undefined index: nome in ...tabelas.php on line 19

Notice: Undefined index: morada in ...tabelas.php on line 19

Depois vejo que realmente apagou os dados na minha tabela original (deixando 10), mas na tabela2 apenas inseriu uma linha com um 0 em cada campo!

Share this post


Link to post
Share on other sites
ruimcosta

biba,

Minha culpa no copy/paste..eheh

 $sql = "select id, nome, morada from tabela limit 10, $nreg"; // Selecciona a partir do 10º o número de registos excedentes
    $rs  = mysql_query($sql);
    
    while( $row = mysql_fetch_array($rs) ){
        mysql_query("insert into tabela2(nome2,morada2) values('".$row['nome']."','".$row['morada']."')");
        mysql_query("delete from tabela where id = '".$row['id']."'");
    }

Faltava no 2º sql que tem o limit, especificar o nome dos campos nome e morada...ve a alteraçao que fiz


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.