PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tabellennummerierung anpassen oder zeilennummer herausfinden!?


vossl
2006-11-08, 18:41:52
hallo,
mal wieder eine mysql-frage:

ich habe eine tabelle zur verwaltung eines buchbestandes.

jedes buch hat eine nummer zugeordnet: nr (auto_increment)


grob schematisch:
|nr|buch|
| 1|.......|
| 2|.......|
| 3|.......|
| 4|.......|
...

nun soll der bestand auch verwaltet werden, sprich bücher hinzu und auch wieder weg...

das hinzufügen ist nicht das problem, sondern das löschen aus dem bestand.

dazu habe ich mir gedacht:
man gibt die nummer an, dessen zugeordnetes buch entfernt werden soll.

dann per DELETE * FROM bestand WHERE nr='$nr' wird der datensatz gelöscht.

so, nun zum problem:

gibt es eine möglichkeit die nr-spalte zu aktualisieren?
da, wenn ich $nr = 3 lösche, sieht die tabelle so aus:
|nr|buch|
| 1|.......|
| 2|.......|
| 4|.......|
...

ich möchte also dann 4 zu 3 machen... gibts da ne spezielle funktion.

oder anders:
wie kann ich mir die zeilennummer ausgeben lassen, die nun ja nicht mehr dem wert der spalte nr übereinstimmt.


thx

Nase
2006-11-08, 22:18:29
Du könntest dir den Datensatz ausgeben lassen, der an zb dritter Position steht, in dem du einfach deine Anfrage um Limit x,y erweiterst. x ist dabei der Startpunkt, y die Anzahl an Datensätzen, die ab diesem Punkt ausgelesen werden. Beispiel: limit 5,10 bedeutet, dass ab dem 5. Datensatz die darauffolgenden 10 Datensätze ausgelesen werden.

Sphinx
2006-11-08, 22:42:19
Ich verstehe nicht die Problematik oder nur "ansatzweise".

Die Bücher erhalten eine für sich gültige "ID" die logischerweise sich mit jedem Eintrag erhöht.

Mit der "ID" Kannst du jedes Buch "identifizieren" fürs Löschen,Editieren etc.

Warum wird eine "Resortierung" des ID Wertes verlangt ? Der Übersichtshalber nur ? Ansonsten würde mir nur sporadisch + spontan nur der weg über Export Import einfallen und beim export ohne einen Wert der ID [auto_increment] mit angeben lassen.

Tommes
2006-11-08, 23:48:00
Sowas sollte man eigentlich niemals machen. Überleg mal, du müsstest die Nr auch in allen Tabellen, die auf deine Buch Tabelle verweisen, ändern. Du kannst die doch bei der Ausgabe durchnummerieren. Eine Alternative wäre, wenn du ein zusätzliches Feld "Position" einfügst.

vossl
2006-11-09, 06:35:23
hey,

also, um das mal klar zu stellen:

ich brauche die korrekte zeilennummer eines datensatzes, da ich mittels msql_result() weiterarbeiten möchte und dort muss ich nunmal eine zeilennummer angeben für den korrekten datensatz.

ich als mysql-newbie habe einfach versucht mich dem problem auf meine weise zu nähern.

um also weiterzukommen, müsste ich wie gesagt entweder die bücher resortieren, was aber nicht tragisch ist, da keine verknüpfung zu irgendwelchen anderen tabellen vorhanden.

oder ich müsste die exakte zeilennummer erfahren können.


aber schonmal danke für die vorschläge...

Tommes
2006-11-09, 08:06:46
Und warum mysql_result()?

Sphinx
2006-11-09, 12:29:57
ich brauche die korrekte zeilennummer eines datensatzes, da ich mittels msql_result() weiterarbeiten möchte und dort muss ich nunmal eine zeilennummer angeben für den korrekten datensatz.


Woher willst du wissen - das die Zeilennummer in der Tabelle der Korrekte Datensatz ist, den du anforderst?

Mal angenommen
Tabelle Buchbestand

ID Buch
1 Goliath
4 Jesu
13 Mein Leben
26 World Of

Du möchtest nun das 4te Buch in deiner Tabelle auslesen und mit diesen Werten weiterarbeiten...

mysql_result gibt dir immer aus dem Ergebnis $result die Zeilennummer 0-x aus.

$result = mysql_query('SELECT ID,BUCH FROM Buchbestand);
echo mysql_result($result, 3);

Lies dir die ID aus, wofür sie ja auch normaler weise sehr dienlich ist um später mit diesen Wert weiterzuarbeiten.

Beispiel "Lösche Datensatz Wo ID=26 "


Die gefundenen Datensätze $result in der Tabelle Buchbestand sind immer von 0 an beginnend bis zum letzen durchnummeriert...

ZapBee
2006-11-09, 13:07:06
@Threadstarter: sorry aber :eek: :confused:
Die Bücher werden über die eindeutige ID identifiziert und nicht über die Zeile, in der sie stehen. Stell Dir mal vor, Du willst irgendwann nach Namen sortieren statt nach Nummer, dann stehst Du aber im Regen...
Außerdem würde ich den Bestand nicht in der Verzeichnis-Tabelle verwalten und schon gar nicht da drin rumlöschen. Was machst Du denn, wenn Ihr mehr als ein Exemplar eines Buches habt?
Mein Vorschlag: Eine Tabelle "Bücher", da ist jedes Buch (nicht jedes Exemplar!) genau einmal drin, mit ID, ISBN, Titel, Autor (der ist eigentlich eine weitere Tabelle wert) usw. Dann eine Tabelle "Bestand", da steht drin, welchen Status (vorhanden, verliehen, gelöscht) die einzelnen Exemplare des Buches haben. Wenn Ihr drei Stück von einem habt, steht das Buch mit der entsprechenden ID aus der ersten Tabelle eben dreimal drin. Und in dieser Bestandstabelle wird geändert und gelöscht. Nur wenn ein neues Buch, welches Ihr noch nie hattet, hinzukommt, wird es in die erste Tabelle aufgenommen. Klingt vielleicht zunächst nach viel zuviel Aufwand, aber schlechtes DB-Design rächt sich irgendwann in der Zukunft!
Ich würde es so machen wie im Anhang (Grobentwurf, fehlen noch Merkmale). Die Zwischentabelle "buecher_has_autoren" deshalb, weil ein Autor ja mehrere Bücher geschrieben haben kann und ein Buch auch mehrere Autoren haben kann.
Wenn Fragen auftauchen, frag. Ansonsten würde ich Dir dringend mal ein Buch oder einen Kurs über Datenbankdesign empfehlen ;)

EDIT: Achja, und auslesen aus der Datenbank zeilenweise mit mysql_fetch_array! Z.B.:

$sql = "SELECT titel, ISBN, name, vorname FROM tb_buecher b, tb_buecher_has_tb_autoren ba, tb_autoren a WHERE b.buch_id = ba.buch_id AND ba.autor_id = a.autor_id";
$buecherliste = mysql_query($sql);
while ($row = mysql_fetch_array($buecherliste)){
echo $row['titel'] . ", " . $row['ISBN'] . ", " . $row['name'] . ", " . $row['vorname'] . "<br>;
}


Zap

vossl
2006-11-09, 16:17:24
hallo,

erstmal vielen dank für das rege interesse und die vielen vorschläge...

es geht nur um den handapparat meines profs, sprich es handelt sich um ca. 50 bücher und der bestand ändert sich recht selten, so dass ich es in kauf nehme, dass das ganze hier nicht zu umfangreich wird. also nochmal die frage:

hat jemand ne idee, wie ich die zeilennummer hearusfinde bzw. wie ich die nummerierung ändere.

die nummerierung ist nur mittel zum zweck...

PatkIllA
2006-11-09, 19:23:56
Das mit der Nummer ist immer noch Blödsinn.
Wenn du unbedingt eine durchgehende Nummer haben willst, dann zähl einfach bei der Ausgabe mit. Beim Löschen Link übergibst du dann trotzdem die ID.
Das umsortieren ist aufwendiger als die anständige Lösung.

vossl
2006-11-09, 19:36:03
Das mit der Nummer ist immer noch Blödsinn.
Wenn du unbedingt eine durchgehende Nummer haben willst, dann zähl einfach bei der Ausgabe mit. Beim Löschen Link übergibst du dann trotzdem die ID.
Das umsortieren ist aufwendiger als die anständige Lösung.

wie gesagt newbie, also was meinst du genau?

für einfachere alternativen bin ich dankbar, nur weil irgendwie keiner so richtig nen tipp gibt, wie ich die tatsächliche zeilennummer erfahre...

(is nicht bös gemeint... bin dankbar für antworten...)

PatkIllA
2006-11-09, 19:37:50
Wie sieht denn deine Datenbank aus?
Also was für Tabellen mit welchen Spalten?

vossl
2006-11-09, 19:56:35
wie gesagt, soll keine große sache werden...

hab eine tabelle, wo ich alle erforderlichen daten reingeknallt hab...

|nr|status|autor|buch|titel|jahr|name|vorname|email|datum|

letztere angaben sind vom verleiher...

PatkIllA
2006-11-09, 20:05:41
ich nehme mal an du hast nr als Primärschlüssel.
Dann machst du einfach beim Auflisten der bücher einen Link
echo "<a href=\"seite.php?action=del&amp;nr=$nr>löschen</a>" für jedes Buch.
In deinem Script fragst du dann ab ob die action löschen ist und löscht dann die Nummer.

if ($_GET["action"] == "del") {
$link = mysql_connect("host","user","pass");
$id = intval($_GET["nr"];
$mysql_result = mysql_query("DELETE FROM tabelle WHERE nr = $id", $link);
}

Das die Nummern nicht fortlaufend sind stört überhaupt nicht.

ZapBee
2006-11-09, 20:24:10
Mal ganz blöd gefragt: Tuts denn dann nicht auch ne Excel-Tabelle? Ich meine, für diese Art, die Daten zu speichern ist eine Datenbank doch Verschwendung :rolleyes:

Zap

vossl
2006-11-09, 20:45:06
die lösung per php und mysql ist insofern schön, dass man sie auch von unterwegs im netz abrufen kann!!

Flipper
2006-11-09, 21:47:42
Pseudo-PHP-Code, sprich nicht einsatzfähig sondern nur um den Vorgang zu demonstrieren:

$result = mysql_query($sql); //DB-Abfrage
if ($result) {
while($row = mysql_fetch_array($result)) { //Arrays mit den Werten initialisieren
$qry_id = $row[id];
$qry_name = $row[name];
}
}

for ($i = 0; $i < count($qry_id); $i++) { //Liste mit Lösch-Links ausgeben
echo "Eintrag $i - " . $qry_id[$i] . "<a href=\"$PHP_SELF" . "?delete=$qry_id[$i]" . "\">$qry_name[$i] löschen</a>\n<br>\n";
}

in der for-Schleife gibt dir $i die aktuelle Zeilennummer, und $qry_id[$i] die ID des Buches aus.
Das auf deine Bedürfnisse umbasteln musst du allerdings selbst.

vossl
2006-11-12, 19:59:49
also, wie schon gesagt: danke für eure hilfe...
ich hab das zeilennummerproblem gelöst, mittels $i = count($row[nr]);


<?php
require ($_SERVER ["DOCUMENT_ROOT"] . "/config/db_config.php");
$connection = @mysql_connect($db_host, $db_user, $db_password) or die ("MySQL-Fehler");
mysql_select_db($db_name, $connection);



$name = $_POST["txt_name"];
$len = strlen($name);

if ( $len>0)
{
$status = $_POST["txt_status"];
$vorname = $_POST["txt_vorname"];
$email = $_POST["txt_email"];
$datum = time();

$query ="UPDATE bestand SET status=$status, name=$name, vorname=$vorname, email=$email, akt_datum=$datum WHERE nr=$nr";
mysql_query($query, $connection) or die ("Übertragungsfehler");
}

?>

<html>
<head>
<title>Buch entleihen</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>



<?php

$nr = $_GET['nr'];

$query = "SELECT * FROM bestand WHERE nr='$nr' ";
$result = mysql_query($query, $connection);

$i = count($row[nr]);


$autor = mysql_result($result, $i, "autor" );
$titel = mysql_result($result, $i, "titel" );
$jahr = mysql_result($result, $i, "jahr" );
$sign = mysql_result($result, $i, "sign" );



echo '<table><tr class="Stil3"><td align="center" width="100">Nr #'.$nr.'</td><td width="400"> '.$autor.' ('.$jahr.'). <u>'.$titel.'</u>. Signatur: '.$sign.' </td></tr></table><br><br><br><br><br><br>';

echo'
<form action=" '.$_SERVER['PHP_SELF'].' " method="POST" >
<table class="Stil3" align="left" bgcolor="#CEB583" width="600">
<tr><th colspan=2>Buch verleihen an:</th></tr>
<tr><td>Name:</td><td><input type="text" name="txt_name" size="40"></td></tr>
<tr><td>Vorname:</td><td><input type="text" name="txt_vorname" size="40"></td></tr>
<tr><td>Email:</td><td><input type="text" name="txt_email" size="40"></td></tr>
<tr><td><input type="radio" checked="checked" readonly name="txt_status" size="40" value="verliehen">verliehen</td></tr>
<tr><td align="center"><input type="submit" value="Buch verleihen"></td></tr>
</table>
</form>';
?>

</body>
</html>


wenn ich nun oben genannte seite aufrufe und daten eintrage und absende kommt die fehlermeldung: "übertragungsfehler"

hab nun gesucht und gesucht, kann aber partout den fehler net ausfindig machen. könnt ihr mir nochmal helfen.

ich bitte euch, so nett auch alle ratschläge sind, einfach nur nach fehlern zu suchen und nicht sowas wie "lös das ganze doch so" oder sowas...

ich versuch erstma die ganze thematik im kleinen zu begreifen...;)

PatkIllA
2006-11-12, 20:45:12
Was willst du denn mit count erreichen. Tu dir den Gefallen und les dir mal eine halbe Stunde ein paar Grundgedanken zu relationalen Datenbanken. Da hast du auch in Zukunft was von und das wäre in der Summe schon beim ersten Mal schneller gewesen.

ZapBee
2006-11-12, 22:37:34
Tu dir den Gefallen und les dir mal eine halbe Stunde ein paar Grundgedanken zu relationalen Datenbanken. Da hast du auch in Zukunft was von und das wäre in der Summe schon beim ersten Mal schneller gewesen.
:up:

Tommes
2006-11-12, 23:54:56
count() liefer dir die Anzahl der Elemente eines Arrays zurück. $row[nr] ist kein Array, sondern (I guess) ein Integer Wert mit dem Primärschlüssel deiner Tabelle.

Flipper
2006-11-14, 02:34:49
Gib halt den SQL-String mal aus anstatt ihn auszuführen, und schau ob sich der in PHPMyAdmin ausführen lassen würde, sprich korrekt ist.

Wanginator
2006-11-15, 09:07:31
Einfachste Lösung ist doch die Ausgabe (View) von deiner Datenbank (Modell) zu trennen, was auch praktiziert werden sollte. EIne Lösung gabs doch schon weiter oben von Flipper, mittels mysql_fetch_array. Was willst du mit mysql_result und count?

Also Daten aus DB auslesen, dann ausgeben und bei der Ausgabe eine lokale Variable hochzählen. Damit ist die Ausgabevariable nicht konsistent mit dem PrimaryKey, aber das ist ja egal. In deinem Beispiel von 1. Post wäre dann nach Zeile 2 die Zeile 3, die aber auf Buchnr 4 referenziert.

Und ein Paar Grundgedanken zu relationalen Datenbanken wäre echt nicht schlecht. Für Bücher sollte einem gleich in Kopf kommen, keine generische id zu erstellen, sondern die isbn zu nehmen.