Php MySQL。在数据库中插入并选择不重复的数据

Php MySQL。在数据库中插入并选择不重复的数据,php,mysql,database,mysqli,duplicates,Php,Mysql,Database,Mysqli,Duplicates,我正在制作flash游戏,玩家需要尽快通过游戏。我已经让玩家进入前10名,并且是按时间顺序排列的(从最低到最高),但我有一个问题,如果同一个玩家玩了几次,他总是添加到数据库中。我需要使该球员和他的最佳(最低)时间只有一次将被写入数据库或只有一次打印出他的名字。(如果播放机的时间少于保存在数据库中的时间,仅在这种情况下,我需要更新/插入它。)谢谢 例如: Peter 00:07 Peter 00:09 Peter 00:12 John 00:17 John 00:21 示例应该是: Peter

我正在制作flash游戏,玩家需要尽快通过游戏。我已经让玩家进入前10名,并且是按时间顺序排列的(从最低到最高),但我有一个问题,如果同一个玩家玩了几次,他总是添加到数据库中。我需要使该球员和他的最佳(最低)时间只有一次将被写入数据库或只有一次打印出他的名字。(如果播放机的时间少于保存在数据库中的时间,仅在这种情况下,我需要更新/插入它。)谢谢

例如:

Peter 00:07
Peter 00:09
Peter 00:12
John 00:17
John 00:21
示例应该是:

Peter 00:07
John 00:17
这是我的SelectFromDB.php

<?php 
    $time = $_POST['time'];     
    session_start();
    $name = $_SESSION['vardas']; 
    $time = strtotime($time);
    $times = date('s:H:i', $time);
    $_SESSION['test'] = $times;
    $_SESSION['test1'] = $username;


    $mysqli = new mysqli("localhost","my_db","pass","my_db");

    $query = "SELECT userName,time FROM eurokos ORDER by time ASC LIMIT 10";
if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
//    printf(" ", $mysqli->character_set_name());
}
 header('Content-Type: text/xml');
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<results>';
    if ($result = $mysqli->query($query)) {
        while ($row = $result->fetch_assoc()) {
           echo $row["userName"].' '.$row["time"]."\n";
        }
        $result->free();
    }
    echo '</results>';
    $mysqli->close();
?>

这是我的InsertToDB.php

<?php 

    $time = $_POST['time'];
    session_start();
    $name = $_SESSION['vardas']; 
    $time = strtotime($time);
    $times = date('s:H:i', $time);      
    $_SESSION['test'] = $times;
    $_SESSION['test1'] = $username;

    $mysqli = new mysqli("localhost","my_db","pass","my_db");
if ($stmt = $mysqli->prepare("INSERT into eurokos (time, userName) VALUE (?,?) ")) {
if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
//    printf(" ", $mysqli->character_set_name());
}


$stmt->bind_param('ss', $times, $name);
  // $stmt->bind_param("s", $username);

   $stmt->execute();

   if ($stmt->error != '') {
       echo ' error:'.$stmt->error;
   } else {
       echo 'success';
   }
   $stmt->close();
} else {
   echo 'error:'.$mysqli->error;
}
$mysqli->close();

在插入记录之前执行此操作

  • 运行select查询并查看该用户名是否存在

  • 如果存在,如果db时间大于 要插入的值,请运行更新查询以将时间更新到 新的价值观

  • 如果不存在,请为该用户运行insert查询


  • 仅更改您的选择:

    SELECT userName,min(time) time FROM eurokos group by userName order by time ASC LIMIT 10;
    

    下面是我应该怎么做的

    $time = _SESSION[test];
    $user = "john";
    
    $res = $con->prepare("SELECT time from eurokos WHERE userName = '$user' AND time > '$time'");
    $res->execute();
    $allow_new_insert = $res->num_rows;
    
     if(!$allow_new_insert) {
      //insert magic code for updating time here
     }
    

    您只需更改您的选择。谢谢您的回答。检查数据库中是否存在if函数必须是什么样子?如果(mysql_num_rows($result)>0)记录存在或不存在,请执行此操作谢谢。如果我使用
    $query=“按用户名顺序从eurokos group按时间ASC LIMIT 10选择用户名,分钟(时间)”,您能告诉我它必须是什么样子吗,因为我做不正确…谢谢您的回答返回名称而不包含时间我更新了答案,这可能是因为您只使用了字段
    time
    ,因此请选择所需字段并更改其名称。使用更新后的答案。让我告诉您,这是一个临时解决方案,您需要更改存储数据的方式,因为此表由于
    用户名重复太多而变得非常大。也许是时候更好地配置您的数据库了,或者更好地,使用mongodb、hadoop等将其更改为水平设计。正如@chandresh_cool所说,也许这里是更改INSERT的更好解决方案。只是我不能成功地完成它。让我告诉你,对于这个模型,水平数据库可能很好,但是如果你想继续使用关系数据库,最好使用
    视图
    ,始终拥有
    前10名
    解决方案,而不必查询庞大的eurokos表。谢谢你的回答,但是我有两个不同的文件,一个用于插入,另一个用于选择。插入文件应用作插入/更新