kostenloser Webspace werbefrei: lima-city


Mysql auto increment id weiterverwenden

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    Hallo,
    ich habe 2 Tabellen in meiner Datenbank erstellt und füge in der ersten einen Datensatz ein. Dem wird automatisch eine ID vergeben. Jetzt will ich in der zweiten Tabelle auf diese ID verlinken, damit ich weiss, dass diese Datensätze zusammen gehören. Nur muss ich dazu die ID wissen, die vergeben wurde. Ich habe gegoogelt und eine Funktion gefunden (mysql_insert_id), mit der das möglich sein soll, aber wollte bei mir nicht funktionieren und das echo hat einfach nichts ausgegeben.

    Hat da jemand eine andere Möglichkeit, oder weiss, an was es liegen hätte können?

    Gruss Pencn
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. Die erste Frage die sich mir stellt ist, ob du nur eine Zeile oder gleich ganz viele einfügst.
    Bei nur einer Zeile könntest du auf dem schnellen Weg einfach ein
    SELECT MAX(ID) FROM TABELLE

    benutzen ... wobei das eine typische 80/20 Lösung ist, da du dir nie 100% sicher sein kannst ob MySQL wirklich hoch gezählt oder nur irgendeine freie ID genommen hat.
    Der sichere Weg wäre die LAST_INSERT_ID() Funktion.

    http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

    INSERT INTO foo (auto,text)
        VALUES(NULL,'text');         # generate ID by inserting NULL
    INSERT INTO foo2 (id,text)
        VALUES(LAST_INSERT_ID(),'text');  # use ID in second table


    Habe grad kein System zum ausprobieren.
  4. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    augur schrieb:
    Die erste Frage die sich mir stellt ist, ob du nur eine Zeile oder gleich ganz viele einfügst.
    Bei nur einer Zeile könntest du auf dem schnellen Weg einfach ein
    SELECT MAX(ID) FROM TABELLE

    benutzen ... wobei das eine typische 80/20 Lösung ist, da du dir nie 100% sicher sein kannst ob MySQL wirklich hoch gezählt oder nur irgendeine freie ID genommen hat.
    Der sichere Weg wäre die LAST_INSERT_ID() Funktion.

    http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

    INSERT INTO foo (auto,text)
        VALUES(NULL,'text');         # generate ID by inserting NULL
    INSERT INTO foo2 (id,text)
        VALUES(LAST_INSERT_ID(),'text');  # use ID in second table


    Habe grad kein System zum ausprobieren.


    Habe ich so versucht, aber trägt mir garnichts ein. Also überhaupt kein Eintrag.

    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    //Wird eingetragen
    
    mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES (SELECT LAST_INSERT_ID(), '".$_POST['options']."')");
    
    //Garkein Eintrag
    
    mysqli_close($con);
    ?>


    Beitrag zuletzt geändert: 5.1.2014 21:10:01 von c143
  5. So sollte es klappen:

    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    //Wird eingetragen
    $id=mysql_insert_id();
    mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES ('".$id."', '".$_POST['options']."')");
    
    //Garkein Eintrag
    
    mysqli_close($con);
    ?>
  6. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    So sollte es klappen:

    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    //Wird eingetragen
    $id=mysql_insert_id();
    mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES ('".$id."', '".$_POST['options']."')");
    
    //Garkein Eintrag
    
    mysqli_close($con);
    ?>


    Wieder kein Eintrag in der zweiten Tabelle. Habe nochmal die Namen aller Tabellen und Spalten überprüft und stimmt alles.
  7. Ja logisch, hatte vergessen, dass du mysqli nutzt.


    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    //Wird eingetragen
    $id=mysqli_insert_id($link);
    mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES ('".$id."', '".$_POST['options']."')");
    
    //Garkein Eintrag
    
    mysqli_close($con);
    ?>
  8. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Ja logisch, hatte vergessen, dass du mysqli nutzt.


    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    //Wird eingetragen
    $id=mysqli_insert_id($link);
    mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES ('".$id."', '".$_POST['options']."')");
    
    //Garkein Eintrag
    
    mysqli_close($con);
    ?>


    Ich bin jetzt mal davon ausgegangen, dass deine Variable $link bei mir $con sein soll. Habs auf beide Varianten versucht, aber wieder nichts. Ausserdem hab ichs mal mit einem echo $id; versucht, da wird mir wenigstens die richtige ID ausgegeben. Also funktioniert das, was ich hier eigentlich wissen wollte, nur scheint mein query nicht zu funktionieren. Ich habs dann mit normalen strings anstatt Variabeln versucht:

    mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES ('test', 'test')");


    Aber wieder kein Eintrag.
  9. Dann lass dir doch mal den Fehler anzeigen:

    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    //Wird eingetragen
    $id=mysqli_insert_id($con);
    if(!mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES ('".$id."', '".$_POST['options']."')")) echo mysqli_error ($con);
    
    //Garkein Eintrag
    
    mysqli_close($con);
    ?>
  10. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Dann lass dir doch mal den Fehler anzeigen:

    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    //Wird eingetragen
    $id=mysqli_insert_id($con);
    if(!mysqli_query($con,"INSERT INTO options (poll_ID, option)
    VALUES ('".$id."', '".$_POST['options']."')")) echo mysqli_error ($con);
    
    //Garkein Eintrag
    
    mysqli_close($con);
    ?>


    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 'option)
    VALUES ('30', '23')'


    Ich hab dann versucht den oberen query zu kopieren und die Dinge anzupassen, da es ja ein Syntax Error ist, aber auch dann tut sich nichts. Ich weiss echt nicht, wo da ein Fehler sein soll.
  11. c143 schrieb:
    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 'option)
    VALUES ('30', '23')'
    Ich hab dann versucht den oberen query zu kopieren und die Dinge anzupassen, da es ja ein Syntax Error ist, aber auch dann tut sich nichts. Ich weiss echt nicht, wo da ein Fehler sein soll.
    wie in den code fehler sich reinschlich, kann man nicht sagen, weil du ja den von all-in1 modifiziert hast. der war fehlerfrei.
    was ich allerdings vermute, - du suggerierst ja, dass du numerische werte in die db schreiben willst - dass du eigentlich schreiben solltest:
    mysqli_query(
    	$con,
    	"INSERT INTO options (poll_ID, option)
    	 VALUES ($id, {$_POST['options']})"
    );
    weil du für numerische werte keine einfache aufführungszeichen (') brauchst.
    wenn das noch immer nicht ist, dann musst du leider etwas mehr code herzeigen ;)
  12. Das Feld poll_ID hat ja wohl in der DB hoffentlich kein auto_increment?

    Denn dann könntest du dort auch nichts rein schreiben.
  13. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Das Feld poll_ID hat ja wohl in der DB hoffentlich kein auto_increment?

    Denn dann könntest du dort auch nichts rein schreiben.


    Nein. Ich habe eine ID mit auto_increment, die Poll_ID und die option. Das sollte alles passen.
  14. Wenn ich nach deiner Fehlermeldung gehe
    VALUES ('30', '23')'
    Dann hast du hinter der Klammer von den Values ein einfaches Anführungszeichen, das dort nicht hingehört, dort müsste nur ein doppeltes sein.
  15. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    czibere schrieb:
    c143 schrieb:
    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 'option)
    VALUES ('30', '23')'
    Ich hab dann versucht den oberen query zu kopieren und die Dinge anzupassen, da es ja ein Syntax Error ist, aber auch dann tut sich nichts. Ich weiss echt nicht, wo da ein Fehler sein soll.
    wie in den code fehler sich reinschlich, kann man nicht sagen, weil du ja den von all-in1 modifiziert hast. der war fehlerfrei.
    was ich allerdings vermute, - du suggerierst ja, dass du numerische werte in die db schreiben willst - dass du eigentlich schreiben solltest:
    mysqli_query(
    	$con,
    	"INSERT INTO options (poll_ID, option)
    	 VALUES ($id, {$_POST['options']})"
    );
    weil du für numerische werte keine einfache aufführungszeichen (') brauchst.
    wenn das noch immer nicht ist, dann musst du leider etwas mehr code herzeigen ;)


    Sry, deine Antwort hab ich noch garnicht gesehen. Die ID ist int, da hab ich sie jetzt entfernt, das andere ist Varchar, da hab ich sie gelassen. Trotzdem wird immernoch nichts eingefügt. Und ich kann nicht mehr herzeigen, das ist das einzige an PHP, dass ich habe. Wird per Ajax aufgerufen, das funktioniert auch und die Variabeln werden auch übergeben, das habe ich auch überprüft.

    all-in1 schrieb:
    Wenn ich nach deiner Fehlermeldung gehe
    VALUES ('30', '23')'
    Dann hast du hinter der Klammer von den Values ein einfaches Anführungszeichen, das dort nicht hingehört, dort müsste nur ein doppeltes sein.


    Wie schon oben erwähnt, ich habs mal ausprobiert, aber es kommt immernoch die gleiche Fehlermeldung und ist jetzt
    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 'option)
    VALUES (32, ' option1 option2 option3')'


    Also die 32 ist einfach die letzte ID und das zweite sind einfach Strings die nacheinander mit einem Abstand geschrieben sind. Könnte es daran liegen, dass da vor option1 ein Leerschlag ist?
  16. ich glaube wir brauchen da mal etwas mehr Code von dir.
  17. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    ich glaube wir brauchen da mal etwas mehr Code von dir.


    Wie gesagt, das ist alles an PHP, dass ich habe. Aber du kannst dir gern die ganze Seite anschauen: http://c143.lima-city.de/polls

    Wenn der Submit button gedrückt wird, wird der titel in die Tabelle 'poll_question' eingetragen und die IP. Und die untern Optionen in 'poll_options' (Ja, das hat sich geändert, war vorhin nur options, ist aber auch im PHP Code angepasst)

    Also HTML und JS kannst du ja jetzt nachschauen und PHP schaut momentan so aus:

    <?php
    $con = mysqli_connect("mysql.lima-city.de","","","");
    
    mysqli_query($con,"INSERT INTO poll_question (titel, IP)
    VALUES ('".$_POST['titel']."', '".$_SERVER['REMOTE_ADDR']."')");
    
    $id=mysqli_insert_id($con);
    
    if(!mysqli_query($con,"INSERT INTO poll_options (poll_ID, option)
    VALUES (".$id.", '".$_POST['options']."')")) echo mysqli_error ($con);
    
    echo $id.$_POST['options'];
    
    mysqli_close($con);
    
    ?>


    Hier Fotos von den zwei Tabellen Strukturen:
    http://goo.gl/1OLT7d
    http://goo.gl/aeXxRP

    Beitrag zuletzt geändert: 6.1.2014 16:16:39 von c143
  18. Du wirst wahrscheinlich mit VARCHAR nicht ganz auskommen. Solltest dort besser TEXT nehmen. Also das option

    Es ist möglich, dass das Leerzeichen das Problem ist.

    Und validiere mal deine Eingaben.
  19. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    all-in1 schrieb:
    Du wirst wahrscheinlich mit VARCHAR nicht ganz auskommen. Solltest dort besser TEXT nehmen. Also das option

    Es ist möglich, dass das Leerzeichen das Problem ist.

    Und validiere mal deine Eingaben.


    Varchar wird schon passen, später bekommt jede option einen eigenen Eintrag. Aber ich dachte solang ich nicht mal einen einzigen eintragen kann muss ich das garnicht erst probieren.

    Wegen dem Leerzeichen hab ichs mal versucht das zu ersetzen oder die ganze Variable mit einem einfachen string 'test' zu ersetzen. Auch da gibt es keinen eintrag.

    Ist validieren mit der funktion trim? Hab ich auch davor gesetzt.


    Also wie gesagt, eigentlich bekommt dann jede option einen Eintrag in die Tabelle, darum wird mir Varchar reichen.
  20. also ok!

    ich habe den code von hier angesehen und folgendes dabei gefunden:
    1. remote_addr als text zu speichern ist sehr ungünstig. sollte dir einmal einfallen, die spalte mal zu sortieren, wird nicht richtig klappen! um das zu beschönigen, gibt es die mysql funktionen INET_ATON() und INET_NTOA(). dazu musst du aber die spalte als int deklarieren (siehe source unten).
    2. wegen mysqli_insert_id() musst du unbedingt bei php.net die anmerkung lesen. zusätzlich auch über die mysql funktion LAST_INSERT_ID() in irgendeinem mysql tut.
    3. die zweite query hat tatsächlich einen fehler (auf den ersten blick habe auch selbst übersehen)! die spaltenname option ist bei mysql ein reservirtes wort!! also gehört zwischen backticks: `option`.

    sources:
    mysql-create + queries (engine, charset u. collation ist deine sache || drops und selects waren eig. für mich gedacht)
    DROP TABLE IF EXISTS poll_question;
    CREATE TABLE poll_question (
      ID int(12) unsigned NOT NULL AUTO_INCREMENT,
      titel varchar(50) NOT NULL,
      IP varchar(10) NOT NULL,
      PRIMARY KEY (ID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    SELECT ID, titel, IP, INET_NTOA(IP) IP
      FROM poll_question
      ORDER BY IP;
    
    
    
    DROP TABLE IF EXISTS `poll_options`;
    CREATE TABLE poll_options (
      ID int(12) unsigned NOT NULL AUTO_INCREMENT,
      poll_ID int(12) unsigned NOT NULL,
      `option` varchar(30) NOT NULL,
      PRIMARY KEY (ID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    SELECT *
      FROM poll_options;
    in deinem create nimmst du hier für den selben wert einmal int(11) und dann int(12)!?

    php (mit eig. wenig änderungen. der letzte teil funktioniert bei lima nicht, du kannst es am localhost testen || die auskommentierten exits in line 17 u. 26 zeigen nur die query [wenn was nicht klappt])
    <?php
    error_reporting(E_ALL | E_STRICT);
    
    $link = mysqli_connect('mysql.lima-city.de', '', '', '');
    
    // ---- test data --------------------------------------------------------------
    $_POST['titel']         = 'testtitel 1';
    $_POST['options']       = 'testoption 1';
    $_SERVER['REMOTE_ADDR'] = '10.0.0.4';
    
    // ---- query 1 ----------------------------------------------------------------
    $q = <<< EOT
    INSERT
      INTO poll_question (titel, IP)
      VALUES ('{$_POST['titel']}', INET_ATON('{$_SERVER['REMOTE_ADDR']}'))
    EOT;
    #exit('<pre>'.$q);
    if(mysqli_query($link, $q)) { // query ist durch *******************************
      $id = mysqli_insert_id($link);
    // ---- query 2 ----------------------------------------------------------------
      $q = <<< EOT
    INSERT
      INTO poll_options (poll_ID, `option`)
      VALUES ($id, '{$_POST['options']}')
    EOT;
    #exit('<pre>'.$q);
      if(!mysqli_query($link, $q)) exit('' . $link->error);
    
    } else { // query ist NICHT durch **********************************************
      exit('' . $link->error);
    }
    
    // ---- gibt ergebnisse aus. (das hier geht auf lima leider nicht) -------------
    $command = 'mysql';
    $options = '-t -h localhost -u root -p************ -D cavies -e';
    $query   = 'SELECT ID, titel, IP, INET_NTOA(IP) IPADDR FROM poll_question ORDER BY IP;';
    echo "<pre><h4>$query</h4>" . `$command $options '$query' 2>&1`;
    $query   = 'SELECT * FROM poll_options;';
    echo "<h4>$query</h4>" . `$command $options '$query' 2>&1`;


    nach eingabe von paar unterschiedlichen ip werten, sieht das erg. in etwa so aus (die ip-s sind wie versprochen richtig sortiert - wenn man es halt haben will):
    SELECT ID, titel, IP, INET_NTOA(IP) IPADDR FROM poll_question ORDER BY IP;
    +----+-------------+-----------+----------+
    | ID | titel       | IP        | IPADDR   |
    +----+-------------+-----------+----------+
    |  4 | testtitel 4 | 167772162 | 10.0.0.2 |
    |  1 | testtitel 1 | 167772164 | 10.0.0.4 |
    |  3 | testtitel 3 | 167772418 | 10.0.1.2 |
    |  5 | testtitel 5 | 167772419 | 10.0.1.3 |
    |  2 | testtitel 2 | 167772420 | 10.0.1.4 |
    +----+-------------+-----------+----------+
    SELECT * FROM poll_options;
    +----+---------+--------------+
    | ID | poll_ID | option       |
    +----+---------+--------------+
    |  1 |       1 | testoption 1 |
    |  2 |       2 | testoption 2 |
    |  3 |       3 | testoption 3 |
    |  4 |       4 | testoption 4 |
    |  5 |       5 | testoption 5 |
    +----+---------+--------------+
    diese ausgabe kommt direkt vom php, ab der zeile 33 ist der code, was leider bei lima nicht funzt. teste am localhost.

    ich denke, das dürfte es jetzt sein ;)

    Beitrag zuletzt geändert: 7.1.2014 14:03:08 von czibere
  21. Autor dieses Themas

    c143

    c143 hat kostenlosen Webspace.

    czibere schrieb:
    also ok!

    ich habe den code von hier angesehen und folgendes dabei gefunden:
    1. remote_addr als text zu speichern ist sehr ungünstig. sollte dir einmal einfallen, die spalte mal zu sortieren, wird nicht richtig klappen! um das zu beschönigen, gibt es die mysql funktionen INET_ATON() und INET_NTOA(). dazu musst du aber die spalte als int deklarieren (siehe source unten).
    2. wegen mysqli_insert_id() musst du unbedingt bei php.net die anmerkung lesen. zusätzlich auch über die mysql funktion LAST_INSERT_ID() in irgendeinem mysql tut.
    3. die zweite query hat tatsächlich einen fehler (auf den ersten blick habe auch selbst übersehen)! die spaltenname option ist bei mysql ein reservirtes wort!! also gehört zwischen backticks: `option`.


    1. Danke, habe das angepasst!
    2. Meinst du 'Performing an INSERT or UPDATE statement using the LAST_INSERT_ID() function will also modify the value returned by the mysqli_insert_id() function'?
    3. Das war genau das Problem. So lange nach nem Fehler gesucht. :D Vielen vielen Dank! Und auch danke all-in1 für die Mühe! :)
  22. 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!