1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Script mysql

Discussão em 'Web Development' iniciada por likx, 25 de Maio de 2007. (Respostas: 18; Visualizações: 1142)

  1. likx

    likx Power Member

    Boa tarde, tenho uma pequena grande dúvida, com scripts em mysql. O meu problema é o seguinte, tenho uma base de dados que converti de access para mysql, e agora o problema que me surgiu foi na uniformização dos dados (ex: no campo nome, tenho alguns nome tudo em maiúsculas, e alguns nomes com maiúsculos lá pelo meio) sei que proceder as alterações à mão, pois as tabelas tem poucos registos, mas aconselharam-me a criar um script para a automatização desse processo.
    Não sei se perceberam o meu problema, será que alguém me pode ajudar? Obrigado
     
  2. msdevweb

    msdevweb Power Member

    podes fazer um script, não em mysql, mas em php que faça a ligação à base de dados, depois que passe campo a campo cada tabela da base de dados, e fazer um

    $campo_minusculas=strtolower($conteudo_campo);

    ve: http://www.php.net/strtolower

    abraço.
     
  3. likx

    likx Power Member

    Obrigado pela resposta, e segui a tua sugestão, e ai encontrei a funçao que queria, a ucwords()

    Agora o problema é a linguagem, pois é a 1ª vez que vou para o php, pelo menos ja consigo fazer a ligaçao à BD :D
     
  4. msdevweb

    msdevweb Power Member

    Humm... vê se isto ajuda:

    @mysql_connect("bla","bla","bla") or die("erro a ligar à bd"); //a tua ligação.

    depois de ligar à BD precisas de selecionar a tabela que queres:

    @mysql_select($tabela) or die("erro");

    $sql = "SLECT * FROM 'base_de_dados'.'tabela'";

    $resultado = mysql_query($sql) or die("impossivel listar dados");

    depois buscas o numero de linhas da tabela

    $total_linhas=mysql_num_rows($resultado);


    depois um ciclo para percorreres todas as linhas e alterares cada uma

    for ($i=0; $i<$total_linhas; $i++;) {

    //colocas o ponteiro na linha certa (podes usar o mysql_fetch_array)

    $dados_original = mysql_result($resultado, $i, "campo_da_tabela"); //buscas o campo

    $dados_temp=ucwords($dados_original); //alteras o campo

    agora é só fazeres o update à bd. algo como (visto que tens o ponteiro na linha certa, nao seria necessario o WHERE, mas pela via das duvidas usa na mesma)

    $sql = "UPDATE 'base_de_dados'.'tabela' SET 'capo_da_tabela'=$dados_temp WHERE 'campo_da_tabela=$dados_original";

    mysql_query($sql) or die("impossivel aterar");

    //ok, linha alterada, vamos continuar com o ciclo.
    //ATENÇãO, SE A TUA TABELA FOR ENORME ISTO VAI DEMORAR ALGUM TEMPO! DEPENDENDO PRINCIPALMENTE DA VELOCIDADE DE RESPOSTA DO TEU SERVIDOR MYSQL//

    }

    pronto, depos fazes isso para cada tabela, mudas apenas o "campo_da_tabela" para o campo que queres alterar, neste exemplo apenas altero um campo na tabela, para alterar mais é só seguires a lógica. (buscar para variaveis os outros campos, e altera-los e depois junta-los na intrução sql para gravar).

    Espero que te safes :)

    um abraço.
     
  5. likx

    likx Power Member

    Queria agradecer a ajuda que me foi dada, e ate gostei, pois eu andava a ver essas funções assim por alto para ver se era mesmo isso. Mas já adaptei o código e mesmo assim não faz nada.
    Alterei a parte da ligação ao servidor pelo que eu tinha aqui fiz alguns echo e não apareceu nada. Não sei mesmo o que se passa, será que alguém me dá outra vez uma mãozinha.

    <?php
    /*
    @mysql_connect("localhost","root","root") or die("erro a ligar à bd"); //ligação.

    @mysql_select($db1) or die("erro")
    */
    // Ligação a BD
    $link = mysql_connect('localhost', 'root', 'root');
    if (!$link) {
    die('Não foi possivel efectuar a ligação: ' . mysql_error());
    }
    echo "Ligacao efectuada com sucesso\n";
    //Escolher a BD
    mysql_select_db('db1') or die('Não foi possivel seleccionar a BD');

    $sql = "SELECT * FROM 'db1'.'aluno'";

    $resultado = mysql_query($sql) or die("impossivel listar dados");

    //buscar o numero de linhas da tabela

    $total_linhas=mysql_num_rows($resultado);

    //ciclo para percorrer todas as linhas e alterar cada uma

    for ($i=0; $i<$total_linhas; $i++ {

    //coloca ponteiro na linha certa (podes usar o mysql_fetch_array)

    $dados_original = mysql_result($resultado, $i, "Nome"); //buscas o campo

    $dados_temp=ucwords($dados_original); //alteras o campo

    $sql = "UPDATE 'db1'.'aluno' SET 'Nome'=$dados_temp WHERE 'Nome'=$dados_original";

    mysql_query($sql) or die("impossivel aterar");

    }

    // Fechar ligacao
    mysql_close($link);
    ?>
     
  6. mcog_blaster

    mcog_blaster Power Member

    E isto serve? :
    Fazes esta query a BD
    Vais ficar com os nomes todos em minusculas.
    Quando precisares de mostrar no browser, p.e. usas entao a funçao ucwords.

    Só uma ideia.
     
  7. msdevweb

    msdevweb Power Member


    á primeira vista, se esse codigo é exactamente o que tens no php, tem um erro, e um "alert" que não referi.

    o erro: //ciclo para percorrer todas as linhas e alterar cada uma

    for ($i=0; $i<$total_linhas; $i++ {

    falta o "(" para fechares o for

    correcto:

    for ($i=0; $i<$total_linhas; $i++) {

    é o suficiente para nao funcionar. esperimenta e só se não funcionar usa o passo seguinte.

    Alert: as tuas instruções sql, tenta no final colocares o ";" tipo:

    $sql = "UPDATE 'db1'.'aluno' SET 'Nome'=$dados_temp WHERE 'Nome'=$dados_original;";
    e
    $sql = "SELECT * FROM 'db1'.'aluno';";



    esperimenta e depois mostra o que aconteceu.

    abraço.
     
  8. likx

    likx Power Member

    tanta volta que dei e não reparei no "(", sim agora já efectua a ligação à BD, mas diz que é impossível listar dados, e já tentei das 2 maneiras que sugeriste com ";" e sem ";"
     
  9. msdevweb

    msdevweb Power Member

    pois, dependendo da versão mysql que tenhas, mas tenta só na string sql:

    $sql="SELECT * FROM 'aluno';"; //não coloque o db1.alunos, como já o mandaste selecionar a bd, ele pode estar a stressar com o db1., e a tua tabela é "aluno" ou "alunos"?, e testa primeiro sem o ";" vê isso com atenção.

    abraço.
    ps: estas a levar uma seca exaustiva de mysql! :)
     
    Última edição: 1 de Junho de 2007
  10. mcog_blaster

    mcog_blaster Power Member

    SELECT * FROM db1.aluno ou
    SELECT * FROM aluno

    arruma com essas plicas ou lá como se chamam.

    usa plicas quando estiveres a inserir, comparar algo
    ex: SELECT * from aluno WHERE aluno.id='10'
     
  11. msdevweb

    msdevweb Power Member


    ui ui, agora que falas nessas plicas, é verdade e bem verdade que aquilo não funcionasse, já que não era plicas que deviam la estar, mas sim "`"

    ERRO GRAVE MEU!

    A sintaxe mysql correcta é mesmo

    SELECT * FROM `db1`.`aluno`
    e mais abaixo onde tenho as 's substitui pelo acento "`".

    ora por isso peço desculpa, é o que dá afastar-me um bocado de mysql :)

    abraços e desculpa pelo erro.
     
  12. likx

    likx Power Member

    Efectuei as alterações todas que recomendaram, e continuou a não funcionar, pois aparecia o erro de que era impossível alterar, mas depois alterei também por `no nome aqui:

    $dados_original = mysql_result($resultado, $i, `Nome`);

    Depois de esta alteração funcionou, e até apareceram umas janelas da linha de comando, mas fui verificar à BD e o campo nome não tinha sido alterado.
     
  13. msdevweb

    msdevweb Power Member


    Apareceram umas janelas da linha de comandos??? isso não é normal... mas janelas de q?
    estranho...

    outra coisa, coloca um echo $dados_original; antes e a seguir à tranformação ucwords e vê o que te apresenta como dados para ver se a operação esta a ser bem feita.

    um abraço.
     
  14. likx

    likx Power Member

    Bem, quando fiz o echo, só me apareceram os numeros de aluno e não os nomes, mas fui a 1ª expressão de sql e fiz um SELECT `Nome` em vez de SELECT *

    Com esta alteração já aparece o 1º nome que esta na BD, mesmo com um segundo echo a seguir ao ucwords, só aparece a mensagem de erro "impossível alterar ".

    Mais uma vez deixo aqui o codigo:
    <?php
    /*
    @mysql_connect("localhost","root","root") or die("erro a ligar à bd"); //ligação.

    @mysql_select($db1) or die("erro")
    */
    // Ligação a BD
    $link = mysql_connect('localhost', 'root', 'root');
    if (!$link) {
    die('Não foi possivel efectuar a ligação: ' . mysql_error());
    }
    echo "Ligacao efectuada com sucesso\n";
    //Escolher a BD
    mysql_select_db('db1') or die('Não foi possivel seleccionar a BD');

    $sql = "SELECT `Nome` FROM `db1`.`aluno`;";

    $resultado = mysql_query($sql) or die("impossivel listar dados");

    //buscar o numero de linhas da tabela

    $total_linhas=mysql_num_rows($resultado);

    //ciclo para percorrer todas as linhas e alterar cada uma

    for ($i=0; $i<$total_linhas; $i++) {

    //coloca ponteiro na linha certa (podes usar o mysql_fetch_array)

    $dados_original = mysql_result($resultado, $i, `Nome`); //buscas o campo
    echo "$dados_original";
    $dados_temp=ucwords($dados_original); //alteras o campo
    echo "$dados_original";
    $sql = "UPDATE `db1`.`aluno` SET `Nome`=$dados_temp WHERE `Nome`=$dados_original;";

    mysql_query($sql) or die("impossivel alterar");

    }

    // Fechar ligacao
    mysql_close($link);
    ?>


    As janelas não sei explicar, só sei que agora já só aparece 1 janela, aparece e desaparece logo a seguir, mas deve ser normal, acho eu
     
  15. msdevweb

    msdevweb Power Member

    tenta no final:

    $sql = "UPDATE `aluno` SET `Nome`='$dados_temp' WHERE `Nome`='$dados_original';";

    ou em ultimo caso

    $sql = "UPDATE `aluno` SET `Nome`='$dados_temp' WHERE `Nome` LIKE $dados_original";


    See what you get!

    vê no que dá.
     
  16. likx

    likx Power Member

    Houve progressos, pois assim já escreve na BD, o problema é que escreveu $dados_original em todos os campos, também não sei se foi com LIKE ou sem LIKE, pois só me lembrei de ir verificar à BD depois de ter tentado com as 2 versões e de ter verificado nos echo que so aparecia $dados_original
     
  17. msdevweb

    msdevweb Power Member

    lol :)

    escreveu dados_original ??? ou dados_temp ???

    se foi $dados_original, o teu ucwords está mal, se foi $dados_temp o problema é da instrução de escrita sql.. verifica isso.

    abraço.
     
  18. likx

    likx Power Member

    Bem, o erro está explicado, fiz a alteração um bocado à pressa pois ia passar o fim de semana a casa, e só hoje é que reparei que não tinha coloca ao plica em '$dados_original' :D
     
  19. likx

    likx Power Member

    Já está resolvido, o problemas estava mesmo nos nomes escritos a maiúsculas, pois o ucwords só funciona se a string estiver em minúsculas. Só foi preciso colocar dentro do ucwords o strtolower

    $dados_temp=ucwords(strtolower(&dados_original));

    Agora queria agradecer principalmente ao msdevweb e ao mcog_blaster pela ajuda que me deram neste meu problema.
     

Partilhar esta Página