PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rausfinden der nächsten ID über PHP



K0rnbr0t
18-09-2006, 18:22
Hi leute,

Ich will gerne ein Newsscript schreiben , hab aber ein Problem!

Und zwar Folgendes :

Ich würde gerne die nächste ID raus finden , die Mysql macht. Weil meine MYSQL Tabelle so aussieht

CREATE TABLE News (
Author TEXT,
Inhalt TEXT,
Datum DATETIME,
Titel TEXT,
ID INT AUTO_INCREMENT PRIMARY KEY
)

Ich muss dies Rausfinden weil ich diese ID für tabelle news_comment_<ID>

WIe mach cih das?

cplinux
18-09-2006, 19:54
$result=mysql_query("SELECT (max(ID)+1) as maxid FROM news");
$row=mysql_fetch_array($result);
echo $row["maxid"];

Viele Wege führen nach Rom, so z.B. auch:
$result=mysql_query("SELECT ID FROM as maxid news ORDER BY ID DESC LIMIT 1");

Man kann aus ID auch ein auto_increment-Feld machen. Dann muß man die ID gar nicht angeben.

Gruß
cplinux

K0rnbr0t
19-09-2006, 16:22
Hi , habs mal ausgeprobt und da hab ich irgendwie noch fehler :

Weg 1 :


$sql_comment_id = " SELECT(max(ID)+1) as maxid FROM News";
$result_comment_id = mysql_query("SELECT (max(ID)+1) as maxid FROM News") OR die(mysql_error());
$row = mysql_fetch_array($result_comment_id);




$sql_comment_table = " CREATE TABLE news_comment_".$row['ID']." (
Author TEXT,
Titel TEXT,
Inhalt TEXT,
comment_id INT AUTO_INCREMENT PRIMARY KEY
)";


Er meine dann folgendes :
Notice: Undefined index: ID in /var/www/htdocs/tost/save_news.php on line 14

Er erstellt dann tabelle : news_comment_

Wo mach ich was falsch ich seh da kein fehler ...

Peltfrog
19-09-2006, 16:55
Hallo,

ich würde das in eine andere Richtung aufziehen. Ich würde eine Tabelle für die Kommentare machen. In diese Tabelle kommen dann alle Kommentare rein zu jedem Beitrag. Zu jedem Datensatz dann die ID des entsprechenden Beitrages speichern und dass war es schon.

Der Vorteil: Du hast kein Problem damit die letzte (oder nächste) ID herrauszubekommen, da Du es einfach nicht brauchst.

Bekommt denn deine Tabelle die Du erstellen willst wirklich die nächste folgende ID? Oder die ID von der zuletzt eingefügten 'News' Zeile? Wenn es die ID der letzten eingetragenen News-Zeile ist mache doch folgendes nach dem Insert der News-Zeile:


$last_inserted_id = mysql_insert_id();


Das sollte es schon gewesen sein. Mein Ansatz wäre jedoch (wie oben geschildert) - sämtliche Kommentare in eine einzige Tabelle zu schreiben und über die ID des News-Beitrages zu 'verlinken'.

Viele Grüße
Alexander

K0rnbr0t
19-09-2006, 18:32
Mein System ist folgender massen aufgebau :

Wenn ich ein Newsbeitrag schreib , brauch ich ja nur eine Zeile für den Beitrag. Will ich aber Comments machen , brauch ich eine neue Tabelle , weil ich grad nicht wüsste wie man in einer Spalte mehrere Mehrere Kommentare lagern kann.
Daher will ich das so machen , dass wenn ich ein neuen Beitrag schreibe er dann die ID übernimmt die kommt. So kann ich dann besser die kommentare finde.

€: Ich werde dein vorschlag ausproben. Ich würde aber gerne mein system benutzen. Wenn es kein anderen ausweg gibt mus ich es wohl aufgeben ;)

cplinux
19-09-2006, 20:25
ID ist kein guter Name für eine Spalte.
Es muß statt $row['ID'] heißen: $row['maxid'], wie in dem SQL angegeben. Dann gehts.

Pingu
20-09-2006, 05:41
$result=mysql_query("SELECT (max(ID)+1) as maxid FROM news");
$row=mysql_fetch_array($result);
echo $row["maxid"];

Das wird nur vorübergehend funktionieren. Nach einiger Zeit, wenn dann die Fehler auftreten weiss man nicht mehr was man damit gewollt hat. Denn wie heisst es so schön:
Beachten Sie, dass in diesem Fall (wenn die AUTO_INCREMENT-Spalte Teil eines mehrspaltigen Index ist) AUTO_INCREMENT-Werte neu verwendet werden, wenn Sie den Datensatz mit dem höchsten AUTO_INCREMENT-Wert in einer beliebigen Gruppe löschen. Dies gilt auch für MyISAM-Tabellen, bei denen AUTO_INCREMENT-Werte normalerweise nicht wiederverwendet werden.

Ansonsten gibt es zu Thema sogar ein ganzes Kapitel in der Dokumentation: http://dev.mysql.com/doc/refman/5.1/de/example-auto-increment.html

Pingu

K0rnbr0t
20-09-2006, 05:45
Uuuhhhh..... "as maxid" .... sorry hab nicht genau gelesn *schäm*

K0rnbr0t
20-09-2006, 05:55
Hmmmm..... ich wollte es mal mit


$id = mysql_insert_id();

ausproben. Es funktioniert auch er erstellt eine tabelle namens news_comment_0.

Ich hab nur noch ein paar fehler weil er es nicht abspeichern will :(

Peltfrog
20-09-2006, 13:33
Hallo :)

ich muss zugeben, dass ich noch nicht ganz verstanden habe warum Du das so machen möchtest. So wie ich das Verstehe hast Du eine Tabelle in die Du Neuigkeiten schreibst. Ausserdem möchtest Du es den Leuten ermöglichen Kommentare zu diesen Neuigkeiten zu hinterlegen. Warum willst Du dann für jede 'Kommentarsammlung' zu einer Neuigkeit eine eigene Tabelle machen? Eine einzige Tabelle reicht vollkommen.

Tabelle News:


CREATE TABLE News (
Author TEXT,
Inhalt TEXT,
Datum DATETIME,
Titel TEXT,
ID INT AUTO_INCREMENT PRIMARY KEY
)


Bsp. Tabelle für Kommentare:


CREATE TABLE news_comment (
Author TEXT,
Titel TEXT,
Inhalt TEXT,
news_id INT,
comment_id INT AUTO_INCREMENT PRIMARY KEY
)


Die Zuordnung erfolgt über das Feld news_id. Es ist vollkommen egal, ob ein Kommentar nun zur Neuigkeit 1 oder 500 eingetragen wird. Er kommt mit in diese Kommentar-Tabelle rein. Das ganze ist denke ich anderst auch nicht machbar. Stell Dir mal vor Du hast irgendwann wirklich Deine 1000 Einträge. Dann hättest Du ja mindestens 1001 Tabellen in Deiner Datenbank. Da würde ich mich nicht mehr zurecht finden (wollen).

mysql_insert_id() (http://de2.php.net/mysql_insert_id) liefert die zuletzt eingetragene ID zurück. Also führe es am besten direkt nach dem Insert Befehl aus. Ich würde auch den Autoincrement Wert erhöhen (zumindest zum Testen), damit Du sicher gehst, dass $id auch den richtigen Wert hat und nicht durch Zufall 0 anzeigt, weil die Variable nicht gefüllt ist.

So, nachdem Du nun geduldig meinen Gehirnwäschenachricht gelesenhast zu Deiner eigentlichen Frage ;-). Was genau speichert 'er' denn nicht ab?

Viele Grüße

K0rnbr0t
20-09-2006, 14:13
Wenn ich versuche das datum mit reinzutun (mit time()) dann kommt das hier :


Column count doesn't match value count at row 1

Peltfrog
20-09-2006, 14:19
Kannst Du einen kompletten Insert String als Beispiel zeigen?

K0rnbr0t
20-09-2006, 15:05
$sql = " INSERT INTO News
(Titel, Datum, Author, Inhalt)
VALUES
(".$_POST['titel'].", ".time().", ".$_COOKIE['username'].", ".$_POST['inhalt'].")";

Peltfrog
20-09-2006, 15:25
Probier es mal mit:




$sql = "INSERT INTO News
(Titel, Datum, Author, Inhalt)
VALUES
(".$_POST['titel'].", NOW(), ".$_COOKIE['username'].", ".$_POST['inhalt'].")";


NOW() ist in diesem Fall bestandteil von Mysql und verwendet das aktuelle Serverdatum. Also auch ohne den " angeben.

K0rnbr0t
20-09-2006, 19:11
Komisch ... jetzt kommt :


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'forz, asdasd)' at line 4

nul
20-09-2006, 20:41
Hm, ich wuerde mal versuchen die Werte zu quoten, wo es noetig ist.

Peltfrog
21-09-2006, 10:51
Hm, ich wuerde mal versuchen die Werte zu quoten, wo es noetig ist.

Verdammt! Wie peinlich. Habe ich komplett übersehen.

OpOs
22-09-2006, 12:09
ausserdem solltest du dir die funktion addslashes() (oder so aehnlich) angucken, sonst hilft dir das quoten gar nix, wenn mal jemand ein " oder ' in seinem beitrag stehen hat.

siehe auch SQL-Injection (http://de.wikipedia.org/wiki/SQL-Injection)

PS: die idee, fuer jeden neuen beitrag eine neue kommentartabelle anzulegen, ist, gelinde gesagt, ... aehm... schlecht. und sie steht im widerspruch zum relationalen datenmodell. wenn du z.b. einmal wissen willst, wieviel kommentare insgesamt abgegeben wurden, musst du jede einzelne tabelle abfragen. wenn du glueck hast, bremmst du dann nur deinen server aus, wenn du pech hast, passieren dinge, die ich mir nicht mal vorstellen moechte...
schreib lieber in die kommentar tabelle 'nen eintrag zu welchem newsbeitrag ein kommentar gehoeren soll. iss performanter, sicherer, einfacher, uebersichtlicher..........

cplinux
22-09-2006, 22:01
PS: die idee, fuer jeden neuen beitrag eine neue kommentartabelle anzulegen, ist, gelinde gesagt, ... aehm... schlecht. und sie steht im widerspruch zum relationalen datenmodell. wenn du z.b. einmal wissen willst, wieviel kommentare insgesamt abgegeben wurden, musst du jede einzelne tabelle abfragen. wenn du glueck hast, bremmst du dann nur deinen server aus, wenn du pech hast, passieren dinge, die ich mir nicht mal vorstellen moechte...
schreib lieber in die kommentar tabelle 'nen eintrag zu welchem newsbeitrag ein kommentar gehoeren soll. iss performanter, sicherer, einfacher, uebersichtlicher..........

Das finde ich allerdings auch.
Probier es mal mit

CREATE TABLE `news` (
`user_id` INT( 8 ) NOT NULL ,
`news_id` INT( 8 ) NOT NULL ,
`author` VARCHAR( 100 ) NOT NULL ,
`entry` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`news_text` TEXT NOT NULL ,
PRIMARY KEY ( `user_id` , `news_id` )
) TYPE = MYISAM ;

Mit dem kombinierten Schlüssel gibt es für jeden Benutzer eine Nachricht mit der ID 1, 2, u.s.w.
Bsp.:
mysql_query("INSERT INTO news (user_id, news_id, author, news_text) VALUES (1, 1, "ich", "Das ist mein Text");
mysql_query("INSERT INTO news (user_id, news_id, author, news_text) VALUES (1, 2, "ich2", "Das ist mein Text2");
mysql_query("INSERT INTO news (user_id, news_id, author, news_text) VALUES (2, 1, "ich3", "Das ist mein Text3");
.....

@Pingu
Ich kenne die Vor-und Nachteile von AutoIncrement-Feldern. In Verbindung mit max würde ich aus dem AutoIncrement-Feld auch ein normales int-Feld machen. War auch nur einer von mehreren Lösungswegen. :)

K0rnbr0t
23-09-2006, 11:16
:eek: .......... also ich versteh das net. Erklärt es mir bitte nicht im Fach chinesisch :P etwas einfacher^^

Ich hätte noch ein Problem. Wenn ich was eintragen will kommt folgendes :


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'der Titel, NOW(), der forz, Das is der Inhalt)' at line 4


Mein Code :


$sql = " INSERT INTO News
(Titel, Datum, Author, Inhalt)
VALUES
(".$_POST['titel'].", NOW(), ".$_COOKIE['username'].", ".$_POST['inhalt'].")";


Für mich sieht alles richtig aus :( heeellllpppp:(

€:
wenn du glueck hast, bremmst du dann nur deinen server aus, wenn du pech hast, passieren dinge, die ich mir nicht mal vorstellen moechte...

Was würde dann passieren?!? *angst hab*

Peltfrog
23-09-2006, 12:06
Dir Fehlen noch die Quotes (Anführungszeichen, Gänsefüsschen, etc) um die Variablen Werte in Deinem SQL Query String.

z.B.:


('".$_POST['titel']."', NOW(), '".$_COOKIE['username']."',


Strings müssen innerhalb von Quotes stehen :) und um das mit den addslashes zu Zeigen:


('".addslashes($_POST['titel'])."', NOW(), '".addslashes($_COOKIE['username'])."',


dann musst Du beim ausgeben der Daten jedoch ein stripslashes() machen.

Viele Grüße

K0rnbr0t
23-09-2006, 18:13
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'forz, //$_COOKIE['username']=der forz
dfsdf)' at line 4

Pingu
23-09-2006, 23:07
Ich gebe Dir mal einen kleinen Hinweis:

Wenn eine MySQL-Fehlermeldung kommt, dann gibt diese immer an wo der Fehler verursacht wurde. Wenn Du nicht weisst, was der wirkliche Grund ist, dann musst Dir die Befehle, wie sie an die Datenbank gesendet werden, gnauso anzeigen lassen. Denn nur dann kann man erkennen, wie die Befehle aussehen und wie sie aussehen müssten. Wie Du sicherlich weisst, gibt es dafür verschiedene Möglichkeiten; die Klassiker sind "echo", "print" "printf". Das ganze nennt man "debuggen".

K0rnbr0t
24-09-2006, 17:40
Ahhhhh ok habs rausgefunden . Hätten da noch ein problem. WIe kann ich einen eintrag über die ID auswählen???

Pingu
24-09-2006, 18:08
Vielleicht solltest Du ersteinmal ein kleines Handbuch durcharbeiten bevor Du weiter machst. Zum Beispiel gibt es hier ein kleines: http://little-idiot.de/mysql/