【问题标题】:php and mysqli SELECT query if it exists, then update it, else insert itphp 和 mysqli SELECT 查询如果存在,则更新,否则插入
【发布时间】:2014-07-25 14:11:07
【问题描述】:

我正在运行查询以检查我的数据库中是否存在现有值,如果它们确实存在则更新它们而不重新插入它们。

目前我的代码只是将值重新插入到表中而不是更新它们,这意味着我的代码永远不会到达我语句的 else 部分。

if(isset($user_info->error)){
    // Something's wrong, go back
    header('Location: twitter_login.php');
} 
else {
   // Let's find the user by its ID
   $query = ("SELECT * FROM twitter WHERE oauth_provider = 'twitter' && oauth_uid = '".$user_info->id."'");
   $rs=$mysql->query($query);
   $results = $rs->fetch_array(MYSQLI_ASSOC);
   // If not, let's add it to the database
   if(empty($result)){
      $query = ("INSERT INTO twitter (oauth_provider, oauth_uid, username, oauth_token, oauth_secret)
                 VALUES ('twitter', {$user_info->id}, '{$user_info->screen_name}', '{$access_token['oauth_token']}', '{$access_token['oauth_token_secret']}')");
      $rs=$mysql->query($query);
      $insert = ("SELECT * FROM twitter WHERE id = " . mysqli_insert_id($mysql));
      $rs=$mysql->query($insert);
      $results = $rs->fetch_array(MYSQLI_ASSOC);
   } 
else{
    // Update the tokens
    $update = ("UPDATE twitter SET oauth_token = '{$access_token['oauth_token']}',
                oauth_secret = '{$access_token['oauth_token_secret']}'
                WHERE oauth_provider = 'twitter' AND oauth_uid = {$user_info->id}");
    $rs=$mysql->query($update);
    $rs->close();
}

【问题讨论】:

  • 它正在将值重新插入到数据库中 = 重复的行...我不希望这样。
  • $results$result ?因为你检查empty($result)

标签: php html mysql sql mysqli


【解决方案1】:

$result$results 之间有错字

$results = $rs->fetch_array(MYSQLI_ASSOC);
    // If not, let's add it to the database
    if(empty($result)){
                    ^
                   Here

因为$result 在它始终为空并且 if 部分始终为真之前未声明。

【讨论】:

    【解决方案2】:

    如果您想正确防止重复,请创建一个 UNIQUE KEY(oauth_provider,oauth_uid);

    然后使用 INSERT ON DUPLICATE 语句插入或更新行。 http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

    INSERT INTO twitter (oauth_provider, oauth_uid, username, oauth_token, oauth_secret)
    VALUES ('twitter', {$user_info->id}, '{$user_info->screen_name}', '{$access_token['oauth_token']}', '{$access_token['oauth_token_secret']}') 
    ON DUPLICATE KEY UPDATE oauth_token = VALUES(oauth_token), oauth_secret = VALUES(oauth_secret)
    

    【讨论】:

    • 这会消除我最后的else { update } 声明吗? @naktibalda
    • 是的,它替换了代码中的 SELECT、INSERT 和 UPDATE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2013-04-19
    • 1970-01-01
    • 2023-03-17
    • 2013-03-13
    相关资源
    最近更新 更多