我的用户可以相互连接,也可以同时与另一个配置文件和该配置文件的所有连接连接。

但是可能是该用户已经与另一用户的连接之一建立了连接。我需要确保数据库中不会有两个相同的行:

我的查询看起来像这样:

if (isset($_POST['crewconnect'])) {

    include '../php/dbconnect.php';

    $connections = $DBcon->query("SELECT connection_id FROM tbl_current_userconnections WHERE user_id=$profileID");
    while($row = $connections->fetch_array()){
        $crewmemberID = $row['connection_id'];

        $DBcon->query("DELETE FROM tbl_former_userconnections WHERE user_id=$activeID AND connection_id=$crewmemberID");
        $DBcon->query("DELETE FROM tbl_former_userconnections WHERE user_id=$crewmemberID AND connection_id=$activeID");

//the following query needs to be changed:
        $DBcon->query("INSERT INTO tbl_current_userconnections(user_id, connection_id) VALUES('$activeID','$crewmemberID'),('$crewmemberID','$activeID')");
    }

    $DBcon->query("INSERT INTO tbl_current_userconnections(user_id, connection_id) VALUES('$activeID','$profileID'),('$profileID','$activeID')");

    $DBcon->close();
}


我想过要更改的部分是这样的:

        $DBcon->query("IF (NOT EXISTS(SELECT user_id, connection_id FROM tbl_current_userconnections WHERE user_id=$activeID AND connection_id=$crewmemberID)) INSERT INTO tbl_current_userconnections(user_id, connection_id) VALUES('$activeID','$crewmemberID'),('$crewmemberID','$activeID')");


但这到目前为止没有用...

最佳答案

正确的方法是让数据库进行检查。也就是说,让数据库维护数据的完整性。

因此,首先创建一个唯一索引:

create unique index unq_t_userid_connectionid on tbl_current_userconnections(user_id, connection_id);


然后,任何尝试插入现有值的操作都会导致错误。如果您不想出错,请使用:

INSERT INTO tbl_current_userconnections(user_id, connection_id)
    VALUES ('$activeID', '$crewmemberID'),
           ('$crewmemberID', '$activeID')
    ON DUPLICATE KEY UPDATE user_id = VALUES(user_id);


ON DUPLICATE KEY对数据不执行任何操作,但是可以防止报告错误。

为什么这样更好?在应用程序中执行检查的问题在于,两个用户可能试图同时创建相同的链接。这可能会导致争用情况,其中IF传递给两个用户,因此都插入了数据。这就是为什么在数据库中执行逻辑很重要的重要原因之一。

另外,您应该学习使用参数化查询,而不是将值直接传递到查询语句中。您的方法很危险,并可能导致意外的语法错误。

07-28 13:14
查看更多