php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.12.2011, 15:53  
Neuer Benutzer
 
Registriert seit: 10.02.2008
Beiträge: 28
schani
Standard Sortierreihenfolge in DB zurückschreiben

Hallo Zusammen,

ich suche nach einer Lösung wie ich die Sortierrung in eine DB zurückschreiben kann.
Code:
id|name|wert|order
1|aaa|xxx|10
2|bbb|xxx|20
3|ccc|xxx|160
4|ddd|xxx|40
5|eee|xxx|80
6|fff|xxx|320
7|ggg|xxx|2560
8|hhh|xxx|640
9|iii|xxx|1280
10|jjj|xxx|5120
Ich habe eine normale MySQL Tabelle ausgegeben und Pfeil Up/Down Buttons pro Zeile ins Layout eingebaut.
Jetzt kann ich einzelne Datensätze nach oben und unten verschieben. Die Werte im Feld order werden dann dementsprechend addiert oder subtrahiert und wieder neu Durchgezählt.

Gibt es für diese Funktion eine saubere Umsetzung. Ich war zwar soweit schon Erfolgreich, aber ganz Rund läuft meine Sache noch nicht. Gerade bei einem neuen Datensatz, oder Gruppierungen komme ich auf keine Lösung.

Kennt Ihr so was ? Bei PHP-Classes.org habe ich nichts gefunden und Google ist auch sprachlos.

Besten Dank für einen Tipp

Christian
schani ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.12.2011, 16:11  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Neu durchzählen ist nicht nötig, genausowenig, wie alle Order-Werte neu zu berechnen.

Wenn ein Element um 1 Position nach oben oder unten rutscht, tauscht es lediglich den Order-Wert mit dem entsprechenden Nachbarn, thats' it.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 03.12.2011, 16:13  
Erfahrener Benutzer
 
Registriert seit: 07.12.2009
Beiträge: 843
PHP-Kenntnisse:
Fortgeschritten
chorn befindet sich auf einem aufstrebenden Ast
Standard

Ich vergebe bei neuen Datensätze als Sortierung immer die ID, danach wird nurnoch mit bestehen Datensätzen getauscht.
chorn ist offline   Mit Zitat antworten
Alt 03.12.2011, 16:41  
Neuer Benutzer
 
Registriert seit: 10.02.2008
Beiträge: 28
schani
Standard

Hm, wie komme ich aber an den order Wert des Nachbarn? Ich muss doch dann beim Updaten 2 Datensätze ändern? Könnt Ihr mir das genauer erklären?
schani ist offline   Mit Zitat antworten
Alt 03.12.2011, 18:36  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Code:
SELECT ... WHERE `order` < "aktuelle Order" ORDER BY `order` ASC LIMIT 1
und
Code:
SELECT ... WHERE `order` > "aktuelle Order" ORDER BY `order` ASC LIMIT 1
?

Besser wäre aber vermutlich, den zu ändernden Datensatz und seinen Nachbarn zu holen und das in einer Transatkion abzufackeln, um sich überschneidende Änderungen zu vermeiden.
Code:
BEGIN;
SELECT @aendernID := `id`, @aendernOrder =: `order` FROM ... WHERE `id` = <deine ID>;
SELECT @aendernZuID := `id`, @aendernZuOrder =: `order` FROM ... WHERE `order` < <deine ID> ORDER BY `order` ASC LIMIT 1;
UPDATE ... SET `order` = @aendernZuOrder WHERE `id` = @aendernID;
UPDATE ... SET `order` = @aendernOrder WHERE `id` = @aendernZuID;
COMMIT;
Das klappt so allerdings nur, wenn "order" keinen UNIQUE-Index hat, sollte das der Fall sein musst du einen der beiden Datensätze "zwischendurch" auf eine nicht existierende Order setzen (z.B. den Maximalwert der Spalte).
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5

Geändert von G.Schuster (03.12.2011 um 18:42 Uhr).
G.Schuster ist offline   Mit Zitat antworten
Alt 03.12.2011, 18:44  
Neuer Benutzer
 
Registriert seit: 10.02.2008
Beiträge: 28
schani
Standard

Ich glaube Ihr habt mich nicht richtig verstanden.
Ich will die Ordnungsreihenfolge für immer festschreiben, nicht nur für den Moment der Anzeige. Ich will mir eine Tabelle ordnen und diese Ordnung beibehalten. Ach beim nächsten Seitenaufruf. Dazu muss ich doch die neue Anordnung wieder in die Datenbank schreiben?

Christian
schani ist offline   Mit Zitat antworten
Alt 03.12.2011, 19:18  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Mach ne zweite Referenztabelle, in die Du die Zuordnungen und Sortierungen schreibst.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 03.12.2011, 20:03  
Neuer Benutzer
 
Registriert seit: 10.02.2008
Beiträge: 28
schani
Standard

Gibt es einen Namen dafür wonach man suchen könnte?

G.Schuster => Ich bin gerade am testen
schani ist offline   Mit Zitat antworten
Alt 03.12.2011, 23:40  
Neuer Benutzer
 
Registriert seit: 10.02.2008
Beiträge: 28
schani
Standard Nach reichlich googlen

Hier mal eine Lösung für mein Problem. Ich wer sie noch wieter anpassen und verbessern.

Danke Euch für die Anregungen

Hier der Code:
PHP-Code:
include('config.php');  // DB Verbindung

if($art == ''){ $art 'liste';};

switch(
$art){

case 
'liste':
    print 
"<h3>Tabelle</h3>";
    
$liste mysql_query("SELECT * FROM test ORDER BY position ASC");
    print 
"<table border='1'>";
        print 
"<tr><td>id</td><td>name</td><td>position</td><td>up</td><td>down</td></tr>";
    while(
$feld mysql_fetch_object($liste)){
        print 
"<tr><td>".$feld->id."</td><td>".$feld->name."</td><td>".$feld->position."</td><td><a href='".$PHP_SELF."?art=order&id=".$feld->id."&action=up'>up</a></td><td><a href='".$PHP_SELF."?art=order&id=".$feld->id."&action=dn'>down</a></td></tr>";
    };
    print 
"</table>";




break;

case 
'order':

// $_GET['action'] will indicate up/dn
$action = isset($_GET['action']) ? $_GET['action'] : false// condition input and set default
// $_GET['id'] is the id to move up/dn
$id = isset($_GET['id']) ? (int)$_GET['id'] : false// condition input and set default
if(!$id){
    die(
"No id supplied");
}
if(
$action <> "up" && $action <> "dn"){
    die(
"Invalid action selected");
}

// get the current position of the id 
$query "SELECT position FROM test WHERE id = $id";
$result mysql_query($query) or die("Query failed: $query<br />Mysql error: " mysql_error());
if(
mysql_num_rows($result) <> 1){
    echo 
"There is no id: $id<br />";
} else {
    list(
$get_position) = mysql_fetch_row($result); // get the position of the requested id
    
if($action == "up"){
        
// get the id and position of that and the next lower position
        
$query "SELECT id, position FROM test WHERE position <= $get_position ORDER BY position DESC LIMIT 2";
    } else {
        
// get the id and position of that and the next higher position
        
$query "SELECT id, position FROM test WHERE position >= $get_position ORDER BY position LIMIT 2";
    }    
    
$result mysql_query($query) or die("Query failed: $query<br />Mysql error: " mysql_error());
    
// test how many rows (if less than 2, there is no locaiton to move to)
    
if(mysql_num_rows($result) < 2){
       
// echo "You are already at the limit<br />";
    
} else {
        
// move up/dn one by swapping the position values
        
$row1 mysql_fetch_assoc($result); // row1
        
$row2 mysql_fetch_assoc($result); // row2
        // update row1 (with row2's position value)
        
$query "UPDATE test SET position = {$row2['position']} WHERE id = {$row1['id']}";
        
$result mysql_query($query) or die("Query failed: $query<br />Mysql error: " mysql_error());
        
// update row2 (with row1's position value)
        
$query "UPDATE test SET position = {$row1['position']} WHERE id = {$row2['id']}";
        
$result mysql_query($query) or die("Query failed: $query<br />Mysql error: " mysql_error());
    }
}  


      
header('Location: http://'.getenv('HTTP_HOST').$PHP_SELF."?art=liste");
      exit;

break;


}; 
Code:
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `position` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
schani ist offline   Mit Zitat antworten
Alt 04.12.2011, 00:53  
Erfahrener Benutzer
 
Registriert seit: 07.12.2009
Beiträge: 843
PHP-Kenntnisse:
Fortgeschritten
chorn befindet sich auf einem aufstrebenden Ast
Standard

Das ist doch genau das was am Anfang gesagt wurde. Man muss das auch nicht künstlich auf die Nachbar beschränken, tausche Datensatz x mit Datensatz y.
chorn ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sortierreihenfolge festlegen imamk PHP Einsteiger 12 21.03.2011 17:17
Sortierreihenfolge selbst definieren Maggi76 Datenbanken 9 20.12.2010 14:48
Sortierreihenfolge ändert sich Sturmfeuer Datenbanken 6 03.10.2007 18:10
Sortierreihenfolge nach Eintrag oder letzter Änderung leuktra Datenbanken 7 29.01.2007 19:20
Radiobuttons und in value Wert Daten zurückschreiben nieselfriem PHP Tipps 2005-2 3 18.06.2005 19:45
sql-ausgabe geändert wieder zurückschreiben c-f-g PHP Tipps 2005-2 9 15.06.2005 14:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php db up down order

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:56 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum