SQL-如果我检查唯一id是否存在,为什么我有一个重复的行



我在表中发现了一个重复的行>来自我的表的图像

但在我的代码中;unique_id";键存在,则更新此行,否则,创建。。我对sql非常熟悉,我做了一些函数来让我的生活更轻松。。。这是我的";send_score.php";文件

<?php
header('Content-Type: text/plain');
header("Access-Control-Allow-Origin: *");
include "../../functions.php";
$servername = "xxx";
$database = "xxx";
$username = "xxx";
$password = "xxx";
$tabla = "xxx";
$unique_key = $_POST['unique_key'];
$nick = $_POST['nick'];
$puntos = $_POST['puntos'];
$con = sql_connect($servername, $username, $password, $database);
if ( sql_check_row($con,$tabla,"unique_key","'".$unique_key."'") ) {
//if exists, replace
if ( sql_update_row($con,$tabla,"nick",$nick,"unique_key",$unique_key) && sql_update_row($con,$tabla,"sc",$puntos,"unique_key",$unique_key) ) {
echo "OK UPDATE";
exit;
}
else {
echo "BAD UPDATE";
exit;
}
}
else {
//if not exists, create
$arr_key = array("unique_key","nick","sc");
$arr_val = array("'".$unique_key."'","'".$nick."'",$puntos);
if ( sql_insert_row($con,$tabla,$arr_key,$arr_val) ) {
echo "OK INSERT";
exit;
}
else {
echo "BAD INSERT";
exit;
}
}
sql_close($con);
?>

这是我在这里使用的函数

function sql_connect($servername, $username, $password, $database) {
return mysqli_connect($servername, $username, $password, $database);
}
function sql_close($con) {
return mysql_close($con);
}
function sql_check_row($con,$table,$key,$value) {
$sql = mysqli_query($con, "SELECT * FROM ".$table." WHERE ".$key." = ".$value);
if( mysqli_num_rows($sql) ) {
return true;
}
else {
return false;
}
}
function sql_update_row($con,$table,$key_set,$value_set,$key_where,$value_where) {
$sql = mysqli_query($con,"UPDATE ".$table." SET ".$key_set." = '".$value_set."' WHERE ".$key_where." = '".$value_where."';");
if ($sql) {
return true;
}
else {
return false;
}
}
function sql_insert_row($con,$table,$key_arr,$value_arr) {
$keys = "(";
for ( $i = 0; $i < sizeof($key_arr); $i++ ){
if ($i != 0) {
$keys .= ",";
}
$keys .= $key_arr[$i];
}
$keys .= ")";

$query = "INSERT INTO ".$table." ".$keys." VALUES (";
for ( $i = 0; $i < sizeof($value_arr); $i++ ){
if ($i != 0) {
$query .= ",";
}
$query .= $value_arr[$i];
}
$query .= ");";

$sql = mysqli_query($con,$query);
if ($sql) {
return true;
}
else {
return false;
}
}

根据我的说法,它不应该创建新行,因为一行已经存在,并且具有相同的";unique_id";并且在图像中,两行具有完全相同的";unique_id";。。。为什么?

这里的一个简单策略是写入列"的值;unique_key";在一个数组中,然后用"0"测试新值是否存在;in_array((";。如果该值存在,则进行更新。如果没有,则插入新行:

<?php
$all_unique_ids = array();
$con = sql_connect($servername, $username, $password, $database);
$stmt = $con->prepare("SELECT `unique_key` FROM `".$tabla."`");
$stmt->execute();
foreach ($stmt->get_result() as $row)
{
$all_unique_ids[] = $row['unique_key'];
}
mysqli_close($con);
if(in_array($unique_id, $all_unique_ids))
{
sql_update_row(.....);    
}
else
{
sql_insert_row(   ......);    
}
?>

您的代码有一个竞争条件。具有相同unique_id的两个同时对同一页面的请求将同时检查数据库,并且都得到相同的结果。也就是说,给定的unique_id不在数据库中。

然后,两个请求都将插入一个具有相同unique_id的行。这就是为什么数据库允许您给列一个唯一的约束。

相关内容

最新更新