Jump to content


Photo

Interagir Php E Access


  • Faça o login para participar
15 replies to this topic

#1 nannynha

nannynha

    Novato no fórum

  • Usuários
  • 22 posts
  • Sexo:Não informado

Posted 01/06/2007, 11:27

Olá galera.. to com uma dúvida muito grande....
Seguinte:

Tenho um banco de dados em access, e minha aplicação é em php.
Preciso inserir registros em 2 tabelas, porém o que as interligam é o campo ID.
Como posso fazer isso?? Ex.:

$insere = "insert into cadastros (nome, telefone) values ('$nome','$telefone')";
$insere = "insert into cidades (uf, cidade) values ('$uf','$cidade' )";

// o campo id da tabela cadastros é auto numérico..
//o que faz com que os dados seja inseridos para a mesma pessoa é o campo id.
// não posso deixar a mostra pois é o próprio banco quem o cria

Me ajudem...

#2 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 01/06/2007, 12:13

Te ajudamos então ;B

mysql_insert_id()

Dá uma olhadinha nesta função

dúvida, estamos aqui ;D


(y)

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#3 Chinello Cybernético

Chinello Cybernético

    Simplesmente "Chinello"

  • Usuários
  • 1892 posts
  • Sexo:Masculino
  • Localidade:Canoas - RS

Posted 01/06/2007, 13:03

savior, ela tá usando Access, e não MySQL..

Mas nannynha, a mágica é a seguinte..

Se o campo é auto-numérico, significa que sempre q um registro for inserido, ele vai possuir o ID mais alto, entao o q tu precisa fazer, é inserir um dado na tabela, e depois buscar o ID mais alto dela..

tipo assim:

$insere = "insert into cadastros (nome, telefone) values ('$nome','$telefone')";
// executa o código

$sql_id = "SELECT id FROM cadastrados ORDER BY id DESC LIMIT 1"; // nao sei se essa syntaxe eh correta pra usar no access, mas a idéia é buscar apenas 1 registro ordenando descrescentemente pelo ID 

$insere = "insert into cidades (ID, uf, cidade) values ($novo_id, '$uf','$cidade' )"; // $novo_id possui o valor q o $sql_id retorna
Entendeste a lógica? ;)
Diego Sampaio - kroW - PHP Framework > http://chinelloweb.net/
chinello at gmail dot com

System > Athlon 64 3200+ Mobile | Kubuntu 7.04 Fesity Fawn AMD64 | Kernel 2.6.20-16
Coding @ KDE 3.5.7 | PHP 5.2.1 | Apache 2.2.3 | MySQL 5.0.38

#4 bimonti

bimonti

    Super Veterano

  • Usuários
  • 2654 posts
  • Sexo:Masculino

Posted 01/06/2007, 13:18

Eu também não sei até que ponto o Access compreende SQL, mas se estiver disponível pode se fazer uso de LAST_INSERT_ID():

$insere = "insert into cidades (ID, uf, cidade) values (LAST_INSERT_ID(), '$uf','$cidade' )";

Ou pode tentar também o uso de uma sub-query:

$insere = "insert into cidade (id, uf, cidade) values (
			   (select id FROM cadastros ORDER BY id DESC LIMIT 1), '$uf', '$cidade')";

Mas são recursos que eu não faço a menor idéia se funcionam com o access. Só coloquei pra se você quiser testar, assim poupa uma segunda consulta ao banco.
WebFórum - Equipe de Desenvolvimento - Monitor
Posted Image
Yeah I do have some stories, and it's true I want all the glory ...

#5 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 01/06/2007, 13:56

savior, ela tá usando Access, e não MySQL..

Mas nannynha, a mágica é a seguinte..

Se o campo é auto-numérico, significa que sempre q um registro for inserido, ele vai possuir o ID mais alto, entao o q tu precisa fazer, é inserir um dado na tabela, e depois buscar o ID mais alto dela..

tipo assim:

$insere = "insert into cadastros (nome, telefone) values ('$nome','$telefone')";
 // executa o código
 
 $sql_id = "SELECT id FROM cadastrados ORDER BY id DESC LIMIT 1"; // nao sei se essa syntaxe eh correta pra usar no access, mas a idéia é buscar apenas 1 registro ordenando descrescentemente pelo ID 
 
 $insere = "insert into cidades (ID, uf, cidade) values ($novo_id, '$uf','$cidade' )"; // $novo_id possui o valor q o $sql_id retorna
Entendeste a lógica? ;)


Perdão :B

Não li o tópico direito de novo :assobio:

LAST_INSERT_ID() => Parace que o office não compreende.

Geralmente eu usaria assim com access: Lock table, insert, SELECT MAX(ID), release lock.

Pode ver tambem se seu access aceita o operador @@IDENTITY.

Dae depois do insert pode fazer assim

SELECT @@IDENTITY


Agora espero que eu tenha ajudado ;B

desculpa denovo .-.

(y)

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#6 nannynha

nannynha

    Novato no fórum

  • Usuários
  • 22 posts
  • Sexo:Não informado

Posted 04/06/2007, 09:09

Meninos, muito obrgada pela ajuda, de coração....
Chinello Cyberné e Bimonti, agradeço a ajuda de vcs, mais não deu certo essas dicas, se tiverem outras pra me passar...
Savior, essa sua dica até que ajudou, porém a instrução SELECT @@IDENTITY .. Ela retorna o o ID maior entre todas as tabelas... eu queria apenas de uma, pois meu banco possui várias...
Pode me dar uma forcinha maior quanto a isso??


bjs

AH, ALGUÉM SABE ALGUMA COISA SOBRE AS INTRUÇÕES:

RS.EDIT
RS.FIELDS ()
RS.NEW

?????

#7 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 04/06/2007, 09:29

SELECT MAX(id) FROM tabela

Isto não te ajuda? Com esta query você obtem a id máxima de uma tabela específica, ou seja. a ultima id inserida. Não é isto que você almeja?

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#8 nannynha

nannynha

    Novato no fórum

  • Usuários
  • 22 posts
  • Sexo:Não informado

Posted 04/06/2007, 09:44

Ajuda sim.... porém se eu fizer dois cadastros simultaneos, a inserção dará erro.

Existe o comando ADO para PHP??
Ele é muito utilizado no Visual Basic evitando esse tipo de erro...
Eu precisaria utilizar esse ADO ou algo parecido...

Pode me ajudar nessa tbm??

#9 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 04/06/2007, 13:12

Ajuda sim.... porém se eu fizer dois cadastros simultaneos, a inserção dará erro.

Existe o comando ADO para PHP??
Ele é muito utilizado no Visual Basic evitando esse tipo de erro...
Eu precisaria utilizar esse ADO ou algo parecido...

Pode me ajudar nessa tbm??



Temos sim para PHP ;]

Se chama ADODB (LINK).
Ele contem uma coleção de drivers e uma boa documentação.

Vale a pena conferir.


Pode passar exemplo de um insert multiplo que você usa? Só para ver se dá para te dar uma luz?

(y)

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#10 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 04/06/2007, 15:47

Sobre ADODB, acredito que ela esteja procurando a biblioteca COM... :assobio:

www.php.net/com

[]’s :DAté mais

#11 nannynha

nannynha

    Novato no fórum

  • Usuários
  • 22 posts
  • Sexo:Não informado

Posted 05/06/2007, 08:43

Posso sim...

//$consulta = "SELECT id, nome
// FROM cadastro
// WHERE nome = '$nome'";

$insere= "INSERT INTO cadastro
VALUES ($nome)"; // o ID é gerado automaticamente

$insere1 = "INSERT INTO cidades
(cidade, uf, cep)
VALUES ('$cidade', '$uf', $cep)";

$insere2 = "INSERT INTO pais
(uf,pais)
VALUES ('$ufp', '$pais')";

$sql = odbc_exec($con, $insere,$insere1,$insere2);


Agora usando essa função ADODB, como eu poderia fazer essa inserção lembrando que para inserir na tabela cidades e pais preciso que o ID da tabela cadastro seja o mesmo. Poderia me dar um exemplo de como ficaria o código??

#12 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 05/06/2007, 11:33

Posso sim...

//$consulta = "SELECT id, nome
// FROM cadastro
// WHERE nome = '$nome'";

$insere= "INSERT INTO cadastro
VALUES ($nome)"; // o ID é gerado automaticamente

$insere1 = "INSERT INTO cidades
(cidade, uf, cep)
VALUES ('$cidade', '$uf', $cep)";

$insere2 = "INSERT INTO pais
(uf,pais)
VALUES ('$ufp', '$pais')";

$sql = odbc_exec($con, $insere,$insere1,$insere2);


Agora usando essa função ADODB, como eu poderia fazer essa inserção lembrando que para inserir na tabela cidades e pais preciso que o ID da tabela cadastro seja o mesmo. Poderia me dar um exemplo de como ficaria o código??



Você poderia tentar assim:
//Antes de executrar os inserts
 odbc_autocommit($con, FALSE); //Desliga - auto commit
//Fechar tabela para outros processos
 $SQL = "LOCK TABLE  cadastro";
 odbc_exec($con, $SQL);
//Fazer a primeira inserção.
$insere = "INSERT INTO cadastro VALUES (" . $nome .")";
odbc_exec($con, $insere);
//Obter a ultima id gerada pelo insert
$SQL = "SELECT MAX(id) AS ultima_id FROM cadastro";
$rs =  odbc_exec($con, $SQL);
//Pegar a ultima id do MAX(id)
$id = (int)(odbc_result($rs, 'ultima_id'));
if (($id > 0) && (!odbc_error())) {
	//Coloquei um campo ID para você ter uma noção
	$insere1 = "INSERT INTO cidades (cidade, uf, cep, id_cadastro) VALUES ('" . $cidade . "', '" . $uf . "', ." . $cep . "," . $id . ")"; 
	  $insere2 = "INSERT INTO pais (uf,pais, id_cadastro) VALUES ('" . $ufp . "', '" . $pais . "', " . $id . ")";
	  $rs = odbc_exec($con, $insere1,$insere2);
	if (!odbc_error())
		odbc_commit($con); //Gravar alterações no banco
	else
		odbc_rollback($con); //Reverter alterações
}

//Liberar tabela
$SQL = "UNLOCK TABLE TABLE cadastro";
 odbc_exec($con, $SQL);
 odbc_close($con); //Fechar conexao

Eu faria assim com o MSACESS, pois ele tem muitas limitações
Dá uma olhadinha no código, uma testadinha e retorne novamente, se funcionou ou se piorou ainda mais :S

@Paulo Ricardo
Estagiário confundindo coisas denovo ¬¬'
Obrigado pela corrigida (y)



(y)

Edição feita por: savior, 06/06/2007, 09:49.

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#13 nannynha

nannynha

    Novato no fórum

  • Usuários
  • 22 posts
  • Sexo:Não informado

Posted 06/06/2007, 09:44

Olá Savior...

Testei o código e, a instrução de fechar a tabela, o access não aceita. Comentei essa parte e é mostrado o seguinte erro:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][Driver ODBC para Microsoft Access]Uso inválido de ponteiro para nulo , SQL state S1009 in SQLExecDirect in C:\XAMPP\htdocs\DePara\testa_banco.php on line 14

Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][Driver ODBC para Microsoft Access] O campo 'cadastros.de' não pode ser uma seqüência de caracteres de comprimento nulo., SQL state S1000 in SQLExecDirect in C:\XAMPP\htdocs\DePara\testa_banco.php on line 17

Olhei o código, digitei informação para que seja inserida no banco mais o erro continua...
Pode ajudar??

:(

#14 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 06/06/2007, 09:56

Olá Savior...

Testei o código e, a instrução de fechar a tabela, o access não aceita. Comentei essa parte e é mostrado o seguinte erro:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][Driver ODBC para Microsoft Access]Uso inválido de ponteiro para nulo , SQL state S1009 in SQLExecDirect in C:\XAMPP\htdocs\DePara\testa_banco.php on line 14

Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][Driver ODBC para Microsoft Access] O campo 'cadastros.de' não pode ser uma seqüência de caracteres de comprimento nulo., SQL state S1000 in SQLExecDirect in C:\XAMPP\htdocs\DePara\testa_banco.php on line 17

Olhei o código, digitei informação para que seja inserida no banco mais o erro continua...
Pode ajudar??

:(


Poder ajudar posso ;]

Poderia anexar este testa_banco.php e a sua base em access para poder dar uma olhada melhor?


(y)

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#15 nannynha

nannynha

    Novato no fórum

  • Usuários
  • 22 posts
  • Sexo:Não informado

Posted 06/06/2007, 10:21

//testa_banco.php

$con = odbc_connect("access","","") or die("Erro na conexão com o Banco de Dados");

//Antes de executrar os inserts
odbc_autocommit($con, FALSE); //Desliga - auto commit
//Fechar tabela para outros processos
//$SQL = "LOCK TABLE cadastros";
$SQL= "SELECT * FROM cadastros";
odbc_exec($con, $SQL);
//Fazer a primeira inserção.
$insere = "INSERT INTO cadastros (nome, para, email, figura) VALUES ('$nome','$para','$email','$figura')";
odbc_exec($con, $insere);
//Obter a ultima id gerada pelo insert
$SQL = "SELECT MAX(id) AS ultima_id FROM cadastros";
$rs = odbc_exec($con, $SQL);
//Pegar a ultima id do MAX(id)
$id = (int)(odbc_result($rs, 'ultima_id'));
if (($id > 0) && (!odbc_error())) {
//Coloquei um campo ID para você ter uma noção
$insere1 = "INSERT INTO cidades (cidade, uf, cep, id) VALUES ('$cidade', '$uf', $cep ,$id)";
$insere2 = "INSERT INTO pais (uf,pais, id) VALUES ('$uf', '$pais', $id)";
$rs = odbc_exec($con, $insere1, $insere2);
if (!odbc_error())
odbc_commit($con); //Gravar alterações no banco
else
odbc_rollback($con); //Reverter alterações
}

//Liberar tabela
//$SQL = "UNLOCK TABLE TABLE cadastro";

echo $sql;
odbc_exec($con, $SQL);
odbc_close($con); //Fechar conexao


Base dade dados, só posso colocar apenas os nomes ok?

Tabela: Cadastros
Campos: id(autonumérico), nome(text), para_nome(texto), email(texto), figura(texto);

Tabela Cidades
Campos: id(tem que ser o mesmo da tabela cadastros, número), cidade (texto), uf(texto), cep (número);

Tabela Pais
Campos: id(tem que ser o mesmo da tabela cadastros, número), uf(texto), pais(texto);




3 user(s) are reading this topic

0 membro(s), 3 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq