Кнопка изображения PHP / HTML - PullRequest
       0

Кнопка изображения PHP / HTML

1 голос
/ 04 октября 2010

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

<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> 

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

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

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

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

Ответы [ 5 ]

0 голосов
/ 04 октября 2010

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

$_POST['delete'] = 15;

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

0 голосов
/ 04 октября 2010

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

<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
)

Если щелкнуть изображение с «delete; 2», будет опубликовано только «delete; 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 голосов
/ 04 октября 2010

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

<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 голосов
/ 04 октября 2010

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

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

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

0 голосов
/ 04 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...