我的用户可以相互连接,也可以同时与另一个配置文件和该配置文件的所有连接连接。
但是可能是该用户已经与另一用户的连接之一建立了连接。我需要确保数据库中不会有两个相同的行:
我的查询看起来像这样:
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
传递给两个用户,因此都插入了数据。这就是为什么在数据库中执行逻辑很重要的重要原因之一。另外,您应该学习使用参数化查询,而不是将值直接传递到查询语句中。您的方法很危险,并可能导致意外的语法错误。