Interagir Php E Access
#1
Posted 01/06/2007, 11:27
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
Posted 01/06/2007, 12:13
#3
Posted 01/06/2007, 13:03
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 retornaEntendeste a lógica?
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
Posted 01/06/2007, 13:18
$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.
Yeah I do have some stories, and it's true I want all the glory ...
#5
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 retornaEntendeste a lógica?
Perdão :B
Não li o tópico direito de novo
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 .-.
#6
Posted 04/06/2007, 09:09
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
?????
#8
Posted 04/06/2007, 09:44
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
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?
#10
Posted 04/06/2007, 15:47
#11
Posted 05/06/2007, 08:43
//$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
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
Edição feita por: savior, 06/06/2007, 09:49.
#13
Posted 06/06/2007, 09:44
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
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?
#15
Posted 06/06/2007, 10:21
$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)