Давайте не будем забывать некоторые из прошлых советов, которые я предложил .
Наиболее заметный в этом вопросе $peaks_select2 = '<select name2=
не сработает.Атрибут name
должен быть незапятнанным.
Выполняя сначала потенциальное действие по удалению, вы можете разрешить своим пользователям выполнять удаление после удаления и всегда видеть самые последние данные в списке выбора.
Мне не нравится, что вы используете peak_name
в качестве идентификатора.Ваша таблица имеет peak_id
, ожидается, что они будут автоматически увеличиваться и будут уникальными в большинстве случаев, и именно так профессионалы связывают связанные данные.(Вы должны изменить свой дизайн, чтобы принять эту практику.)
Когда значение атрибута value
параметра совпадает с текстовым значением параметра, нет необходимости объявлять атрибут name
.Поскольку я предлагаю использовать идентификаторы, я объявляю атрибут name
.
Непроверенный фрагмент:
<!DOCTYPE html>
<html>
<body>
<?php
// get the $_POST['submit'] value; if missing, set as empty string (WORD is a Joomla-specific filter that strips unwanted characters for security reasons)
$action = JFactory::getApplication()->input->post->get('submit', '', 'WORD')
// get the $_POST['peak_id'] value; if missing set as 0 (INT strips any character that is not a digit)
$peak_id = JFactory::getApplication()->input->post->get('peak_id', 0, 'INT');
// try to get the $_POST['link_id'] value; if it is missing, try from $_GET['link_id']
$hiker_id = JFactory::getApplication()->input->post->get('link_id', 0, 'INT');
if (!$hiker_id)
{
// there was no submission (this is the first load of the page)
$hiker_id = JFactory::getApplication()->input->get->get('link_id', 0, 'INT');
}
echo "<div>Link Id: $hiker_id</div>";
$db = JFactory::getDbo();
if ($action === 'Delete' && $peak) // if action is Delete and $peak is not empty or 0
{
$delete_query = $db->getQuery(true)
->delete("#__climbing")
->where([
"link_id = " . (int) $hiker_id,
"peak_id = " . (int) $peak_id
]);
$db->setQuery($delete_query);
$db->execute();
if ($db->getAffectedRows()) // check for successful deletion (if at least one row was deleted)
{
echo "<div>Successfully deleted row for hiker#: $hiker_id, peak#: $peak_id</div>";
}
else
{
echo "<div>Failed to delete row for hiker#: $hiker_id, peak#: $peak_id</div>";
}
}
// now query the table for the fresh data after the (potential) delete was performed
$peaks_query = $db->getQuery(true)
->select("peak_id, peak_name")
->from("#__climbing")
->where("link_id = " . (int) $link_id)
->order("peak_id");
$db->setQuery($peaks_query);
$peaks_select = '<select name="peak_id">';
$peaks_select .= '<option value="0">-- Select peak to delete --</option>';
if (!$results = $db->loadAssocList()) // there were no rows in the result set
{
// no peaks found for $link_id
}
else
{
foreach ($results as $row)
{
$peaks_select .= "<option value=\"{$row['peak_id']}\">{$row['peak_name']}</option>"; // create option with name as text and id as the value
}
}
$peaks_select .= '</select>';
// print the simple form...
?>
<div class="sender">
<h4>Peak Delete Form</h4>
<form method="post" action="">
<?=$peaks_select?>
<input type="hidden" name="link_id" value="<?=$hiker_id?>">
<input type="submit" name="submit" value="Delete" />
</form>
</div>
</body>
</html>