我正在尝试创建一个注册用户可以加入“旅行”的系统。一旦他提交了他想要加入的内容,就会捕获他的用户ID并将其发送到名为usersJoined的列中的数据库。这个想法是多个用户可以加入“旅行”,所有的id都存储在一个单元格中并用逗号分隔。为了稍后检索id,我将使用explode函数。
我的问题是,最后一个附加的id也有一个逗号。爆炸函数会将最后一个逗号后面的空格看作“对象”吗?它将存储在捕获爆炸函数的数组中。
有没有办法可以确保最后一个附加的ID没有逗号? 或者你有其他方法的建议吗?
这是我的代码:
function joinPost($id, $s_email){
// Captures the user ID from a SESSION variable received outside this function
$query = "SELECT `id` FROM `users` WHERE `email` = '$s_email'";
$result = $this->db->query($query);
if ($result->num_rows > 0) {
while($row = $result->fetch_array()) {
$userID = $row['id'];
}
}
$userIDwithComma = $userID . ','; // <-- this should be different, I guess
// Check if user joined already
$query = "SELECT `usersJoined` FROM `trips` WHERE id = '$id'";
$result = $this->db->query($query);
if ($result->num_rows > 0) {
while($row = $result->fetch_array()) {
$usersJoined = $row['usersJoined'];
}
}
$users = explode(',', $usersJoined);
$check = 0;
foreach($users as $user){
if($user == $userID){
$check = 1;
}
}
if($check != 1){
$sql = "UPDATE trips SET usersJoined = CONCAT(usersJoined, ?) WHERE id = '$id'";
if($stmt = $this->db->prepare($sql)) {
$stmt->bind_param('s', $userIDwithComma);
$stmt->execute();
if($stmt->fetch()) {
$stmt->close();
return true;
}
return true;
}
} else {
header('Location: trips.php?status=already_joined');
}
}
答案 0 :(得分:2)
哦,我的......你设计的数据库很糟糕。您应该创建多对多关系。现在,您有两个表:Users
和Trips
。您应该创建一个包含FK user_id
和trip_id
的新表格,如下所示:
UsersGoTrip
=====================
| user_id | trip_id |
=====================
| 1 | 1 |
| 2 | 1 |
| 1 | 2 |
=====================
然后,添加,删除和选择特定旅行的用户或特定用户参加的旅行只需一个查询。
答案 1 :(得分:0)
$users = explode(',', rtrim($usersJoined, ',')); // trim commas from right
或
$users = array_filter(explode(',', $usersJoined)); // remove from array if empty value
答案 2 :(得分:0)
您必须删除最后一个逗号,
改变这个:
$stmt->bind_param('s', $userIDwithComma);
为:
$stmt->bind_param('s', substr($userIDwithComma, 0, -1));