Autor Tópico: ESTOU DE VOLTA (e com um prob de php/mysql)  (Lida 5426 vezes)

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« em: 22 de Março de 2006, 14:13:52 »
Boas!

Finalmente, após uns belos 6 meses ou mais, voltei :)

Estou dedicado novamente ao web developing, mais precisamente a php e mysql (ainda não continuo muito fã de flash lol).

Neste momento estou com o seguinte problema:

Com php e mysql, faço delete a uma row, mas o campo que tenho em auto_incremented não actualiza, caso faça delete a uma row que não seja a ultima de todas.
Acrescentei uma linha de update, que parece resolver em parte, que é:

mysql_query("UPDATE TABELA SET id=(id-1) WHERE id>$current_row");


O problema é que há id's que estão após os espaços em branco apagados. Alguma ideia para um script que faça check aos campos que não tenham id sequencial ao anterior?

Espero ter-me feito entender :)

Obrigado e um abraço

ps: ainda não me esqueci do tutorial que prometi fazer, de como usar dreamweaver e fireworks para fazer um site, usando cortes (slices), para os users mais novos :)

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #1 em: 22 de Março de 2006, 14:32:53 »
Welcome back! 6 meses no Tibete lol??

Essa dúvida é mesmo interessante. Eu tmb apago cenas na BD que não são as últimas e queria que a BD não "esquecesse" os ids apagados e que na próxima vez que fosse criado um novo id usasse um id apagado anteriormente.

Penso que isso que queres, não é?

Vou pesquisar isso e já venho cá com a resposta.

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #2 em: 22 de Março de 2006, 14:37:53 »
Citação de: "gimbras"
Welcome back! 6 meses no Tibete lol??

Essa dúvida é mesmo interessante. Eu tmb apago cenas na BD que não são as últimas e queria que a BD não "esquecesse" os ids apagados e que na próxima vez que fosse criado um novo id usasse um id apagado anteriormente.

Penso que isso que queres, não é?

Vou pesquisar isso e já venho cá com a resposta.


Exactamente :)

Estava a pensar em usar um foreach para detectar os vazios, através da array criada com a variável numa query de select ($query = mysql_query("SELECT * bla bla bla") , mas isso dá um belo trabalho, e este é um processo que muito mais pessoas devem pretender, por isso calculo que exista algo mais prático.

Se souberes de algo diz, ou alguma outra pessoa no forum :)

Obrigado

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #3 em: 22 de Março de 2006, 18:56:48 »
Perguntei noutro fórum e responderam que se queres isso não podes usar o autoincrement.

E perguntam por que razão queres que os IDs sejam numericamente sequenciais?

E para expôr o problema a um nivel mais genérico, pode ser que se arranje outra solução que nao te estejas a lembrar.

Responde aí.

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #4 em: 22 de Março de 2006, 23:05:49 »
É assim, preciso para um backoffice dum site duma banda, em que eles acrescentam noticias, modificam, eliminam, etc... ao eliminar queria que actualizasse a lista, para poder mostrar melhor as ultimas noticias... ja ta quase tudo a funcionar, excepto esse detalhe...

Offline LuisFilipe

  • Aprendiz
  • **
  • Mensagens: 88
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #5 em: 22 de Março de 2006, 23:29:58 »
Off Topic: Grande logo. Foste tu que desenhaste ?

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #6 em: 22 de Março de 2006, 23:57:35 »
Citação de: "LuisFilipe"
Off Topic: Grande logo. Foste tu que desenhaste ?


Infelizmente, na altura, por falta de tempo, acabei por não ser eu a desenhá-lo. Foi um amigo meu. Paguei-lhe o serviço, obviamente :)

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #7 em: 23 de Março de 2006, 13:45:32 »
Será que o melhor a fazer é eu tirar o auto_increment, programar para automaticamente detectar o ultimo id e incrementar na ultima row inserida, e quando eliminar uma row, programar para subtrair em 1 todos os id's acima do id eliminado?

Que achas?

Acabo por fazer um auto_increment manual, se formos a ver...

Offline Grettir

  • Aprendiz
  • **
  • Mensagens: 284
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #8 em: 23 de Março de 2006, 14:10:22 »
Exactamente,

se utilizas o auto_increment, o MySQL vai sempre reconhecer a ultima entrada e incrementa-a.

Logo, é complicado para utilizares os id's que ja foram eliminados.

Faz isso a mão.
----------------------------------
Ricardo Castelhano aka Grettir

Adobe Certified Professional
Interactive Designer
Flash Developer
PHP Developer

http://www.ricardocastelhano.com/
-----------------------------------
Keep on "Flashing..."

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #9 em: 23 de Março de 2006, 19:13:14 »
Só que vais ter um belo trabalhão. Eu tmb já tive essa dúvida e o Grettir respondeu-me o mesmo, o auto-increment existe por alguma coisa. Se não desactiva-se e faz-se à mão.

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #10 em: 24 de Março de 2006, 01:12:12 »
Don´t worry, consegui resolver o meu problema sem ser necessário mexer em nada no auto_increment :D

Assim até é bom que exista auto_increment, tipo pois serve para identificar o numero da noticia e para fazer order by nos select, visto que nao interessa a sequencia numerica, apenas se é maior ou menor ;)

Obrigado a todos pela dica.

Já agora, o que usei para seleccionar os ultimos 5 títulos de noticias, para colocar na home page, foi:

Código: [Seleccione]
//Query para mostrar conteúdos da DB
$resultado = mysql_query( "SELECT titulo FROM news ORDER BY id DESC LIMIT 5" );
$linhas = mysql_num_rows( $resultado );

print "<table border=1>";
while ($count < ($linhas))
{
  $count++;
  $row = mysql_fetch_row($resultado);
foreach ($row as $campo)
    print "<tr><td>$campo</td></tr>";
   
}
print "</table>";
//FIM da Query para mostrar conteúdos na DB


Legenda:
titulo = nome da coluna que pretendo, da tabela
news = nome da tabela
id = variável que faz auto_increment

O resto foram variáveis que usei para o momento :)

Espero ter ajudado alguns que possam pesquisar a info no futuro.

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #11 em: 24 de Março de 2006, 17:00:46 »
Porreiro, estou certo que vai dar jeito.

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #12 em: 24 de Março de 2006, 17:41:43 »
Fui perguntar a outro lado e penso que responderam da mesma forma à qual acabaste por chegar.

Disseram-me que o ID só serve para termos uma referência única, nada mais.

Para se ir buscar as últimas cinco notícias pode-se fazer assim:

Código: [Seleccione]
SELECT * FROM noticias ORDER BY ID desc LIMIT 5;

Também me avisaram que isto pode não ser totalmente eficaz, pois apesar de o ID ser autoincrement não se tem nenhuma restrição que te garanta que o o ID maior corresponde a última notícia.

Se tivessemos um backoffice de edição de notícias existentes e usassemos um DELETE e um INSERT em vez de um update já tinhamos problemas.

É aconselhável ir buscar os 5 ids maiores e não nos preocuparmos com o resto.

Também me deram a dica de como fazer isto como mandam os livros.

1.Cria-se um campo chamado por exemplo DATA_E_HORA do tipo TIMESTAMP.
(Um timestamp é um segundo no tempo e é muito fácil de usar).

2.Quando se fizer um INSERT não definimos o campo DATA_E_HORA, pq o MySQL, se esse campo for nulo, põe lá o valor da data/hora actual.
Sendo assim temos sempre a hora em que a notícia foi inserida.

3. Desta forma o pedido seria:

Código: [Seleccione]
SELECT * FROM noticias ORDER BY DATA_E_HORA desc LIMIT 5;

PS: Isto tudo foi me indicado por outra pessoa, no caso o pedrotuga. Os agradecimentos são para ele.

;)

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #13 em: 24 de Março de 2006, 23:36:34 »
gimbras, é o meu caso. Tenho Backoffice do site, daí haver INSERT's e DELETE's! Mas com o LIMIT 5 resolvi o problema (foi o que usei no bocado de código que já postei aqui anteriormente.

Já tenho um campo de data, mas é colocada manualmente, pois é personalizada ;) Já me tinha ocorrido isso, mas preferi não mostrar dessa forma...

Mas obrigado pelas dicas :)

Offline HolyMurderer

  • Aprendiz
  • **
  • Mensagens: 132
    • Ver Perfil
ESTOU DE VOLTA (e com um prob de php/mysql)
« Responder #14 em: 29 de Março de 2006, 11:32:19 »
Boas!

Tenho outro problema, simples de resolver, calculo. LOL

É que adiciono conteúdo na db, adiciona tudo bem, tenho um backoffice, onde aparece tudo bem, mas no site final, onde faço um select tal como faço no backoffice, os acentos não aparecem, tipo Fábio aparece F?bio, mas no Backoffice que tem a mesma programação, dá bem... será alguma coisa da fonte, do style, ou parecido? Uso CSS para fazer o view final...

A programação usada para fazer select no backoffice é a mesma que faço na página final, daí a minha dúvida.

EDIT: retirei o CSS e retirei também a tag meta que o DW coloca, mas a situação manteve-se :(

 




Roleta das Anedotas - Abre noutra janela