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

后端 未结 4 1422
南旧
南旧 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))))  ;
    

提交回复
热议问题