kostenloser Webspace werbefrei: lima-city


AI - nächste id?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Hi
    ich habe in meiner Tabelle wie man das ja so macht ein Feld 'id' als Primärschlüssel und eben mit der Eigenschaft AUTO_INCREMENT.
    Wenn ich jetzt etwas speicher, woher weiss ich dann unter welcher id das gespeichert ist?

    Ich könnte mir zB. die größte id ausgeben lassen und eins addieren. Bis ich jetzt aber gespeichert habe, hat ein anderer eventuell schon gespeichert, somit wäre meine ausgesuchte id schon nichtmehr die nächste stelle.

    Ich möchte das auch eigentlich gerne über die ID machen und nicht noch mit einer weteren spalte zb per zufallszahl oder sowas.

    Ich hoffe ihr wisst wie das geht,
    MFG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. http://www.perlunity.de/perl/forum/thread_013152.shtml
    http://www.phpforum.de/archiv_50077_autoincrement@ID@auslesen_anzeigen.html
  4. Um es kurz zu machen: Beim Insert keine ID angeben/einfügen. Das macht MySQL von selbst, denn dafür ist AUTO_INCREMENT da.
  5. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Danke :)
    Ich habe auch noch etwas gefunden:
    http://dev.mysql.com/doc/refman/5.1/de/show-table-status.html#
    allerdings klappt das bei mir nicht ganz.
    MFG

    @fabo
    Ich möchte ja nicht die id haben um dann nach dahin zu speichern, denn genau wie du gesagt hast dass macht AI ja bereits. Ich möchte nur im action des Formulars die id mitgeben unter der gespeichert wird um nach dem speichern direkt den neuen Beitrag anzeigen zu können.
  6. Soweit ich weiß geht das über
    SELECT LAST_INSERT_ID()


    So, wie es auch in einem der Links steht, die ich bereits gepostet habe...
    Wenn man das dann so macht:

    // Die Variable 'sqlRes' speichert die Verbindung zur Datenbank... Die sollte man immer mit angeben. :P
    // Ist aber nicht zwingend notwendig. Standardmäßig wird einfach die zuletzt verwendete Resource genutzt.
    [...]
    
    // Neuen Datensatz erstellen.
    mysql_query("INSERT INTO `tabellenname` (`spalte1`, `spalte2`, `spalte3`) VALUES ('Muha', 'Kuh', 'Milch')", $sqlRes);
    
    // Die letzte ID Abfragen
    $lastIDQ=mysql_query("SELECT LAST_INSERT_ID() AS `lastID`",$sqlRes);
    // Damit kann nu weitergearbeitet werden, die Schritte dürften dir bekannt sein ;)
    [...]


    Und ja.. das funktioniert, weil die Funktion LAST_INSERT_ID() auf die mit $sqlRes verknüpfte Datenbankverbindung zugreift und deshalb geährleistet ist, dass dazwischen noch nichts gekommen ist. Es sei denn PHP unterstützt seit neustem parallele Programmierung..wäre mir aber neu. oO


    Ich lasse mich aber gerne von etwas besserem Belehren, aber eigentlich... Müsste das so... eigentlich funktionieren...
  7. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Ja das klappt, aber das ist nicht ganz was ich brauche.
    Ich erkläre nochmal schnell meine Situation:

    Der Benutzer ist auf einer seite.
    Als Get parameter hat er jetzt die id eines beitrages der dann eingezeigt wird.
    Falls der Parameter Leer ist, so wird ihm ein Formular zum schreiben eines neuen Beitrages gezeigt.
    im action dieses forms möchte ich nun eben als get parameter die id angeben unter der der gerade verfasste Beitrag gespeichert wure,
    sodass man, wenn man das formular absendet nicht den Beitrag speichert und wieder ein leeres Formular vor sich hat sondern dann seinen eben geschriebenen Beitrag sieht.

    Also ungefähr so:
    <?php
       if(!empty($_POST[...]){
          -> speichern
       }
    
    
       $id = $_GET['id'];
       if(!empty($id)){
          -> beitrag laden
       }else{
          -> neuen Beitrag 
       }
    
    
    ?>
    
    
    <?php $last_id = [letzte id aus der Datenbank]; ?>
    <form action="?id=<?php echo $last_id; ?>" method="Get" name="formxyz" >
     [.. inputfelder & co..]
    </form>


    Ich hoffe das kann man so besser verstehen.
    MFG

    edit: Codeblock


    Beitrag zuletzt geändert: 27.3.2011 16:56:35 von programtools
  8. Naja warum du dir dein Leben so schwer machst.
    Verweise doch einfach nachdem du den Beitrag gespeichert hast auf die Seite mit der ID die er bekommen hat, denn ansonsten gibts ein schlimmes Unglück sollte jemand auf die Seite gehen um einen Beitrag zu schreiben während ein anderer da grade auch einen Beitrag schreibt und den noch nicht abgesendet hat. Dann wollen letztlich beide auf dieselbe ID schreiben.
    Mach es lieber mit adrians Methode.

    if(!empty($_POST[...]){
    -> speichern
    $last=mysql_query("SELECT LAST_INSERT_ID() AS `lastID`",$sqlRes);
    header( 'Location:bla.php?id=' . $last )
    }


    PS.: Benutze mal einen code Block ansosnten sieht der Quelltext einfach nur doof aus.

    Beitrag zuletzt geändert: 27.3.2011 14:34:28 von reimann
  9. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    ja vielen Dank erstmal
    also ich weiss nicht ob ich das amchen kann wenn ich vorher schon Ausgaben habe ?!
    Weil ich dachte eig header müsste vor jeder Ausgabe stehen und ich hab zwingend davor schon Ausgaben, was ich auch nicht ändern kann.

    Und Codeblock benutz ich auch eigentlich nur halt habe ich das einfach so schnell getippt und nicht ausm editor kopiert und dann nicht drangedacht :D

    MFG
  10. header funktioniert direkt nicht, wenn schon ein output da war...

    Abhilfe schafft das buffern... php.net und ob_start hilft weiter.


    Ansonsten hilft auch ein Meta-Tag...
  11. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Aber Leute, ich brauche doch einfach nur die aktuelle id.
    MySQL muss doch auch irgendwoher wissen, was der nächste AI wert ist und ich muss da doch drankommen oder?
    Weil davon müsste ich dann nur eins abziehen.
    Das Wäre dann die Möglichkeit per show table status, wovon ich aber leider 0 plan habe und auch nichts finden kann.
    Vielen Dank & MFG
  12. t*****b

    Wie bereits gepostet, kriegst du die letzte ID über LAST_INSERT_ID() heraus und die stimmt auch immer hundertprozentig, auch wenn das gleiche Script dazwischen nochmal aufgerufen wird, da es auf die Instanz bezogen ist und nicht der letzte globale Query. Voraussetzung hierfür ist jedoch, dass du das im gleichen Script aufrusft, also in der gleichen Datei wo du auch den Insert machst. Dann funktioniert das ganze. Dann kannst du auch über header("Location: seite.php?id=".$letzte-id); den Beitrag aufrufen. Auch garkein Problem, wenn die Logik vor der Ausgabe stattfindet, also vor header() nichts mehr steht. Wenn du das nicht hinkriegst, solltest du erstmal weiter PHP lernen, bevor du versuchst dir ein Forum so hinzufrickeln, wie man normalerweise nicht programmiert.
  13. Und ich habe schon gesagt, dass es Blödsinn allererster Güte ist die ID eines Beitrages ermitteln zu wollen ehe er abgespeichert wurde. Dann können IDs nämlich mehrfach verwendet werden, wenn zwei gleichzeitig schreiben und das führt dazu, dass nach dem schreiben der falsche Beitrag angezeigt wird. Generell solltest du dein ganzes Vorgehen überdenken. Eine Ausgabe in der Datei in der Datenbankmanipulationen stattfinden ist gelinde gesagt unüblich, denn der Code wird unübersichtlich und schlecht wartbar.
  14. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    @trueweb
    Also ich kann php und es macht auch alles Sinn, nur ist es schwierig das hier zu zeigen, da es im wahrsten Sinne des Wortes aus dem Zusammenhang des ganzen Scriptes gerissen ist. Die ganze Geschichte soll bzw muss in einer Datei ablaufen. Also anschauen, schreiben, editieren, speichern & co alles in einer Datei. Und die Datei muss mitten in einer anderen Datei liegen. Daher ist es logisch, das die andere Datei bereits ausgaben hatte (somit fällt eine Umleitung per header weg). Und die nächste ID mit LAST_INSERT_ID() auszulesen geht doch auch nur, wenn ich vorher einen neuen Eintrag gemacht habe. Das ist aber nicht der Fall. Der Eintrag kann auch vor Jahren gemacht worden sein.

    @reimann
    Ja ich weiss, aber ich möchte, was ich schon deutlich sagte nicht nach der id speichern.
    Und selbst wenn habe ich das schon sichergestellt, dass nicht 2 leute gleichzeitig auf die gleiche ausgelesene Id speichern.

    Da es mir anscheinend weder gelingt mein Problem richtig und verständlich darzustellen & euch dementsprechend auch nicht mir zu helfen, habe ich mir einen anderen Ansatz überlegt.

    Wäre allerdings dennoch schön, wenn jemand etwas dazu wüsste.
    MFG

    Beitrag zuletzt geändert: 28.3.2011 14:24:06 von programtools
  15. t*****b

    Ist doch kein Problem:

    if(eine ID per GET übergeben) { 
     Beitrag anzeigen
    } elseif (wenn post-formular abgesendet) {
     Beitrag speichern und umleiten mit entsprechendem GET-Parameter und LAST_INSERT_ID
     Hier kannst du auch auf die Header-Weiterleitung verzichten und einen Link 
     im Sinne von "Klicken Sie <a href="meinforum.php?id=letzte_id">hier</a>" um deinen
     Beitrag anzuzeigen
    } else {
     Formular für neuen Beitrag anzeigen, da weder Formular abgesendet noch Beitrag anzeigen
    }


    Wo hast du jetzt dein Problem? Wir möchten dich natürlich nicht anfahren sondern dir weiter helfen ;) Das geht natürlich nur, wenn du uns jetzt sagst wie du es machen möchtest? Bzw. warum nicht so?

    Beitrag zuletzt geändert: 28.3.2011 15:09:36 von trueweb
  16. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    :D danke, ich meinte das auch nicht böse :)
    Genau so, bloß in um einiges größerem Umfang habe ich ja alles. das klappt auch.
    Nochmal die Prozedur:

    url: ?id=neu&action=nothing

    Keine Id als Parameter -> beitrag erstellen anzeigen
    in diesem form als action auf die gleiche Seite, allerdings mit der nächst verfügbaren Id, unter der ja gespeichert wird.

    action="?id= _next AI id_ &action=post"

    Dan beim senden wird nun, da der parameter action = Post ist, gespeichert, aber unabhängig gegenüber der übergebenen ID.

    Die ID dient nur dazu, das im weiteren Verlauf nichtmehr das Formular (id=new) sondern der beitrag mit der id xyz, (id=xyz) angezeigt wird.

    MFG
  17. Dann... speicher doch einfach und leite dann zum per get übertragenen Beitrag weiter?

    Wenn es absolut keine Rolle beim speichern spielt, welche ID übergeben wurde, und du die ID des Beitrags, der gezeigt werden soll, schon hast...
    Meine Güte. Ich werd aus dir nicht schlau.



    Edit:
    @ Hemiolis:
    Ist ja nicht so, dass ich das nicht schon vorgeschlagen hätte. In einem Link den du in dem zweiten Post dieses Threads finden wirst bspw steht sogar eben diese Funktion mit Erklärung.

    Beitrag zuletzt geändert: 28.3.2011 21:39:04 von adrians
  18. hi
    eifach zu viel gewäsch ;o)

    zitat von dev.mysql.com:
    For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client.
    auf der zunge zergehen lassen: ID is maintained in the server on a per-connection basis. It is not changed by another client


    daraus folgt also (schematisch dargestellt!):
    INSERT ... blaa;
    $myID = SELECT LAST_INSERT_ID();
    innerhalb der selbnen konnektion hinterher. das ergibt auf alle fälle dein ID! nachher kannst du allerdings nicht nochmal INSERT machen, du musst mit der selben ID UPDATEn.

    lg
  19. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!