【问题标题】:Comparing Query Results to Current User将查询结果与当前用户进行比较
【发布时间】:2016-07-23 07:36:26
【问题描述】:

每次用户第一次登录时,我都会保存一些关于他们的信息。如果用户已经有条目并且条目已经过时,那么应该更新它。我的问题是尝试将用户与数据库进行比较,看看他们是否已经有一个条目。我成功记录了用户的详细信息,但每次用户登录时都会这样做。您可以在下面找到我的代码。

$conn = new mysqli('host', 'user', 'password', 'db');
if ($conn->connect_error) {
    die("Error; Contact Support!");
}

$stmt = $conn->prepare("select * from users where steamid=? ");
$stmt->bind_param('s', $steamprofile['steamid']);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($res);
$duplicate = mysqli_num_rows($res);
if ($duplicate == 0) {
    $stmt1 = $conn->prepare("REPLACE INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ?");
    $stmt1->bind_param('sss', $steamprofile['steamid'], $steamprofile['realname'], $steamprofile['personaname']);
    $stmt1->execute();
    $stmt1->store_result();
    $stmt1->bind_result($res1);
    if ($res1 === TRUE) {
        echo "";
    }
    $stmt1->close();
    $stmt->close();
    mysqli_close($conn);
}

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您可以通过简单地使用 INSERT .. ON DUPLICATE KEY UPDATE 来避免所有这些复杂的逻辑:

    $conn = new mysqli('host', 'user', 'password', 'db');
    if ($conn->connect_error) {
        die("Error; Contact Support!");
    }
    
    $query = "INSERT INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ? ON DUPLICATE KEY UPDATE realname=? , username=?"
    $stmt1 = $conn->prepare($query);
    $stmt1->bind_param('sssss', $steamprofile['steamid'], 
            $steamprofile['realname'], $steamprofile['personaname'], 
            $steamprofile['realname'], $steamprofile['personaname']);
    $stmt1->execute();
    $stmt1->store_result();
    $stmt1->bind_result($res1);
    if ($res1 === TRUE) {
        echo "";
    }
    $stmt1->close();
    mysqli_close($conn);
    

    您完全无需先运行查询以查明记录是否已存在。

    还要注意查询也可以写成

    $query = "INSERT INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ? ON DUPLICATE KEY UPDATE realname=VALUES(realname) , username=VALUES(username)"
    

    在这种情况下,您不需要绑定用户名和实名参数两次。

    请注意,这也优于 REPLACE INTO,因为替换会导致整行被替换,而不是仅更新一列。因此 REPLACE INTO 可能会导致必须重新计算索引。

    【讨论】:

      【解决方案2】:

      你可能有错别字

      duplicate = mysqli_num_rows($res);
      

      而不是

      $duplicate = mysqli_num_rows($res);
      

      (但这不应该引发错误?)

      你使用

      ("REPLACE INTO `users` SET `steamid` = ?,`realname` = ?,`username` = ?")
      

      我认为您应该为新用户使用 INSERT 并为现有用户使用更新

      ("INSERT INTO `users` (`steamid`,`realname`, `username`) values( ?, ?,?")
      

      ("UPDATE `users` SET `steamid` = ?,`realname` = ?,`username` = ?
        WHERE `your_user_id`  = ? ")
      

      【讨论】:

      • $duplicate,信不信由你,不会引发任何错误。我对如何查看用户是否已经拥有数据库条目一无所知,但这是我的悲伤尝试。 @scaisEdge
      • steam id 是 user_id 吗? .. 确保您在 $steamprofile['steamid'] 中具有正确的值 ..例如:使用 var_dump($steamprofile['steamid']);然后检查 $duplicate 例如:var_dump($duplicate);
      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      相关资源
      最近更新 更多