auto_increment-Problem

  • Themenstarter Themenstarter Kebb
  • Beginndatum Beginndatum
K

Kebb

Hallo, ich hab da ein kleines Problem mit meiner DB:

Also ich habe ein Newssystem in Flash, welches die News mit ihrer ID (Primärschlüssel in der Tabelle) ausgibt.

Abfrage über ein PHP-Script:
News für News. In der Flash wird eine Variable count runter, bzw. hoch gezählt und diese dann an die PHP geschickt, welche die richtige Nachrricht dann zurückwirft.

Soweit so gut, das Feld ID hab ich auf auto_increment gestellt und soll die ID's natürlich nacheinander eintragen (1,2,3,4,5,....). Doch da gibt es ein Problem:

Nehmen wir mal an ich habe 100 Einträge und lösche nun den fünften (Teoretisch den mit ID 95). Was passiert? Ich habe nun 99 Einträge, ID's von Wert 1 bis Wert 94...die nächsten News dann von 96 bis 100, ergo eine Lücke. Aber es sollte nun so sein, dass jetzt die ID's von 1 bis 99 gehen sollen. Nächstes Problem nach der Löschung, zb. wenn ich die letzte News Lösche (ID 100), dass eine neue Nachrricht dann die ID 101 bekommt, ergo wieder eine Lücke :/

Kann man das irgendwie umgehen? Gibts da ne Einstellung in myadmin oder so?

PS: Achja, die Löschung führe ich (zumindest im Moment noch) direkt in myAdmin aus, nicht über ein PHP-Script...
 
Zuletzt bearbeitet von einem Moderator:
Das könnt ich ja auch, aber ich lade jede News einzeln nach, sie werden nicht untereinander angezeigt...Button: ältere News - Button: neuere News... und wenn ich eine dazwischen Lösche ist die eine plötzlich ganz leer und die nächte ist dann wieder was drin:

zu testen hier: http://www.makumedia.de/test

unter das 'maximieren' bei aktuelles klicken...ich lösche mal News 20

Das PHP-hol-mir-die-news-Script:

Die SWF schickt $newscount und $newsaction

Code:
if($newsaction == "getnews"){
 $newsabf = mysql_query("SELECT * FROM mm_news WHERE id = $newscount", $dblogin);
 $newsabfres = mysql_fetch_assoc($newsabf);

 $newshhl = $newsabfres['headline'];
 $newshdatee = $newsabfres['date'];

 $newshdate = date("d.m.Y", $newshdatee);
 $newshtime = date("H:i", $newshdatee);
 
 $newst = $newsabfres['content'];
 $newsh = "Titel: $newshhl%0DAm: $newshdate Um: $newshtime Uhr";

 $echos = "&newse=$newst
&newseh=$newsh
&getnewsdone=true";

 echo $echos;
}
 
Zuletzt bearbeitet von einem Moderator:
Dann machst Du halt eine (besonders einfache) Blätterfunktion mit nur einem Eintrag.

init:
Code:
SELECT COUNT(*) FROM news

Abfrage:
Code:
SELECT * FROM news LIMIT GREATEST(
    0,
    LEAST(
        (SELECT COUNT(*) FROM news),
        $aktiveNews
    ),
1

Dazu (in Pseudecode) für die Buttons:
Code:
Wenn ($activeNews<=0) dann
    "vorige News"-Button nicht zeigen
sonst 
    "vorige News"-Button mit $activeNews - 1 zeigen

Wenn ($activeNews>=COUNT(*)) dann
    "nächste News"-Button nicht zeigen
sonst 
    "nächste News"-Button mit $activeNews + 1 zeigen
 
Hmm, also so isses nu:

Die Flash startet am Anfang die Abfrage wie viele News es denn gibt:
$newsaction = "maxnews"

Code:
if($newsaction == "maxnews"){
 $newsabf = mysql_query("SELECT count(*) FROM mm_news", $dblogin);
 $newsabfres = mysql_fetch_assoc($newsabf);

 $maxnews = $newsabfres['count(*)'];

 $echos = "&maxnews=$maxnews
&maxnewsdone=true";

 echo $echos;
}

Die Buttons steuern nun die $newscount-Variable

Code:
on(release){
 if (newscount < maxnews){
  newscount++;
  gotoAndPlay(5);  //wieder die News Abfragen
 }
}

------------------------------------------------------------------

on(release){
 if (newscount > 1){
  newscount--;
  gotoAndPlay(5);
 }
}

Nun startet die Flash $newsaction = "getnews"

Code:
if($newsaction == "getnews"){
 $newsabf = mysql_query("SELECT * FROM mm_news LIMIT GREATEST(0,LEAST((SELECT COUNT(*) FROM mm_news),$newscount),1", $dblogin);
 $newsabfres = mysql_fetch_assoc($newsabf);

 $newshhl = $newsabfres['headline'];
 $newshdatee = $newsabfres['date'];

 $newshdate = date("d.m.Y", $newshdatee);
 $newshtime = date("H:i", $newshdatee);
 
 $newst = $newsabfres['content'];
 $newsh = "Titel: $newshhl%0DAm: $newshdate Um: $newshtime Uhr";

 $echos = "&newse=$newst
&newseh=$newsh
&getnewsdone=true";

 echo $echos;
}

Und das Ergebnis:
Ich habe die Newsanzahl und kann zwischen Ihnen springen, jedoch bekomm ich keine Werte über den Inhalt zurück = völlig leere News...
 
Ich habe da 'ne Klammer vergessen:
Code:
SELECT * FROM news LIMIT GREATEST(
    0,
    LEAST(
        (SELECT COUNT(*) FROM news),
        $aktiveNews
    )
),
1
Eine Ausgabe von [phpf]mysql_error[/phpf] würde nicht schaden, wenn man Querys testet ;)

Gruß hpvw
 
Scheinbar gibt es bei LIMIT gewisse Probleme mit Ausdrücken und Subqueries.
Daher solltest man den Teil wohl doch besser in PHP machen:
PHP:
$count="Aus DB ermittelter Wert";
$activeNews="Vom Flash erhaltener Wert";
$thisNews=min($count /*evtl. - 1*/, max(0,$activeNews));
$sql="SELECT * FROM news LIMIT $thisNews,1";
//...
 
Code:
if($newsaction == "getnews"){
 $newsabf = mysql_query("SELECT count(*) FROM mm_news", $dblogin);
 $newsabfres = mysql_fetch_assoc($newsabf);

 $maxnews = $newsabfres['count(*)'];

 $thisNews=min($maxnews, max(0,$newscount)); 

 $newsabf = mysql_query("SELECT * FROM mm_news LIMIT $thisNews,1", $dblogin);
 $newsabfres = mysql_fetch_assoc($newsabf);

 $newshhl = $newsabfres['headline'];
 $newshdatee = $newsabfres['date'];

 $newshdate = date("d.m.Y", $newshdatee);
 $newshtime = date("H:i", $newshdatee);
 
 $newst = $newsabfres['content'];
 $newsh = "Titel: $newshhl%0DAm: $newshdate Um: $newshtime Uhr";

 $echos = "&newse=$newst
&newseh=$newsh
&getnewsdone=true";

 echo $echos;
}

Er zeigt die News an, jedoch ist die erste angezeigte leer und die erste richtige kommt dann bei der 2...und die älteste News wird garnicht angezeigt...

PS: Wenn ich bei thisNews -1 mache, dann zeigt er die erste zwar auch an, jedoch kommt bei 2 die selbe nochmal und die älteste wird auch nicht angezeigt...
 
Dann versuche mal das:
PHP:
//Wenn nichts gesetzt, ganz zuerst:
if (empty($activeNews)) {
    $activeNews=$count-1;
}

//...

$thisNews=max(0,min($count  - 1,$activeNews));
 
Zuletzt bearbeitet:
Zurück