Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lab Design

[RESOLVIDO]SQL Server 2005 X PHP

Recommended Posts

Eu to desenvolvendo um projeto em php porém com acesso ao sql server 2005. O que ocorre é que em algumas tabelas em determinada parte dos scripts eu preciso inserir um registro e já ter em mãos o ID pois o mesmo é fornecido ao usuário como um link para impressão de algo.Em mysql temos o mysql_inserted_id que retorna sem falhas o ultimo ID gravado mas no SQL server n ão temos nenhuma função correspondente.O problema maior é que essa mesma base de dados é acessada por um programa em VB.NET que roda na intranet da empresa e para o programa, a maioria das tabelas está com o ID auto incremento e no caso do mySQL é indiferente pois mesmo tendo esse campo autonumeração podemos colocar ele na query e ele insere sem reclamar, já o SQL server não aceita e portanto ou seu deixo o campo sem autonumeração e faço o insert usando um max(id) antes ou efetuo o insert e pego em seguida o max(id) mas o que garante que esse max(ID) retornado seja o que o script acabou de inserir, considerando que dois usuários poderiam estar fazendo inserção ao mesmo tempo... Claro que é uma chance remota porém não deixa de ser uma chance de ocorrer e neste caso usando o max(id) eu corro o risco de um ID errado no link ou outra opção, fazer um select com um campo que não comporte duplicidade. São opções mas eu gostaria de saber se de repente um insert no banco, o SQL server reportaria o ID do registro numa variavel ou numa função dele mesmo.Eu já pesquisei no php.net e não obtive êxito, achei algumas simulações pra pegar esse ID.

Compartilhar este post


Link para o post
Compartilhar em outros sites

lab designa sua duvida eh referente a sintaxe do sql serverpra obter o ultimo ID inserido veja esse truque "exemplo":

$sql = "INSERT INTO tabela (campo1,campo2,campo3) VALUES ('valor 1', 'valor 2', 'valor 3');";$sql .= "SELECT tabela_id FROM tabela WHERE tabela_id = @@IDENTITY";

excute as duas querys numa so conexao. a primeira query farah o insert e logo em seguida, a segunda query obtem o valor do ID que fica armazenada em @@IDENTITYno sql server 2000 foi implementada a funçao SCOPE_IDENTITY()pesquise por isso tambem, talvez seja utiloutroIDENT_CURRENT('tablename')

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hirom, obrigado pela ajuda mas já foi resolvido dentro do subforum sql server e a solução apresentada la foi fantástica olha só como ficou:$query=mssql_query("insert into agenda(data,titulo,comentario) values('$data', '$titulo','$comentario') select @@Identity as LastID");if (mssql_rows_affected($conn)==0) $id=mssql_result($query, 0, 'LastID');a partir dai a var $id guarda a linha do registro.Agora o que ta pegando aqui é problema de collations:1) ta tabela da locaweb está setado com o collation SQL-Latin1_CPI_850_CI_AS (acho que é isso) e ai acontece o seguinte:eu insiro os dados pelo site os acentos aparecem trocados no manager do sql e portanto aparecem trocados também no programa BV.NET que está sendo usado na intranet mas aparecem corretamente no site.2) Se u insiro os dados pelo programa na intranet, eles aparecem corretamente no manager, porém no site são trocados inclusive por caracteres diferentes daqueles trocados na inclusão pelo site:Na locaweb através do manager do express eu constatei que a base de dados estava setado para o SQL_Latin1_General_CP850_CI_AI, não sei sé é padrão da locaweb já instalar com essa collation. Sei que quando instalei o express veio como default outro padrão que não lembro agora.No meu express eu também deixei com o mesmo collation pra manter a compatibilidade so que mudei a collation depois que as tabelas já estavam preenchidas e seguindo alguns post de outros forums isso pode acarretar problemas, porem seriam somente no express já que para a locaweb eu exportei os dados iniciais pelo access usando odbc. O que ocorre: Se eu insiro um registro através do site, os caracteres acentuados aparecem no programa VB.NET, no manager do express e da locaweb trocados porém vistos corretamente no site. Agora se eu corrijo esses caracteres ou insiro um registro pelo manager ou pelo VB.NET, eles aparecem corretamente no manager, porém no site ficam trocados olha o exemplo abaixo: Registro gravado pelo site: Inscr. Curso: Gerenciamento de Projetos com Aplicação para o Microsoft Project) no visual studio mostra: Inscr. Curso: Gerenciamento de Projetos com AplicaþÒo para o Microsoft Project no site mostra: Inscr. Curso: Gerenciamento de Projetos com Aplicação para o Microsoft Project) ou seja mostra corretamente o 'ça' da forma que foi digitado. Agora, editando o registro tanto pelo programa quanto pelo visual studio: no visual mostra: Inscr. Curso: Gerenciamento de Projetos com Aplicação para o Microsoft Project (Editei o registro corrigindo os acentos) o site mostra: Inscr. Curso: Gerenciamento de Projetos com Aplica‡Æo para o Microsoft Project) Veja como o site mostra o 'Aplica‡Æo ', inclusive diferente do primeiro exemplo 'AplicaþÒo':

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui trocar o collations na base de dados la na locaweb pra Latin_General_CI_AS e tudo que o site grava agora grava corretamente os acentos mas os problemas ainda nao terminaram.por exemplo eu digito no site: á Á é É í Í ó Ó ú Úna base de dados pelo manager aparece: á Á é É í Í ó Ó ú Úagora no site aparece apos a gravação do registro: µ ‚ ¡ Ö ¢ à £ é

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Hiron, eu to num briga de foice com a locaweb porque aqui no meu server ta tudo funcionando corretamente, tanto na base de dados como no site eu vejo tudo acentuado e correto o problema está na versão publicada na locaweb, eles querem tirar da reta como sempre mas como minha conta la é considerável eu vou pra cima deles pra me darem uma solução, afinal o cliente testou o site no meu servidor e viu tudo correto agora como eu explico pra ele que na internet ele não vai poder acentuar nada porque a página volta toda ferrada?A locaweb tem que me dar uma solução ou uma meta tag (ja testei com iso-8859, 1252) e nada funciona. Eles acabaram de fazer um teste no site e pedi pra fazerem tambem no meu servidor pra comparar. olha so o teste dos caras: titulo: PÆo, caf‚ e a‡£car (Teste LocaWeb)descrição: Lembrar de comprar pÆo, caf‚ e a‡£car.na tabela ta Pão, café e açúcarLembrar de comprar Pão, café e açúcarÉ provável que uma diretiva no topo da pagina resolva o problema mas qual?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu to desenvolvendo um projeto em php porém com acesso ao sql server 2005. O que ocorre é que em algumas tabelas em determinada parte dos scripts eu preciso inserir um registro e já ter em mãos o ID pois o mesmo é fornecido ao usuário como um link para impressão de algo.Em mysql temos o mysql_inserted_id que retorna sem falhas o ultimo ID gravado mas no SQL server n ão temos nenhuma função correspondente.O problema maior é que essa mesma base de dados é acessada por um programa em VB.NET que roda na intranet da empresa e para o programa, a maioria das tabelas está com o ID auto incremento e no caso do mySQL é indiferente pois mesmo tendo esse campo autonumeração podemos colocar ele na query e ele insere sem reclamar, já o SQL server não aceita e portanto ou seu deixo o campo sem autonumeração e faço o insert usando um max(id) antes ou efetuo o insert e pego em seguida o max(id) mas o que garante que esse max(ID) retornado seja o que o script acabou de inserir, considerando que dois usuários poderiam estar fazendo inserção ao mesmo tempo... Claro que é uma chance remota porém não deixa de ser uma chance de ocorrer e neste caso usando o max(id) eu corro o risco de um ID errado no link ou outra opção, fazer um select com um campo que não comporte duplicidade. São opções mas eu gostaria de saber se de repente um insert no banco, o SQL server reportaria o ID do registro numa variavel ou numa função dele mesmo.Eu já pesquisei no php.net e não obtive êxito, achei algumas simulações pra pegar esse ID.

Lab Design, acho que essa procedure de ajuda, tive o mesmo caso aqui no trabalho.bom é um exemplo, depois você pode adaptar para seu modo.
ALTER  proc proc_insere_cliente_FB @nome varchar(50),@dt_nascimento datetime,@nacionalidade varchar(50)ASSET nocount ONdeclare @meuid uniqueidentifierSET @meuid = newid()INSERT INTO FB_Clientes (id_cliente, nome, dt_nascimento, nacionalidade, meuid) SELECT coalesce(max(id_cliente) + 1,1),@nome,@dt_nascimento,@nacionalidade,@meuid FROM FB_ClientesSELECT id_cliente FROM FB_Clientes WHERE meuid = @meuid

Compartilhar este post


Link para o post
Compartilhar em outros sites

você deve estar com mesmo problema que o meu TAMBEM sobre fazer consultas com WHERE onde devemos mandar string acentuada....... eu vou postar um exemplo aki breve pra tentarmos resolver....Falow..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alexsandro XPT, finalmente eu consegui resolver.1) Mudei a collation da base pra Latin1_general_CI_AI2) Tive que recriar todas as tabelas que foram exportadas pelo access. Achamos que a m. toda foi feita pelo access, porque depois de inumeras reclamações junto a locaweb, ela simplesmente criou uma tabela nova e inseriu dados e mostrou na tela corremente ou seja o conteúdo correto da base de dados mostrava na tela, ao contrário do que acontecia com as minhas tabelas. Diante disso não tive mais argumentos e foi por a mão na massa pois o fato de alterar a collation simplesmente não tava resolvendo nada.Recriei tudo, algumas tabelas era somente recriar porque serão preenchidas pelos usuários, entao o maior trampo foi com as tabelas que deviam conter dados.Agora ta tudo funfando redondinho.Se voce, igual eu, exportei as tabelas pode estar ai o seu problema.Quanto aos demais que postaram eu agradeço pelas dicas e tentativas de ajuda.Obrigado a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alexsandro XPT, finalmente eu consegui resolver.

1) Mudei a collation da base pra Latin1_general_CI_AI

2) Tive que recriar todas as tabelas que foram exportadas pelo access. Achamos que a m. toda foi feita pelo access, porque depois de inumeras reclamações junto a locaweb, ela simplesmente criou uma tabela nova e inseriu dados e mostrou na tela corremente ou seja o conteúdo correto da base de dados mostrava na tela, ao contrário do que acontecia com as minhas tabelas. Diante disso não tive mais argumentos e foi por a mão na massa pois o fato de alterar a collation simplesmente não tava resolvendo nada.

 

Recriei tudo, algumas tabelas era somente recriar porque serão preenchidas pelos usuários, entao o maior trampo foi com as tabelas que deviam conter dados.

 

Agora ta tudo funfando redondinho.

 

Se voce, igual eu, exportei as tabelas pode estar ai o seu problema.

 

Quanto aos demais que postaram eu agradeço pelas dicas e tentativas de ajuda.

 

Obrigado a todos.

Lab Design,

 

Eu estou com o mesmo problema (http://forum.imasters.com.br/index.php?showtopic=261956&st=0&gopid=931835entry931835) porém mesmo vendo sua solução aqui não resolveu pra mim...

 

Meu problema está na questão do php ou do banco nao entender que um SELECT buscando LIKE '%são%' eu quero que retorne os com são e sao sendo com ou sem acento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.