2015-12-12 2 views
-1
<?php 
if(isset($_POST['delete_dayOff'])) { 
$DeleteQuery = "DELETE FROM dayoff WHERE id = '$_POST[hidden]'"; 
mysqli_query($db,$DeleteQuery); 
}; 

// display records 

$select_employee = "SELECT * FROM dayoff"; 
$result = $db->query($select_employee); 
?> 
<table> 
<div id="Day-off Employees"> 
<?php 
    echo "<table><caption>Day-off Employees</caption><tr> 
    <th>Employee First Name</th> 
    <th>Employee Last Name</th> 
    <th>Day-Off</th> 

    </tr>"; 

    echo "<form action=dayoff.php method=post>"; 

    // output data of each row 
    while($row = $result->fetch_assoc()) { 

     echo "<tr>"; 

     echo "<td>" . $row["employeefname"]. "</td>"; 
     echo "<td>" . $row["employeelname"]. "</td>"; 
     echo "<td>" . $row["date"]. "</td>"; 


echo "<td>" . "<input type=hidden name=hidden value=" . $row["id"]. " </td>"; 
echo "<td>" . "<input type=submit name=delete_dayOff value=delete >" . " </td>"; 
echo "</tr>"; 
} 

echo "</form"; 


echo "</table>"; 


?> 

Я использую тот же точный сценарий на другой странице, и он отлично работает. id - первичный ключ autonumber int, а не null в mysql.кнопка удаления удаляет последнюю вставленную строку в Mysql

Если я нажму кнопку delete, он всегда удаляет последнюю вставленную строку в mysql или новую строку.

Если я повторяю содержимое скрытой кнопки, это правильно, но если я нажму кнопку «Удалить», он удалит неправильную строку, почему?

+0

извинения за отсутствующим тег HTML, я просто скопировал часть, которую вы должны видеть – Lynob

+0

места ваших тегов формы внутри 'while' цикла, и вы действительно должны процитировать ваши материалы. Известно, что это имеет неблагоприятные последствия. Посмотрите также на свой HTML-источник. Здесь вы также можете использовать SQL-инъекцию. –

+1

Ваш $ _POST [скрытый] не будет правильно оцениваться в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Вы должны изменить его на '$ DeleteQuery =" DELETE FROM dayoff WHERE id = '". (int) $ _POST ['hidden']. ". Это также один из способов гарантировать, что id в int для предотвращения SQL-инъекции. –

ответ

2

Это потому, что у вас есть одна и только форма, хотя вы хотите иметь возможность удалять одну строку. У вас должно быть столько форм, что у вас есть строки.

Вместо того чтобы помещать ваши теги формы вне цикла while, вы должны поместить их внутрь, таким образом, у вас будет много форм.

Проблема с наличием только одной формы заключается в том, что вы назвали скрытое поле с тем же именем, чтобы оно было последним.

сделать

while($row = $result->fetch_assoc()) { 
    echo "<tr>"; 
    ... 
    echo '<td><form ...><input hidden...><input type="submit"...></form></td>'; 
    ... 
} 
+0

, а как насчет другого тега? –

+0

О, да, извините, я забыл тег закрывающей формы, я отредактировал свой ответ – jiboulex

+0

на самом деле в своем коде, я попытался поместить его внутрь и не работал, это была комбинация вашего ответа и андресов, которые исправили его – Lynob

0

$_POST[hidden] должно быть $_POST['hidden'];

$DeleteQuery = "DELETE FROM dayoff WHERE id = '$_POST['hidden']'"; 
+0

Я думаю, что $ _POST ['hidden'] не будет оцениваться. Вы должны поместить скобки вокруг него, как '$ DeleteQuery =" УДАЛИТЬ FROM dayoff WHERE id = '{$ _POST [' hidden ']}' ";' –

Смежные вопросы