Я строю систему управления посетителями. В админке я пытаюсь добавить возможность выхода вручную. У меня есть карточки посетителей, на которых отображается информация о посетителях, а также кнопка для просмотра их профиля и кнопка для выхода из системы. - https://ibb.co/f7y5yV
Я сделал PHP foreach, чтобы вытащить данные посетителя из базы данных и затем отобразить их в их собственной карточке. Это код для карт
<?php foreach ($result as $row) : ?>
<div class = "visitor-tile">
<div class = "visitor-tile-container">
<div class = "my-photo-container">
<img src = "../images/visitor-photos/<?php echo htmlspecialchars($row['id']);?>-<?php echo htmlspecialchars($row['image_path']);?>" class = "profile-img img-circle center-block"></td>
</div>
<h2 class = "profile-visitorname">
<?php echo htmlspecialchars($row['first_name']) ?> <?php echo htmlspecialchars($row['last_name']);?>
</h2>
<p class = "profile-label">Vehicle Reg: <span class = "profile-data"><?php echo htmlspecialchars($row['vehicle_reg']) ?></span></p>
<p class = "profile-label">Visiting: <span class = "profile-data"><?php echo htmlspecialchars($row['visiting']);?></span></p>
<p class = "profile-label">Arrival Time: <span class = "profile-data"><?php echo substr(htmlspecialchars($row['sign_in_time']), 11, -3);?></span></p>
</div>
<div class = "visitor-tile-buttons">
<a href = "visitor_profile.php?id=<?php echo htmlspecialchars($row['person_id']);?>" class = "view-profile"><i class = "fas fa-user"></i></a>
<a href = "#" class = "sign-out" id = "myLink" onclick = "return confirm_delete()"><i class = "fas fa-sign-out-alt"></i></a>
<script type = "text/javascript">
function confirm_delete() {
return confirm('Are you sure you want to sign out <?php echo htmlspecialchars($row['first_name']) ?> <?php echo htmlspecialchars($row['last_name']);?>');
}
</script>
</div>
</div>
<?php endforeach ?>
Для кнопки выхода я пытаюсь выполнить подтверждение в javascript, чтобы спросить пользователя, уверены ли они, что хотят выписать посетителя, но хотят вытащить имя посетителя из результата и поместить его в подтверждающее сообщение. Я пытался сделать это здесь, но похоже, что он извлекает только первый результат запроса для всех карточек посетителей.
<a href = "#" class = "sign-out" id = "myLink" onclick = "return confirm_delete()"><i class = "fas fa-sign-out-alt"></i></a>
<script type = "text/javascript">
function confirm_delete() {
return confirm('Are you sure you want to sign out <?php echo htmlspecialchars($row['first_name']) ?> <?php echo htmlspecialchars($row['last_name']);?>');
}
</script>
Я думаю, мне нужно как-то передать результат в JS, но я не совсем уверен.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это происходит потому, что вы создаете свой <script> внутри цикла PHP foreach, поэтому вы получаете по одному сценарию для каждого пользователя. И поскольку сценарий определяет одну функцию, которая одинакова для каждой функции, функции перезаписывают друг друга.
Вы должны просто сделать тег один<script> вне цикла. И чтобы он отображал правильные данные для пользователя, на которого щелкнул, вы можете передать такие параметры.
Например. функция может быть:
function confirm_delete(firstName, lastName) {
return confirm('Are you sure you want to sign out ' + firstName + ' lastName;?>');
}
И определите свою ссылку в цикле следующим образом:
<a href = "#" class = "sign-out" id = "myLink" onclick = "return confirm_delete(<?php echo htmlspecialchars($row['first_name']);?>, <?php echo htmlspecialchars($row['last_name']);?>)"><i class = "fas fa-sign-out-alt"></i></a>
Или используйте атрибуты данных, упомянутые @JonStirling - это приведет к более аккуратному коду.
Ваш код создаст несколько определений
confirm_delete, что не будет работать. Имейте одну функцию и передайте имя, например, атрибут данных в теге.