2011-01-26 1 views
0

Я делал все это неправильно, я использовал значение из сегмента URI и не понимал, что это не идеальный способ. Поэтому я изменил свой подход, и теперь у меня есть все через $ _POST. Я не уверен, правильно ли я делаю это, может кто-то пролить свет? В моем представлении перечислены элементы списка данных, извлеченные из БД. Каждый элемент имеет две ссылки: «Вид» и «Удалить». Код, похоже, работает, но было интересно, можно ли его кодировать лучше. Я забыл, что имя формы не было уникальным, поэтому, когда я пошел удалить запись, она всегда удаляла бы самую новую запись (последнее скрытое поле было установлено).

myview.php (фрагмент)

<?php foreach($records as $record): ?> 
    <form method="POST" name="myform<?php echo $location->id;?>" action="/location/delete"> 
    <a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo $location->id;?>.submit();">Delete</a> 
    <br /> 
    <input type="hidden" name="location_id" value="<?php echo $location->id;?>"> 
    </form> 
<?php endforeach ?> 
+0

'Я делал все неправильно,' - говорит кто? Предоставление вашего приложения контролируется, удаление через сегмент URI является вполне жизнеспособным решением. Кроме того, ваш код использует '$ records в качестве $ record', но вы называете его' $ location' - не подходит правильно – Ross

+0

, и я бы использовал абсолютные URL-адреса, используя метод 'base_url()', чтобы избежать будущей проблемы (перемещение проекта в подпапку..etc) – ifaour

+0

Почему бы не немного поправить приложение и сделать асинхронный пост-запрос для удаления записи? Таким образом вам не придется использовать несколько форм вообще. – Myth

ответ

1

Для тех, кто сталкивается с этим позже, вот как я решил свою проблему.

В моем контроллере у меня есть метод под названием delete, который проверяет, было ли поле формы отправлено через $_POST. Если нет переменной, перенаправляйте их где-нибудь с сообщением об ошибке. Если поле было передано, выполните обычные проверки, чтобы убедиться, что запись может быть удалена.

if(!isset($_POST['item_id'])) 
{ 
    $this->session->set_flashdata('message', 'item cannot be removed!'); 
    redirect("/item"); 
} 


if($this->input->post('item_id')) {   
    ... code .... 
    ... code .... 
} 
1

Просмотр/удаление с помощью Uri ид совершенно нормально, я бы не рискнул сказать, что использование $_POST неправильно, но создает новую уникальную форму для каждой удалить элемент ужасно грязный, и взвесился против того, что вы набираете (без выставленного id я думаю?), я считаю, что более корректно использовать uri для функций удаления.

Если вы хотите, чтобы определенные люди могли удалять определенные записи, обрабатывайте их программно в самой функции удаления, не зависеть от того, что запрос отправляется только через $_POST. Это не является надежным, любой может генерировать почтовый запрос.

+0

Да, у меня есть чеки, чтобы убедиться, что запись, которую они пытаются удалить, принадлежат им. Я видел ссылки на атаки на межсайтовый сайт, а что нет. Самой большой проблемой будет тот, кто передает URL-адрес, содержащий идентификатор записи (если они это знают), и человек не сознательно нажимает на него и бум, до свидания. – luckytaxi

+0

, так что ситуация, которую вы пытаетесь предотвратить, - это то, что кто-то узнает идентификатор записи и пользователь, к которому он принадлежит, создавая ссылку на другом сайте, обманывая того конкретного пользователя, к которому он принадлежит, чтобы щелкнуть ссылку ...: | Я думаю, что было бы легче получить пользователя в точке пистолета и заставить его войти и удалить его сами. ;) – jondavidjohn

0

Ваша ошибка синтаксиса с этой строкой:

<?php foreach($records as $record): ?> 
     <form method="POST" name="myform<?php echo $location->id;?>"  action="/location/delete"> 
     <a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo 
$location->id;?>.submit();">Delete</a> 
     <br /> 
      <input type="hidden" name="location_id" value="<?php echo $location->id;?>"> 
     </form> 
     <?php endforeach ?> 

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

<form method="POST" name="myform<?php echo $location->id;?>" action="/location/delete"> 
<?php foreach($records as $record): ?> 
    a href="/location/view/<?php echo $location->id;?>">View</a> <a href="#" onclick="document.myform<?php echo $location->id;?>.submit();">Delete</a> 
     <br /> 
     <input type="hidden" name="location_id" value="<?php echo $location->id;?>"> 
    <?php endforeach ?> 
     </form>