getting mysql_insert_id() while using ON DUPLICATE KEY UPDATE with PHP

后端 未结 4 1420
南旧
南旧 2020-12-05 02:52

I\'ve found a few answers for this using mySQL alone, but I was hoping someone could show me a way to get the ID of the last inserted or updated row of a mysql DB when using

相关标签:
4条回答
  • 2020-12-05 03:12

    This is my solution where you put the data into a single array and it's automatically duplicated/populated into the "INSERT INTO .. ON DUPLICATE UPDATE .. " query.

    It's great for maintainability, and if you want you can make it a function / method too.

    // save to db:
    
    $qData = [
        "id" =>                mysql_real_escape_string($email_id),     
        "synd_id" =>           mysql_real_escape_string($synd_id),
        "campaign_id" =>       mysql_real_escape_string($campaign_id),
        "event_id" =>          mysql_real_escape_string($event_id),
        "user_id" =>           mysql_real_escape_string($user_id),
        "campaign_name" =>     mysql_real_escape_string($campaign_name), 
        "subject" =>           mysql_real_escape_string($subject),
        "from_name"=>          mysql_real_escape_string($from_name),
        "from_email"=>         mysql_real_escape_string($from),
        "content"=>            mysql_real_escape_string($html),
        "link_to_template" =>  mysql_real_escape_string($hash),
        "ext_campaign_id" =>   mysql_real_escape_string($ext_campaign_id),
        "ext_list_id"=>        mysql_real_escape_string($ext_list_id),
    ];
    
    
    $q = "INSERT INTO email_campaigns (".
      // i.e create a string like `id`, `synd_id`, `campaign_id`..  with linebreaks for readability
      implode(", \n", array_map(function($k){ return "`$k`"; }, array_keys($qData)))
    .")
    VALUES (".
      // i.e '20', '532', '600' .. 
      implode(", \n", array_map(function($v){ return "'$v'"; }, array_values($qData)))
    ." )  ON DUPLICATE KEY UPDATE ".
      // i.e `synd_id`='532', `campaign_id`='600' ... 
      // id & link_to_template table keys are excluded based on the array below
      implode(", \n", array_filter(array_map(function($k, $v){ if(!in_array($k, ['id', 'link_to_template']) ) return "`$k`='$v'" ; }, array_keys($qData), array_values($qData))))  ;
    
    0 讨论(0)
  • 2020-12-05 03:17

    Here's the answer, as suggested by Alexandre:

    when you use the id=LAST_INSERT_ID(id) it sets the value of mysql_insert_id = the updated ID-- so your final code should look like:

    <?
        $query = mysql_query("
            INSERT INTO table (column1, column2, column3) 
            VALUES (value1, value2, value3) 
            ON DUPLICATE KEY UPDATE
                column1 = value1, 
                column2 = value2, 
                column3 = value3, 
                id=LAST_INSERT_ID(id)
        ");
        $my_id = mysql_insert_id();
    

    This will return the right value for $my_id regardless of update or insert.

    0 讨论(0)
  • 2020-12-05 03:34

    You could check if the Query was an insert or an update ( mysql_affected_rows(); returns 1 on insert and 2 on update).

    If it was an insert use mysql_insert_id, if it was an update you'd need another Query.

    <?php
    $query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
    mysql_query($query);
    if(mysql_affected_rows() == 1) { $id = mysql_insert_id(); }
    else { // select ... 
    }
    ?>
    

    I know it's not excatly what your looking for but it's the best i could come up with

    0 讨论(0)
  • 2020-12-05 03:37

    Although not using mysql_insert_id() and ON DUPLICATE KEY UPDATE, alternative great way to get the value of any field when updating another found here:

    UPDATE table SET id=(@tempid:=id) , .... LIMIT 1;
    SELECT @tempid;
    

    I used it having table with (id,status) 'id' primary index auto-increment, and 'status' was the field upon which update was made, but i needed to get 'id' of the updated row. This solution also proof to race conditions as mysql_insert_id().

    0 讨论(0)
提交回复
热议问题