freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

Πως να φτιάξετε τις τιμές του id ύστερα από διαγραφή πεδίων


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP τα δικά μας scripts
Moderators:  PHP Moderators, Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [8 Μηνύματα]      Bookmarks Tags: τιμέςδιαγραφή Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
WSPNH


Μέλος από: 10 Μαρ 2006
Scripts: 1
Μηνύματα: 97


View users profile Send email to user Visit posters website
ΜήνυμαΣτις: 29 Αυγ 2010 02:40    Θέμα: Πως να φτιάξετε τις τιμές του id ύστερα από διαγραφή πεδίων
Περιγραφή θέματος: Πως να φτιάξετε τις τιμές του πρωτευοντος κλειδιού σε σειρά ύστερα από διαγραφές πεδίων
Απάντηση με παράθεση  Mark this post and the followings unread

Γειά σας, έχω δημιουργήσει μια συνάρτηση η οποία κάνει αυτό που λέει ό τίτλος και η περιγραφή θέματος.

Πόσες φορές διαγράψατε ένα πεδίο π.χ. ένα comment σε εναν πίνακα με id (πρωτεύον κλειδί) έστω 4 και μετά διαπιστώσατε ότι η σειρά των τιμών έχει κοπεί π.χ.

κώδικας:
1
2
3
5
6


Όπως βλέπετε από την παραπάνω σειρά (η οποία υποθέτουμε αντιστοιχεί στο id ύστερα από διαγραφή της γραμμής υπαριθμόν 4) λείπει το 4 (λογικό αφού το διαγράψαμε).
Θέλουμε λοιπόν η σειρά να γίνει έτσι:

κώδικας:
1
2
3
4
5


Πως το κάνουμε; Έτσι:
κώδικας:

function fixPrimaryKeyValuesInOrder($tbl,$field){
$query=mysql_query("SELECT $field FROM $tbl");
   $c=1;
   while ($row = mysql_fetch_array($query)){
      mysql_query("UPDATE $tbl SET $field='$c' WHERE $column='$row[$field]'");
      $c++;
   }
if(getNextAutoIncrement($tbl)) $query=mysql_query("ALTER TABLE $tbl AUTO_INCREMENT=$c");
}


Όπου $tbl ο πίνακας μας και $field το πεδίο το οποίο είναι πρωτεύων κλειδί.

Καλούμε την συνάρτηση πολύ απλά ως εξής: π.χ.

κώδικας:
fixPrimaryKeyValuesInOrder("comments","id");


Πάμε να εξηγήσουμε τον κώδικα:
κώδικας:
$query=mysql_query("SELECT $field FROM $tbl");

Κάνουμε ένα query στην database και του λέμε επέλεξε το id (η καλύτερα όλες τις τιμές του πεδίου με το όνομα id) από τον πίνακα comments και αποθήκευσε τα δεδομένα σε μια μεταβλητή την $query.

κώδικας:
   $c=1;


Θέτουμε τιμή σε μια μεταβλητή ίσον με τον αριθμό 1 (Από 1 ξεκινά η αρίθμηση στην sql).

κώδικας:
 while ($row = mysql_fetch_array($query)){
      mysql_query("UPDATE $tbl SET $field='$c' WHERE $column='$row[$field]'");
      $c++;
   }


Κάνουμε μια επανάληψη σε όλα τα δεδομένα της $query, γραμμή γραμμή και κάθε φορά κάνουμε UPDATE στον πίνακα comments το πεδίο id με την τιμή της μεταβλητής $c (η οποία αυξάνεται κάθε φορά κατά 1) ΟΠΟΥ το id εχει τιμή αυτή που μας έχει επιστρέψει το αρχικό query.

κώδικας:
if(getNextAutoIncrement($tbl)) $query=mysql_query("ALTER TABLE $tbl AUTO_INCREMENT=$c");


Εδώ εξετάζουμε αν υπάρχει Auto Increment στον πίνακα (συνήθως υπάρχει στο πεδίο όπου υπάρχει το πρωτεύον κλειδί), αν υπάρχει τότε αλλάζουμε την τιμή του με την τιμή του $c το οποίο μόλις τελειωσει η επανάληψη θα έχει τιμή το πλήθος των "γραμμών" + 1, επειδή στην τελευταία επανάληψη, στο παράδειγμά μας, μόλις κανουμε UPDATE το πέμπτο στοιχείο, εκτελέιται η $c++;, που σημαίνει ότι έχουμε τελική τιμή της $c 6.

ορίστε και η συνάρτηση getNextAutoIncrement
κώδικας:
function getNextAutoIncrement($tbl){
$res = mysql_query("SHOW TABLE STATUS LIKE '$tbl'"); 
if ($res && mysql_num_rows($res)) { 
    $row = mysql_fetch_assoc($res); 
    $next_autoid = $row["Auto_increment"]; 
} else die("error!");
return $next_autoid;
}

Αυτά τα ολίγα. Αν έχετε κάποια απορία ή δεν συμφωνείτε με κάποια από τα παραπάνω, παρακαλώ τα σχολια σας.

Ιωάννης...

_________________
http://xesemesa.gr ή http://arxwn.eu όπως και να έχει http://jbaron.gr
korgr
Honorary Member

Μέλος από: 07 Οκτ 2008
Βοηθήματα: 5
Scripts: 2
Μηνύματα: 256+

Περιοχή: Corinth
View users profile
portfolio skype 
ΜήνυμαΣτις: 29 Αυγ 2010 07:11    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Τα id ειναι ενας unique identifier και οχι Α/Α
Υπαρχουν περιπτωσεις που μπορεις να παθεις ζημια εφαρμοζοντας τετοιες τακτικες.
Φαντασου ενα πινακα categories και εναν subcategories οπου το cat_id του subcategories ειναι id του categories. Μολις κανεις rearrange τα id του categories (πχ μετα απο διαγραφη της κατηγοριας με id=2), οι υποκατηγοριες που εχουν πχ cat_id=3, θα κοιτουν τα ραδικια αναποδα αφου η μητρικη τους κατηγορια θα εχει αλλαξει id

_________________
Projects: www.topgr.gr | www.ktizo.gr | Odyssey CMS | Οικονομική διαχείριση εσόδων-εξόδων
nbc
Honorary Member

Μέλος από: 05 Σεπ 2009
Βοηθήματα: 1
Μηνύματα: 256+


View users profile Visit posters website
ΜήνυμαΣτις: 29 Αυγ 2010 09:44    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

WSPNH, όπως τα λέει ο korgr. Η συνάρτησή σου είναι αυτοκαταστροφική και δεν θα έπρεπε να υπάρχει ούτε ως ιδέα. Πέραν του συσχετισμού με άλλους πίνακες, το id χρησιμοποιείται και στα urls, με άμεση συνέπεια στα ευρετήρια των μηχανών αναζήτησης, τις διάφορες cache, κοκ.
dimsis
Reporter

Μέλος από: 25 Ιουλ 2001
Βοηθήματα: 9
Νέα: 89
Μηνύματα: 256+


View users profile
ΜήνυμαΣτις: 29 Αυγ 2010 10:21    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Μπορεί να φανεί χρήσιμη μόνο για περιπτώσεις που το χρησιμοποιείς για δευτερεύων πεδίο π.χ. ταξινόμησης και όχι για κλειδιά, όπως σωστά αναφέρουν οι korgr και nbc.
π.χ. πες ότι στον πίνακα έχεις ένα άλλο κλειδί ας το πούμε id που είναι και autoincrement και ένα δεύτερο που το ονομάζεις sortby και βάση αυτού ταξινομείς και εμφανίζεις τα αποτελέσματα του πίνακα. Εκεί ναι θα μπορούσε να φανεί χρήσιμο αν δεν ήθελες να υπάρχουν "κενά" όσο διαγράφονται εγγραφές από τον πίνακα.
cordis
Administrator, [F|H]ounder, [C|S]EO

Μέλος από: 09 Οκτ 1999
Βοηθήματα: 95
Νέα: 475
Templates: 1
Scripts: 2
Μηνύματα: 256+

Περιοχή: Greece
View users profile Visit posters website
blog cv flickr picasa facebook linkedin 
twitter friendfeed deviantART del.icio.us 
ΜήνυμαΣτις: 29 Αυγ 2010 11:44    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

το έβαλα στα scripts ως δείγμα function για επαναρίθμηση πεδίων (πχ. πεδίο σειράς εμφάνισης) και όχι όπως αναγράφετε αρχικά για IDs γιατί όπως είπαν οι προλαλίσαντες είναι καταστροφικό

_________________
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

WSPNH


Μέλος από: 10 Μαρ 2006
Scripts: 1
Μηνύματα: 97


View users profile Send email to user Visit posters website
ΜήνυμαΣτις: 29 Αυγ 2010 13:43    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Οκ, αδέρφια...

Ίσως δεν το διευκρίνισα ότι είναι ενα απλό παράδειγμα και ότι δεν ενδυκνειται για dbs με πίνακες αλληλοεξαρτιζόμενους κ.τ.λ.. Για έναν πίνακα όμως κάνει δουλειά...

_________________
http://xesemesa.gr ή http://arxwn.eu όπως και να έχει http://jbaron.gr
dimsis
Reporter

Μέλος από: 25 Ιουλ 2001
Βοηθήματα: 9
Νέα: 89
Μηνύματα: 256+


View users profile
ΜήνυμαΣτις: 29 Αυγ 2010 14:31    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Σαν κλειδί μη σου πω ότι δεν κάνει δουλειά ούτε για έναν πίνακα. Εκτός και αν έχεις κανένα πρακτικό παράδειγμα χρήσης να μας δώσεις;
Γιατί πες ας πούμε ότι είναι ένας πίνακας με γνωμικά.
Έχεις μέσα αυτό το id, το γνωμικό (text) και το όνομα αυτού που το είπε (επίσης text).

id | quote | quote_teller
1, "Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.", "cordis"
2, "κάθε 2 μέρες πλέον παράγεται τόση πληροφορία, όση παρείχθε από την αρχή του πολιτισμού του ανθρώπου μέχρι & το 2003", "E.Shmidt"
3, "Η συνάρτησή σου είναι αυτοκαταστροφική και δεν θα έπρεπε να υπάρχει ούτε ως ιδέα", "nbc"

κάτι δεν θα κάνεις με αυτά τα δεδομένα του πίνακα; Ας πούμε ότι τραβάς ένα query και τα εμφανίζεις, οπότε όταν είσαι ας πούμε στο url www.quotes.gr/?q=1 δείχνεις το 1ο, www.quotes.gr/?q=2 το 2ο κ.ο.κ.
πας εσύ τώρα και σβήνεις το 2 και το 3 γίνετε 2... το URL www.quotes.gr/?q=2 θα δείχνει πλέον διαφορετικό quote, αυτό που πριν ήταν 3ο... και το q=3 δεν θα δουλεύει...
cordis
Administrator, [F|H]ounder, [C|S]EO

Μέλος από: 09 Οκτ 1999
Βοηθήματα: 95
Νέα: 475
Templates: 1
Scripts: 2
Μηνύματα: 256+

Περιοχή: Greece
View users profile Visit posters website
blog cv flickr picasa facebook linkedin 
twitter friendfeed deviantART del.icio.us 
ΜήνυμαΣτις: 29 Αυγ 2010 20:44    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

δεν χρειάζεται να το διαγράψω το μήνυμα, όπως έγραψα παραπάνω η function αυτή μπορεί να έχει εφαρμογές και να είναι χρήσιμη, απλά δεν είναι για IDs

_________________
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [8 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP τα δικά μας scripts
Τώρα είναι 04 Δεκ 2016 22:21 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos