Tämä on nyt taas tällainen yksinkertainen (?) kysymys, eli miten poistaa viesti foorumisoftan taulusta niin, että viestien id:t ei sekaannu?
Taulut on siis näin:
1. bluebb_messages (id,poster,msg_topic_id)
2. bluebb_topics (id,subject)
Bluebb_messageissa siis nuo id:t on topikin viestien määrän mukaan, eli esimerkki;
[ bluebb_topics: id = 1 subject = "Testi" ______________ id = 2 subject = "Testi2" : ] __________________________________________________ [ bluebb_messages: id = 1 poster = "lol" msg = "Testi" topic_id = 1 ___________________ id = 2 poster = "lol2" msg = "Testi2" topic_id = 1 ___________________ id = 1 poster = "lolled" msg = "Aihe 2" topic_id = 2 ___________________ : ]
Ymmärsitte varmaan periaatteen? Eli siis jos tuolta välistä otetaan yksi pois, id:t pitäisi järjestää uudelleen. Miten tuo pitäisi käytännössä toteuttaa? (siis id:eiden uudelleenjärjestys). Jotain tällaista olen yrittänyt tehdä: (mutta ei toimi, miettii kauan ja valittaa "Max execution time bla is bla")
<?php $topic = $_GET["topic"]; // Topicin id $id = $_GET["id"]; // Viestin id topikissa mysql_query("DELETE FROM bluebb_messages WHERE topic_id='$topic' AND id='$id'"); $ids_exist = array(); $ids = array(); $sql = mysql_query("SELECT id, topic_id FROM bluebb_messages WHERE topic_id='$topic'"); $result = mysql_num_rows($sql); $while_id = 0; while($result2 = mysql_fetch_array($sql)) { $ids_exist[$while_id] = $result2["id"]; $while_id = $while_id + 1; } for($i = 0; $i < $result; $i++) { $ids[$i] = $i; } if(count($ids_exist) == count($ids)) { for($i = 0; $i < $ids_exist; $i++) { mysql_query("UPDATE bluebb_messages SET id='$ids[$i]' WHERE id='$ids_exist[$i]' AND topic_id='$topic'"); } } ?>
Ideoita?
Miksi ID:t pitäisi uudelleenjärjestää?
ID:n on kuitenkin tarkoitus olla viestin yksilöllinen tunniste ja yleensä on myös suotavaa, että tämä tunniste ei koskaan muutu (jotta esimerkiksi linkitykset tai viittaukset viesteiin eivät hajoaisi ja lisäksi tämä vähentää huomattavasti virheiden riskiä).
Sami kirjoitti:
Miksi ID:t pitäisi uudelleenjärjestää?
ID:n on kuitenkin tarkoitus olla viestin yksilöllinen tunniste ja yleensä on myös suotavaa, että tämä tunniste ei koskaan muutu (jotta esimerkiksi linkitykset tai viittaukset viesteiin eivät hajoaisi ja lisäksi tämä vähentää huomattavasti virheiden riskiä).
Ihan selkeyden kannalta. Mutta eihän noita kuitenkaan periaatteessa tarvitse järjestää, olisi vain selkeämpi.
Käytithän tauluja luodessa AUTO_INCREMENT niin ei tarvitse omilla virityksillä välittää tuosta id:stä.
Kuvittele vaikka tilanne, jossa käyttäjä A muokkaa viestiä 10 ja käyttäjä B poistaa tällä välin viestin 5. Mitä tapahtuu, kun käyttäjä A yrittää tallentaa muutoksensa?
Jokainen ID kuuluu generoida tietokannan AUTO_INCREMENT-ominaisuudella ja säilyttää sitten muuttumattomana. Muuten järjestelmällä on suuri riski hajota tai ainakin toimia pahasti väärin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.