2010-10-04 6 views
1

У меня есть несколько кнопок изображения (echo'd в цикле -На по результатам MySQL, -не включены в код ниже) -ITS Abit как кнопка удаления для системы сообщений:PHP/HTML изображение кнопки

<form method="post"> 
<input type="image" src="delete.png" id="delete" name="delete" title="Delete Message" alt="Delete button" value="<? echo $row['MessageId'] ?> " > 
<input name="do_insert2" type="hidden" value="<? echo $row['MessageId'] ?> " >  
</form> 

Тогда у меня есть небольшой скрипт (просто тест, чтобы увидеть, если он знал, какой MessageId нажал -Какой будет позже удалено ...

<? 
if ($_POST['do_insert2'] != NULL) { 
$deletemessage = $_POST['do_insert2']; 
echo $deletemessage; 
} 
?> 

Однако она всегда приходит с последним сообщением (ID 269), независимо от того, какую кнопку изображения вы нажимаете.

Почему это и как я могу это исправить?

+0

Две вещи, которые следует учитывать: во-первых, придать каждой форме уникальный идентификатор. Как бы то ни было, вы повторно объявляете ввод с именем «do_insert2» один раз для каждой формы на странице, и поэтому, не зная, что каждая форма должна обрабатываться отдельно, многие браузеры могут просто использовать самый последний do_insert2, чтобы определить, какое значение отправить. Кроме того, попробуйте просто повторять '$ row [" MessageId "]' на каждой итерации цикла, чтобы убедиться, что он имеет ожидаемые значения. – stevendesu

ответ

0

Исходя из этого, не легко понять, что вы делаете неправильно.

Однако: Вы действительно не должны делать это таким образом; он открывает вам различные хаки, атаки XSS и атаки на вставку базы данных.

0

Не совсем безопасно, но он будет работать:

<input type="image" src="delete.png" onClick="location.href='test.php?delete=<?=$row['MessageId'] ?>'"> 

PHP

<?php 
$id_delete = (isset($_GET['delete']) && $_GET['delete'] !='') ? (int) $_GET['delete'] : -1; 
print $id_delete; 
?> 
0

Предложения:

  • Используйте отдельную форму для каждой пары полей ввода HTML (кнопка и скрытое поле)

  • Попробуйте создать уникальные имена для скрытых полей ввода.

0

Лучший способ сделать это, чтобы добавить идентификатор сообщения кнопке следующим образом:

<input type="image" src="delete.png" name="delete;<?=$row['MessageId'];?>" />

Это даст что-то вроде:

<input type="image" src="delete.png" name="delete;1" /> 
<input type="image" src="delete.png" name="delete;2" />

Теперь, представленные данные будет включать только имя используемой кнопки отправки. При нажатии на кнопку с «удалить; 1», print_r($_POST) дает:

Array 
(
    [delete;1_x] => 25 
    [delete;1_y] => 9 
)

Если нажать на изображение с «удалить; 2», только «удалить; 2» будет размещена. Таким образом, вы знаете, какой образ был нажат и что удалить.

Вещь с использованием изображений в качестве кнопки отправки заключается в том, что вы также получаете координаты того, где вы нажали на это изображение. Но это не проблема, вы можете легко извлечь идентификатор сообщения:


// when submitted, go through all the submitted values 
foreach ($_POST as $key => $value) { 
    // if a key starts with 'delete;', you know a delete image was clicked 
    if (substr($key,0,7)=='delete') { 
    // first remove the 'delete;' part 
    $key = str_replace('delete;','',$key); 

    // split the key on the '_' sign 
    $key = explode('_',$key); 

    /* now the $key variable is an array 
    Array 
    (
     [0] => 1 
     [1] => x 
    ) 
    */ 

    // and the first value is your message Id 
    $deleteId = $key[0]; 

    // now validate that it's a number 
    if (preg_match('/^[0-9]+$/',$deleteId,$matches) { 
     // run your delete query 
     $sql = "DELETE FROM messages WHERE id = $deleteId"; 
     mysql_query($sql); 
    } 

    // break the foreach loop, since you have what you need 
    break; 
    } 
}

Это, как правило проще, когда вы не используете изображения, так как вы можете просто разделить размещенное значение на например, ";" и вам не нужно беспокоиться о координатах. Но это по-прежнему очень простой способ получить правильную информацию и сохранить ваш HTML чистый, добавив простой идентификатор к имени кнопки изображения.

0

Вы действительно не нужен элемент do_insert2 как тип = «образ» действует как кнопки отправки и когда вы печатаете $ _POST она будет содержать значение кнопки, которая была нажата:

$_POST['delete'] = 15; 

Если вы нажали <image type="image" name="delete" value="15">