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

Μια περιοχή όπου τα μέλη μας μπορούν να βάζουν τα PHP scripts που έχουν φτιάξει και θέλουν να τα μοιραστούν με τα υπόλοιπα μέλη.

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
WSPNH
Δημοσιεύσεις: 97
Εγγραφή: 10 Μαρ 2006 12:52
Επικοινωνία:

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

Δημοσίευση από WSPNH » 29 Αύγ 2010 03:40

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

Πόσες φορές διαγράψατε ένα πεδίο π.χ. ένα 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
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

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

Δημοσίευση από korgr » 29 Αύγ 2010 08:11

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

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

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

Δημοσίευση από nbc » 29 Αύγ 2010 10:44

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

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

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

Δημοσίευση από dimsis » 29 Αύγ 2010 11:21

Μπορεί να φανεί χρήσιμη μόνο για περιπτώσεις που το χρησιμοποιείς για δευτερεύων πεδίο π.χ. ταξινόμησης και όχι για κλειδιά, όπως σωστά αναφέρουν οι korgr και nbc.
π.χ. πες ότι στον πίνακα έχεις ένα άλλο κλειδί ας το πούμε id που είναι και autoincrement και ένα δεύτερο που το ονομάζεις sortby και βάση αυτού ταξινομείς και εμφανίζεις τα αποτελέσματα του πίνακα. Εκεί ναι θα μπορούσε να φανεί χρήσιμο αν δεν ήθελες να υπάρχουν "κενά" όσο διαγράφονται εγγραφές από τον πίνακα.

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

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

Δημοσίευση από cordis » 29 Αύγ 2010 12:44

το έβαλα στα scripts ως δείγμα function για επαναρίθμηση πεδίων (πχ. πεδίο σειράς εμφάνισης) και όχι όπως αναγράφετε αρχικά για IDs γιατί όπως είπαν οι προλαλίσαντες είναι καταστροφικό ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

WSPNH
Δημοσιεύσεις: 97
Εγγραφή: 10 Μαρ 2006 12:52
Επικοινωνία:

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

Δημοσίευση από WSPNH » 29 Αύγ 2010 14:43

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

Ίσως δεν το διευκρίνισα ότι είναι ενα απλό παράδειγμα και ότι δεν ενδυκνειται για dbs με πίνακες αλληλοεξαρτιζόμενους κ.τ.λ.. Για έναν πίνακα όμως κάνει δουλειά... :-)
http://xesemesa.gr ή http://arxwn.eu όπως και να έχει http://jbaron.gr

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

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

Δημοσίευση από dimsis » 29 Αύγ 2010 15:31

Σαν κλειδί μη σου πω ότι δεν κάνει δουλειά ούτε για έναν πίνακα. Εκτός και αν έχεις κανένα πρακτικό παράδειγμα χρήσης να μας δώσεις;
Γιατί πες ας πούμε ότι είναι ένας πίνακας με γνωμικά.
Έχεις μέσα αυτό το 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
Δημοσιεύσεις: 27626
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

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

Δημοσίευση από cordis » 29 Αύγ 2010 21:44

δεν χρειάζεται να το διαγράψω το μήνυμα, όπως έγραψα παραπάνω η function αυτή μπορεί να έχει εφαρμογές και να είναι χρήσιμη, απλά δεν είναι για IDs ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Απάντηση

Επιστροφή στο “PHP τα δικά μας scripts”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες