- Fórum WMO
- → osvaldo luso's Content
osvaldo luso's Content
There have been 20 items by osvaldo luso (Search limited from 28/04/2023)
#980379 Instrução Load Data Infile
Posted by osvaldo luso on 17/09/2009, 00:44 in PHP
possui delimitadores, ou seja, linha de tamanho fixo. Em pesquisa descobri que a instrução LOAD DATA INFILE é capaz
de realizar uma importação em velocidade muito alta (meu arquivo tem aproxidamente 50000 linhas). Segue abaixo
uma linha do arquivo:
0010025000251618501110002543900100025027000765700850589000000000001580000
Da coluna 1 até a 3 é o numero do banco,
da 4 até 7 é o prefixo da agencia,
da 8 até 13 é a conta, e assim por diante.
Tenho um método chamado sql que executa a query que passo como parâmetro e abaixo segue um exemplo de
LOAD DATA INFILE que achei, mas não é para arquivos sem delimitadores. Alguém saberia me dizer quais as
alterações que devo fazer para conseguir importar meu arquivo????:
$rsCheques = $mySQL->sql("LOAD LOCAL DATA INFILE 'c:/CST/cxq9021509.txt' INTO TABLE tblcxq902 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ");
#980509 Instrução Load Data Infile
Posted by osvaldo luso on 17/09/2009, 20:46 in PHP
Olá,
Primeiramente, seja bem-vindo à nossa comunidade. É um prazer tê-lo aqui.
Bem, antes de usar essa instrução do MySQL você terá que inevitavelmente separar estes dados do arquivo. Teria como dizer exatamente todas as separações que deseja? Até o momento temos isso:Dá para criar um script PHP bem prático e pequeno capaz de efetuar essa edição, podendo assim usar este recurso do MySQL que realmente é muito mais ágil do que executar quase 50.000 consultas.(001)(0025)(000251)618501110002543900100025027000765700850589000000000001580000
[]’s
Paulo,
É muito agradável participar de uma comunidade a qual possui pessoas tão prontas a ajudar. Segue abaixo um exemplo
de uma linha com as devidos campos separados. Todavia observe que não necessito de todas as informações da linha (
são os que estão fora dos parênteses).
01(001)(0025)(000251)(61850111)0(0025)(4390010)(0025)0(27000765700850589)0(00000000001580000)
#980524 Instrução Load Data Infile
Posted by osvaldo luso on 17/09/2009, 22:40 in PHP
Bom, pode-se usar a função substr() para pegar grupos de caracteres.
Até mais
Dudu
Obrigado pela ajuda, mas com substr() o processamento fica muito lento, pois a cada iteração deverá ser feito um
update no BD.
#980743 Instrução Load Data Infile
Posted by osvaldo luso on 18/09/2009, 22:25 in PHP
Sinta-se em casa.Paulo,
É muito agradável participar de uma comunidade a qual possui pessoas tão prontas a ajudar. Segue abaixo um exemplo
de uma linha com as devidos campos separados. Todavia observe que não necessito de todas as informações da linha (
são os que estão fora dos parênteses).
01(001)(0025)(000251)(61850111)0(0025)(4390010)(0025)0(27000765700850589)0(00000000001580000)
Bem, com campos opcionais o código que eu havia em mente muda um pouco. A idéia é a seguinte: você informa o arquivo de texto e a função cria um arquivo de dados delimitados (CSV), fazendo com que este sim seja importado pelo MySQL.
Essa conversão seria algo assim:<?php $csv = fopen('cxq9021509.csv', 'w'); // arquivo com os dados limitados que iremos criar foreach (file('cxq9021509.txt') as $entry) { // aqui percorremos o arquivo de texto que já existe fputcsv( $csv, preg_split( '{\d{2}(\d{3})(\d{4})(\d{6})(\d{8})\d(\d{4})(\d{7})(\d{4})\d(\d{17})\d(\d{17})}', trim($entry), 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ) ); } fclose($csv); ?>Peguei essa linha sua de 75 caracteres e a multipliquei 50 mil vezes, resultando num arquivo de texto de 3,6 MB. Então rodei este código, que foi executado em 2 segundos, gerando um arquivo CSV de 3,8 MB. Isto é, a transformação necessária do arquivo levou 2 segundos. Agora ele já pode o comandoLOAD LOCAL DATA INFILE
do MySQL exatamente como você estava fazendo, apenas trocando a extensão .txt por .csv.
Isso resolve seu problema?
[]’s
Prezado Paulo,
Seu código realmente é muito eficiente, pois consegui separar os campos do meu .txt de forma muito veloz. Todavia
gostaria de esclarecer algumas dúvidas:
- A primeira linha e a última linha não possuem o mesmo comprimento das demais e a informação que me interessa
na primeira linha é da posição 6 até a posição 13 e da última linha, nenhuma informação. Tem como adaptar seu
código para corrigir este problema?
- A tabela tem tblcxq902 tem que possuir a mesma quantidade de campos que o arquivo?
Sou iniciante e tenho certeza que vcs irão me ajuda muito.
Abraço e muito grato pela ateñção.
#980760 Instrução Load Data Infile
Posted by osvaldo luso on 19/09/2009, 01:19 in PHP
Que bom que tenha servido!Prezado Paulo,
Seu código realmente é muito eficiente, pois consegui separar os campos do meu .txt de forma muito veloz. Todavia
gostaria de esclarecer algumas dúvidas:
- A primeira linha e a última linha não possuem o mesmo comprimento das demais e a informação que me interessa
na primeira linha é da posição 6 até a posição 13 e da última linha, nenhuma informação. Tem como adaptar seu
código para corrigir este problema?
- A tabela tem tblcxq902 tem que possuir a mesma quantidade de campos que o arquivo?
Sou iniciante e tenho certeza que vcs irão me ajuda muito.
Abraço e muito grato pela ateñção.
Dá pra adaptar o código sim. Bem, a última linha podemos apenas ignorar. Como será o formato da primeira?
Quanto a tabela dever possuir a mesma quantidade dos arquivos, não necessariamente. Você pode ter mais campos na tabela. Neste caso, você especifica os campos onde irá inserir os dados (estes sim deverão ter a mesma quantidade de campos do arquivo CSV).
[]’s
Paulo,
Aí está o formato da primeira linha:
017082009091619080000000000CXQ90200000
Só preciso da posição 6 a 13 (data) e da 28 a 33 (nome interno do arquivo). A última linha não me interessa.
Dúvidas:
-Mesmo tendo especificado o caminho para criar o .csv conforme abaixo, o mesmo foi criado em "Meus documentos" com os delimitadores. No caminho especificado foi criada uma planilha com os dados separados em celulas diferentes. Como
faço para que o arquivo com os delimitadores seja criado na pasta desejada?
$csv = fopen('c:/CST/cxq9021509.csv', 'w');
-Como faço para especificar os nomes dos campos da tabela no LOAD DATA INFILE?
Grato.
#981090 Instrução Load Data Infile
Posted by osvaldo luso on 22/09/2009, 00:37 in PHP
Vamos lá, por partes:Paulo,
Aí está o formato da primeira linha:
017082009091619080000000000CXQ90200000
Só preciso da posição 6 a 13 (data) e da 28 a 33 (nome interno do arquivo). A última linha não me interessa.
Dúvidas:
-Mesmo tendo especificado o caminho para criar o .csv conforme abaixo, o mesmo foi criado em "Meus documentos" com os delimitadores. No caminho especificado foi criada uma planilha com os dados separados em celulas diferentes. Como
faço para que o arquivo com os delimitadores seja criado na pasta desejada?
$csv = fopen('c:/CST/cxq9021509.csv', 'w');
-Como faço para especificar os nomes dos campos da tabela no LOAD DATA INFILE?
Grato.
Como a primeira linha você só precisa de duas informações, elas não entrarão no arquivo com delimitadores, certo? Errado? Presumo que você irá usar estas informações em outro lugar, certo? Errado? Estou assumindo minha suposição:<?php $csv = fopen('cxq9021509.csv', 'w'); $txt = file('cxq9021509.txt'); array_pop($txt); // apaga a última linha (: foreach ($txt as $line => $entry) { if ($line == 0) { // guarda a data em $date e o nome interno do arquivo em $filename se for a primeira linha list($date, $filename) = preg_split( '{\d{5}(\d{8})\d{14}(\w{6})\d{5}}', trim($entry), 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); } else { fputcsv($csv, preg_split( '{\d{2}(\d{3})(\d{4})(\d{6})(\d{8})\d(\d{4})(\d{7})(\d{4})\d(\d{17})\d(\d{17})}', trim($entry), 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE )); } } fclose($csv); ?>
Veja que guardei as duas informações da primeira linha em variáveis.
Quanto ao caminho para criar o CSV, tente assim:$csv = fopen('C:\\CST\\cxq9021509.csv', 'w'); // no Windows as barras são invertidas; no PHP elas precisam ser escapadas
Quanto a especificar os nomes dos campos da tabela no comandoLOAD DATA
, seria logo após do nome da tabela, entre parênteses, assim:LOAD LOCAL DATA INFILE 'C:/CST/cxq9021509.txt' INTO TABLE tblcxq902 (col1, col2, col3, col4, col5, col6, col7, col8, col9) FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
Segue a documentação oficial doLOAD DATA
: http://dev.mysql.com.../load-data.html
[]’s
Paulo,
Acho que fiz conforme sua orientação, porém o programa nao grava na tabela e não retorna nenhum erro, veja:
Linha do arquivo cxq9021509.csv:
1;32;2891;12856;1;32;1300314013;850517;249300;1908;20090818;32;10007;20090917
Trecho de código que chama a função sql, para gravação no BD somente dos campos Banco, Agencia e Conta:
$rsCheques = $mySQL->sql("LOAD LOCAL DATA INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 (Banco, Agencia, Conta)FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'");
Obs: O primeiro campo da tabela é o ID do tipo autoincremento.
#981269 Instrução Load Data Infile
Posted by osvaldo luso on 24/09/2009, 21:49 in PHP
Opa,Paulo,
Acho que fiz conforme sua orientação, porém o programa nao grava na tabela e não retorna nenhum erro, veja:
Linha do arquivo cxq9021509.csv:
1;32;2891;12856;1;32;1300314013;850517;249300;1908;20090818;32;10007;20090917
Trecho de código que chama a função sql, para gravação no BD somente dos campos Banco, Agencia e Conta:
$rsCheques = $mySQL->sql("LOAD LOCAL DATA INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 (Banco, Agencia, Conta)FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'");
Obs: O primeiro campo da tabela é o ID do tipo autoincremento.
Estou certo de que tenha seguido minha orientação. Porém, perdão, eu errei!
Segue nossa consulta SQL:LOAD LOCAL DATA INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 (Banco, Agencia, Conta)FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'Eu não havia reparado antes, mas oLOCAL
deve vir após oLOAD DATA
, sendo portantoLOAD DATA LOCAL
. Outro problema é o ponto-vírgula no lugar da vírgula emFIELDS TERMINATED BY
. Eu já tinha "arrumado" mas acho que tu não percebeu.
Outra coisa: eu errei ao te dizer que o nome dos campos viriam após o nome da tabela. Eles ficam no final, após toda "configuração" do comando. Portanto, nossa consulta fica:LOAD DATA LOCAL INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (Banco, Agencia, Conta)Isto funciona.
Outra coisa interessante que notei, que vale o comentário, é que se você quiser ignorar alguma coluna do arquivo CSV no momento da inserção, basta especificar as colunas com arroba. Exemplo: quero apenas a agência e a conta. Ficaria assim:LOAD DATA LOCAL INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (@Banco, Agencia, Conta)E por aí vai...
[]’s
Paulo,
É perfeito! Converti o arquivo e realizei a importação em 3 segundos. Mas a minha tarefa está só começando. Espero
contar com você em novos desafios.
Muiiiito Obrigado e que Deus te ilumine.
Opa,Paulo,
Acho que fiz conforme sua orientação, porém o programa nao grava na tabela e não retorna nenhum erro, veja:
Linha do arquivo cxq9021509.csv:
1;32;2891;12856;1;32;1300314013;850517;249300;1908;20090818;32;10007;20090917
Trecho de código que chama a função sql, para gravação no BD somente dos campos Banco, Agencia e Conta:
$rsCheques = $mySQL->sql("LOAD LOCAL DATA INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 (Banco, Agencia, Conta)FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'");
Obs: O primeiro campo da tabela é o ID do tipo autoincremento.
Estou certo de que tenha seguido minha orientação. Porém, perdão, eu errei!
Segue nossa consulta SQL:LOAD LOCAL DATA INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 (Banco, Agencia, Conta)FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'Eu não havia reparado antes, mas oLOCAL
deve vir após oLOAD DATA
, sendo portantoLOAD DATA LOCAL
. Outro problema é o ponto-vírgula no lugar da vírgula emFIELDS TERMINATED BY
. Eu já tinha "arrumado" mas acho que tu não percebeu.
Outra coisa: eu errei ao te dizer que o nome dos campos viriam após o nome da tabela. Eles ficam no final, após toda "configuração" do comando. Portanto, nossa consulta fica:LOAD DATA LOCAL INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (Banco, Agencia, Conta)Isto funciona.
Outra coisa interessante que notei, que vale o comentário, é que se você quiser ignorar alguma coluna do arquivo CSV no momento da inserção, basta especificar as colunas com arroba. Exemplo: quero apenas a agência e a conta. Ficaria assim:LOAD DATA LOCAL INFILE 'c:\CST\cxq9021509.csv' INTO TABLE tblcxq902 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (@Banco, Agencia, Conta)E por aí vai...
[]’s
Paulo,
É perfeito! Converti o arquivo e realizei a importação em 3 segundos. Mas a minha tarefa está só começando. Espero
contar com você em novos desafios.
Muiiiito Obrigado e que Deus te ilumine.
Paulo,
Nas linhas do arquivo texto existem duas informações de datas em posições diferentes. Preciso
capturar essas datas, formatá-las para o formato brasileiro (dd/mm/aaa) para gravar no BD
juntamente com as outras informações. Gostaria que no momento de geração do arquivo csv
essa transformação para o formato brasileiro já fosse feita. É possivel?? São as posições "(\d{8})"
do código abaixo.
Outra coisa, as informações apóso último"(\d{8})" eu gostaria que não entrassem na geração do csv, pois
existe uma quebra de linha neste ponto que esta provocando a entrada de "sujeira"no arquivo csv.
grato.
fputcsv($csv,preg_split( '{(\d{1})\d(\d{4})\d(\d{4})\d(\d{9})(\d{3})\d(\d{4})\d(\d{10})\d(\d{6})(\d{17})\d(\d{4})(\d{8})\d{20}(\d{7})\d{16}(\d{8})}', trim($entry), 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ));
#981671 Instrução Load Data Infile
Posted by osvaldo luso on 25/09/2009, 01:17 in PHP
Olá Osvaldo, esta operação não é aconselhável. Principalmente se você for realizar busca entre datas na tabela usando tal campo.
Vou tratar as datas dentro do BD. Mas como faço para NÃO inserir as informações localizadas após o último
"(/d{8})" no arquivo csv. Tem quebra de linha no arquivo texto, neste ponto e essas informações
são inseridas não me interessam.
#981800 Instrução Load Data Infile
Posted by osvaldo luso on 25/09/2009, 20:14 in PHP
Olá,Paulo,
Nas linhas do arquivo texto existem duas informações de datas em posições diferentes. Preciso
capturar essas datas, formatá-las para o formato brasileiro (dd/mm/aaa) para gravar no BD
juntamente com as outras informações. Gostaria que no momento de geração do arquivo csv
essa transformação para o formato brasileiro já fosse feita. É possivel?? São as posições "(\d{8})"
do código abaixo.
Bem, a dica do Felipe procede. O mais adequado seria você gravar as datas num campoDATE
, que usa este mesmo formato padrãoYYYYMMDD
(ano/mês/dia). Assim você poderá efetuar consultas baseadas em intervalos, além de poder usar todas funções de data e tempo do MySQL. Se você precisar da data no formato brasileiro na exibição, basta formatá-la com a funçãoDATE_FORMAT()
. Se precisar de ajuda no uso de sua sintaxe, é só dizer!
Está convencido?Outra coisa, as informações apóso último"(\d{8})" eu gostaria que não entrassem na geração do csv, pois
existe uma quebra de linha neste ponto que esta provocando a entrada de "sujeira"no arquivo csv.Eita! São só quebras de linha que vêm após a última data? No código já estamos usando a funçãoMas como faço para NÃO inserir as informações localizadas após o último
"(/d{8})" no arquivo csv. Tem quebra de linha no arquivo texto, neste ponto e essas informações são inseridas não me interessam.trim()
, que deveria estar servindo justamente para isso.
Ao menos no teste local que eu fiz estava tudo Ok. Me confirme quais caracteres aparecem após a última data.
[]’s
Pessoal
O que estou tentando fazer é pegar as posiçoes "(/d{8})" que são textos (20090815) e formatá-las para "2009/08/15" no momento de gerar o arquivo csv. Quando eu realizar a importação do arquivo csv para o BD as informações referentes as esses campos no arquivo seriam gravadas no banco nas coluna "Data_liquidacao" e " Data_Processamento" respectivamente, que são do tipo Date. Deste forma acretido que eu não precisaria realizar a formatação depois
de gravada no BD.
#982093 Instrução Load Data Infile
Posted by osvaldo luso on 28/09/2009, 22:19 in PHP
Opa,Pessoal
O que estou tentando fazer é pegar as posiçoes "(/d{8})" que são textos (20090815) e formatá-las para "2009/08/15" no momento de gerar o arquivo csv. Quando eu realizar a importação do arquivo csv para o BD as informações referentes as esses campos no arquivo seriam gravadas no banco nas coluna "Data_liquidacao" e " Data_Processamento" respectivamente, que são do tipo Date. Deste forma acretido que eu não precisaria realizar a formatação depois
de gravada no BD.
Sim, mas veja bem: o formato do campoDATE
éYYYY-MM-DD
. Você pode inserir comoYYYY/MM/DD
sem problemas. Mas ao receber os dados você receberáYYYY-MM-DD
. A formatação vem na própria consulta mesmo, em todo caso. No caso do CSV, os dados estão no formatoYYYYMMDD
, sem os traços. Mas para o MySQL, que só "enxerga" os dígitos, não há nenhum problema. Veja como é fácil fazer isso na própria consulta:SELECT DATE_FORMAT('%d/%m/%Y', Data_Liquidacao) AS Data_Liquidacao FROM `tblcxq902`;Neste caso, se você tiver2009-08-15
no banco de dados, a data será apresentada como15/08/2009
no PHP.
[]’s
Valeu Paulo!
Funcionou perfeitamente.
Obrigado
#982094 Mysql - Indice De Multiplas Colunas
Posted by osvaldo luso on 28/09/2009, 22:32 in PHP
Tenho uma tabela que possui um indice composto por quatro colunas:
Banco - Agencia - Nr_Cheque - Valor. O programa deve comparar a tabela "A" que possui milhares de
linhas com a tabela "B" (a possui o indice de multiplas colunas e milhares de linhas também). O que eu preciso
é que o programa receba as informações de um cheque da table "A" e o localize
na table "B" utilizando o indice. Ah o índice chama-se "Procura". Como fazer isto??
#982095 Indice De Multiplas Colunas
Posted by osvaldo luso on 28/09/2009, 22:39 in MySQL
No Mysqk consigo localizar um registro em uma table que possui indice composto por várias colunas?
ex:
Tenho um índice na table "B" que se chama "Procura" e este indice é composto pelos campos
Banco - Agencia - Nr_Cheque e Valor. Preciso que o programa leia a tabela "A" e localize o
a informação na table "B" através do índice citado. Como fazer?? Ah, as tables possui milhares
de registros.
#982221 Indice De Multiplas Colunas
Posted by osvaldo luso on 29/09/2009, 19:34 in MySQL
Basta você usar na query os campos que compõe o índice, lembrando que você precisa ter no mínimo o campo mais a esquerda do índice composto para que ele possa ser usado.
Na realidade, no momento em que o registro for encontrado na tabela "B" este deverá ser editado e seu campo chamado
"Tipo" receberá "4". Ou seja, o programa deve percorrer a tabela "A", ler seus registro um a um, comparar com cada
registro da tabela "B" através do índice "Procura" e se localizar deverá editá-lo na "B", inserindo "4" no campo "Tipo".
Alguem poderia me enviar um modelo desse script?? Grato.
#982242 Indice De Multiplas Colunas
Posted by osvaldo luso on 29/09/2009, 21:43 in MySQL
Ops, desconsidere minha resposta anterior. Eu estava pensando em outra coisa.
Enfim, então você quer atualizar os registros da tabela B onde exista na tabela A, checando isso por: banco + agencia + nr_cheque e valor.
Então ficaria, por exemplo:update b, a set b.tipo = 4 where (b.banco, b.agencia, b.nr_cheque, b.valor) = (a.banco, a.agencia, a.nr_cheque, a.valor);
Consegui localizar e atualizar conforme abaixo. A sintaxe para utilização de índice composto está correta????:
$rsCheques = $mySQL->sql("UPDATE B USE INDEX (Procura30) SET Tipo = 4 WHERE Banco = 1 AND Agencia = 32 AND Numero = 850518 AND Valor = 2493.00;");
Então gostaria de saber como faço para receber os dados da tabela "A" através de um loop e atualizar os dados em "B" de
forma que quando terminar de percorrer a tabela "A" todos os dados localizados em "B" estarão atualizados.
#982267 Indice De Multiplas Colunas
Posted by osvaldo luso on 30/09/2009, 01:49 in MySQL
Seus updates estão muito lentos? A documentação do MySQL diz que você pode usar esses hints de índices, porém eles não serão usados em comandos UPDATE.
A instrução que lhe passei anteriormente já faz o "loop" de cada linha da tabela b e tenta encontrar os dados que batam na tabela a, se encontrar ele altera o tipo.
Com seu exemplo o tempo browser utrapassou 60 segundos e programa parou. Com o código abaixo o processamento
foi realizado em 9 segundos pois a localização utilizando indice é mais rapido, cfe doc Mysql:
$rsCheques = $mySQL->sql("SELECT Banco, Agencia, Numero, Valor FROM A;"); while ($row_rsCheques = mysql_fetch_array($rsCheques)) { $mySQL->sql("UPDATE B USE INDEX (Procura) SET Tipo = 4 WHERE Banco = $row_rsCheques[0] AND Agencia = $row_rsCheques[1] AND Numero = $row_rsCheques[2] AND Valor = $row_rsCheques[3] LIMIT(1);"); }
Desculpe mas gostaria de saber se tem forma ainda mais rápida pois as minhas tabela possuem mais de 60.000 linhas.
e o teste foi realizado com tabela de 30.000 linhas.
#982396 Indice De Multiplas Colunas
Posted by osvaldo luso on 01/10/2009, 00:09 in MySQL
Tudo bem, eu sei que o uso de índice otimiza as consultas. Eu só quis dizer que o USE INDEX é inútil em UPDATE (a doc. diz que aceita a sintaxe, mas não tem significado no UPDATE). O que lhe ajudou foi o SELECT para direcionar as possíveis linhas.
O que você pode fazer é melhorar o SELECT, pegando somente os registros que existem em A e B, e que o tipo não seja 4 para fazer o UPDATE.SELECT B.Banco, B.Agencia, B.Numero, B.Valor FROM B FORCE INDEX (Procura) STRAIGHT_JOIN A ON A.Banco = B.Banco AND A.Agencia = B.Agencia AND A.Numero = B.Numero AND A.Valor = B.Valor WHERE B.Tipo <> 4
E claro, se a tabela B é a que tem menos registros, é melhor utilizá-la para fazer a busca. Além do mais, como você está fazendo o UPDATE na B, é melhor guiar-se pela existência de registro nela, não na tabela A. Onde possivelmente está fazendo rodar vários UPDATE que não encontram linha alguma. (Não sei como estão os dados em ambas) Sem falar que você está apenas alterando para um valor fixo. Sem obter qualquer correspondente na outra tabela.
Gostei da sua sujestão. Vou implementá-la.
Muito obrigado!
#984706 Dúvidas Com Session
Posted by osvaldo luso on 27/10/2009, 23:59 in PHP
Tenho o form abaixo que chama o arquivo logar.php através do POST para
que o logar.php crie a sessão após validar os dados:
[codebox]<form name="form2" method="post" action="logar.php">
<div class="conteudo">
<h4> Bem vindo ao CST </h4>
<hr/>
</div class="login">
<div>
<table class="usuarios" cellspacing="12">
<tr>
<td>
Login :
</td>
<td>
<input type="text" maxlength="8" name="login" id="campo1"size="12" />
</td>
</tr>
<tr>
<td>
Senha :
</td>
<td>
<input type="password" maxlength="8" name="senha" id="campo2"size="14" />
<input type="submit" name="enviar_login" value="Entrar" onclick="return verifica()"/>
</td>
</tr>
</table>
</div>
</form>[/codebox]
Abaixo o arquivo logar.php que valida os dados do usuário e tenta criar a sessao:
[codebox]include "/inc/Conexao.php";
//cria a conexao com o banco
$mySQL = new Conexao_Mysql;
$login = $_POST['login'];
$senha = $_POST['senha'];
$sql_logar = "SELECT * FROM tblusuarios WHERE Login = '$login' && Senha = '$senha'";
$exe_logar = mysql_query($sql_logar) or die (mysql_error());
//$fet_logar = mysql_fetch_assoc($exe_logar);
$num_logar = mysql_num_rows($exe_logar);
if ($num_logar == 0)
{
echo "Login ou senha inválido.";
echo "<br> <a href='java script:window.history.go(-1)'> Clique aqui para voltar.</a>";
}
else
{
session_start();
$_SESSI0N['login'] = $login;
$_SESSI0N['senha'] = $senha;
header("Location:index.php");
}[/codebox]
A sessão não está sendo criada e não consigo descobrir onde está o erro. Por favor me ajudem.
Grato.
#990153 Chamar Pagina Dentro De Div
Posted by osvaldo luso on 16/12/2009, 16:04 in Ajax
Estou tentando chamar uma página para dentro de uma DIV com ID =conteudo, contida na pagina index e só esta funcionando no IE-8/Mosila/Safari, mas não funciona em IEs mais antigos. Meu objetivo é carregar
as outras páginas dentro da pagina principal para evitar reload. Veja os codigos:
MENU:
[/html]<div class="menu_horizontal">
<ul>
<li><a href="#" onclick="abrirPag('index.php');">Página Inicial</a></li>
<li><a href="#" onclick="abrirPag('Fale_conosco.php');">Fale Conosco</a></li>
<li><a href="#" onclick="abrirPag('Programas.php');">Programas</a></li>
<li><a href="#" onclick="abrirPag('Quem_somos.php');">Quem Somos</a></li>
<li><a href="#" onclick="abrirPag('Historia.php');">História</a></li>
<li><a href="#" onclick="abrirPag('Equipe.php');">Equipe</a></li>
<li><a href="#" onclick="abrirPag('Links.php');">Links</a></li>
<li><a href="#" onclick="abrirPag('Locutores.php');">Locutores</a></li>
<li><a href="#" onclick="abrirPag('Ouvinte.php');">Ouvinte</a></li>
</ul>
</div>
Funcões JS:
function abrirPag(valor){ var url = valor; xmlRequest.onreadystatechange = mudancaEstado; xmlRequest.open("GET",url,true); xmlRequest.send(null); if (xmlRequest.readyState == 1) { document.getElementById("conteudo").innerHTML = "<img src='loader.gif'>"; } return url; } function mudancaEstado(){ if (xmlRequest.readyState == 4){ document.getElementById("conteudo").innerHTML = xmlRequest.responseText; } }
Ajax:
function GetXMLHttp() { var xmlHttp; try { xmlHttp = new XMLHttpRequest(); } catch(ee) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHttp"); } catch(e) { try { xmlHttp = xmlhttp=new ActiveXObject("MSXML2.XMLHttp"); } catch(e) { alert("Seu browser não suporta AJAX!"); xmlHttp = false; } } } return xmlHttp; } var xmlRequest = GetXMLHttp();
Já estou à duas semanas fazendo pesquisando e efetuando testes mas até agora não consegui descobrir o problema.
Não funciona em IEs < 8. Me ajudem por favor
#990325 Chamar Pagina Dentro De Div
Posted by osvaldo luso on 18/12/2009, 11:12 in Ajax
#990738 Chamar Pagina Dentro De Div
Posted by osvaldo luso on 23/12/2009, 21:59 in Ajax
Infelizmente ainda só funciona o IE 8 ,Mosila etc. Não funciona em IE < 8.
Consegui a solução. Basta inverter o parte do código.
Código original:
xmlRequest.onreadystatechange = mudancaEstado; xmlRequest.open("GET",url,true); xmlRequest.send(null);Código invertido:
xmlRequest.open("GET",url,true); xmlRequest.onreadystatechange = mudancaEstado; xmlRequest.send(null);
Ah, A fonte é :Clique aqui[code=auto:0][/code]
Infelizmente ainda só funciona o IE 8 ,Mosila etc. Não funciona em IE < 8.
Consegui a solução. Basta inverter o parte do código.
Código original:xmlRequest.onreadystatechange = mudancaEstado; xmlRequest.open("GET",url,true); xmlRequest.send(null);Código invertido:xmlRequest.open("GET",url,true); xmlRequest.onreadystatechange = mudancaEstado; xmlRequest.send(null);
- Fórum WMO
- → osvaldo luso's Content
- Privacy Policy
- Regras ·