PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] erkenne keinen fehler im script


ESAD
2005-08-20, 10:42:44
//ändern der newseigenen ids welche nach der gelöschten news kommen
$abfrageid = "SELECT id FROM newsinhalt where datum='$abgefragtesdatum'";
$erg = mysql_query($abfrageid);
while (list($abfrageid) = mysql_fetch_row($erg))
{
$abfrageidgesamt = "SELECT id FROM newsinhalt where text='text1'";
$erg = mysql_query($abfrageidgesamt);
while (list($abfrageidgesamt) = mysql_fetch_row($erg))
{
for($count = $abfrageid; $count <= $abfrageidgesamt; $count++)
{
$countklein= $count - 1;
$andernid = "UPDATE newsinhalt SET id='$countklein' WHERE id='$count'";
$id = mysql_query($andernid)or die (mysql_error().'<br/>Befehl:'.$andernid);

}

}
}


sinn des scripts:
bei diesem script handelt es sich um einen teil eines newssystems
dieses system basiert auf einer datenbank wo es für jeden beitrag eine zeile gibt worin das erstalleungsdatum, der text, und die id(wird beim eintragen einer news immer um 1 erhöht und dient an anderer stelle gebraucht um die beträge geordnet auszugeben)

was sollte das script tun :
jetzt habe ich aber die möglichkeit eingebaut einen beitrag zu löschen. (das script zum löschen etc funktioniert einwandfrei)
nun soll das cript die ip jedes beitrages welcher nach dem beitrag steht der gelöscht wird um 1 verringern(ich weis das auch der eigentliche beitrag erniedrigt wird aber der wird gleich darauf gelöscht)

erklärung variablen,etc:
$abgefragtesdatum // die id des beitrages und überhaupt der beitrag wird darüber identifiziert indem man das erstellungsdatum auswählt

SELECT id FROM newsinhalt where text='text1' // es gibt am anfang der tabelle eine zeile in der die höchste id eingetragen ist und auch die anzahl diese enthält in der spalte text dern wert text1 und wird darüber identifiziert(diese spalte ist ein überbleibsl aus den ersten anfängen die zweckentfrendet wird was aber ganz gut geht)

for($count = $abfrageid; $count <= $abfrageidgesamt; $count++)
//soll als schleife durchlaufen um die erniedrigung der id zu ermöglichen

UPDATE newsinhalt SET id='$countklein' WHERE id='$count'
//soll die neue id eintragen also also wo vorher die news die id 6 hatta soll sie nacher die id 5 haben



ps mir ist klar, dass das ganze auch ohne verringerung der id gehen wüde aber es soll für mich eine übung sein deshalb der aufwand (diese script wird wenn ich zeit finde auch einmal richtig in einer seite eingesetzt)


wenn ihr den fehler finden würde wäre ich euch sehr dankbar

mfg

esad

Gast
2005-08-20, 12:26:03
Warum nicht einfach

UPDATE newsinhalt SET id = id-1 WHERE id > $id_von_geloeschtem_beitrag;

Brauchst du keine Schleife und nichts.

Aber ich gehe mal davon aus, daß man später irgendwann auf http://bla.de/news.php?id=0815 verlinken kann und sich so einzelne Newsitems rauspicken kann. Irgendwie in der Art. Wenn du da jetzt die NewsIDs veränderst, wird das alles absolut inkonsistent und du hast keine Möglichkeit, irgendwie nachzuvollziehen, wo denn jetzt der Artikel hin ist, auf den du verlinken wolltest - konsequenterweise wird sich auf Dauer kein Mensch die Mühe machen, deine Seite als Quelle heran zu ziehen, weil man sich ja nie sicher sein kann, daß die News morgen noch da stehen, wo sie sollen.

Anstatt also auf Teufel komm raus Löcher in der DB verhindern zu wollen, könntest du dir einfach einen Indikator aussuchen, anhand dessen das Script einen gelöschten Beitrag erkennt, und dann entsprechend eine Fehlermeldung ausgibt ("Den Beitrag gibt es nicht mehr"), anstatt einfach eine völlig andere Meldung auszugeben, die unter Umständen nichts mehr mit dem eigentlichen Thema zu tun hat.

Gast
2005-08-20, 12:28:58
Abgesehen davon ist text1 keine Variable

Gast
2005-08-20, 12:36:47
$abfrageidgesamt = "SELECT id FROM newsinhalt where text='text1'";
$erg = mysql_query($abfrageidgesamt);
while (list($abfrageidgesamt) = mysql_fetch_row($erg))

Und das finde ich irgendwie sehr konfus, wenn du da wild Variablen überschreibst und ihnen dann eine völlig neue Aufgabe gibst.


Du solltest dir für sql-Abfragen eine konsequente Syntax überlegen. Ich persönlich find's gräslich, wenn deutsche Variablennamen verwendet werden. Ich kenne es eigentlich nur so, daß Queries $query heißen und Result Sets eben $result heißen.

$query = "SELECT id FROM newsinhalt where text='$text1'"; //wieso identifizierst du das überhaupt anhand des Textes, wenn du doch eh die ID hast?
$result = mysql_query($query);

while ($row = mysql_fetch_array($result, MSQL_ASSOC)) {
echo $row['id'];
}


Da du genau weißt, daß du eh nur eine Zeile im Result Set hast, brauchst du hier noch nicht mal die while Schleife und kannst den fetch-Befehl direkt verwenden.

ESAD
2005-08-20, 13:10:50
danke für die hinweise hat geholfen habe garnicht daran gedacht das es sql ja auch direkt kann

Flipper
2005-08-20, 19:26:57
Ich würd das generell nicht machen, sowas ist "gegen die guten Sitten" bei Datenbanken. Einfach löschen und gut ist.

Wenn das mahcst, um "news #32" ausgeben zu können und da keine "Löcher" drin zu haben, dann kannst du das auch in der Zählschleife direkt ermitteln.

so wie der Gast drüber eigentlich eh schon geschrieben hat :>