【问题标题】:How to stop resubmission php如何停止重新提交php
【发布时间】:2014-12-22 16:14:15
【问题描述】:

我尝试使用 header('location:login.php');但它不起作用,甚至不会重定向页面。有任何想法吗? 我也尝试使用 JavaScript 删除输入,但重新提交不会停止。 无论放在哪里 header('location:login.php');它不会工作。

if(isset($_POST['vrsta_predmeta']) AND !empty($_POST['vrsta_predmeta']) AND 

    isset($_POST['res_text']) AND isset($_POST['glavni_dug']) AND isset($_POST['res']) AND isset($_POST['zaklj']) AND isset($_POST['povjerilac']) AND isset($_POST['duznik']) AND isset($_POST['predmet_zaveden'])){


    $racunob =  trim($_POST['rac']);
    $obrazlozenje = trim($_POST['obr']);     
    $ob_text = trim($_POST['res_ob']);  
    $res_text = trim($_POST['res_text']);
    $vrsta_pre = trim($_POST['vrsta_predmeta']);
    $izvrsenje = trim(strtolower($_POST['res']));
    $obrazac = trim($_POST['zaklj']);
    $povjerilac = $_POST['povjerilac'];
    $duznik = $_POST['duznik'];
    $datum= trim($_POST['predmet_zaveden']);
     foreach($povjerilac as $key){
     $lica = $db -> prepare("INSERT INTO p_lica(povjerilac, doc_br, dokument_vlasnik) VALUES('$key', '$dok_broj', '$ses_val')");



    }       


    foreach($duznik as $key1){
     $lica1 = $db -> prepare("INSERT INTO d_lica(duznik,doc_br, dokument_vlasnik) VALUES('$key1', '$dok_broj', '$ses_val')");


    }

    $insert_dok = $db -> prepare("INSERT INTO document_tbl(dokument_vlasnik,dokument_broj,vrsta_dokumenta,zakljucak, resenje_izvrsenja,datum,resenje_text,obrazlozenje,obtext,racunob) VALUES('$ses_val','$dok_broj', '$vrsta_pre','$obrazac','$izvrsenje','$datum','$res_text','$obrazlozenje','$ob_text','$racunob')");
    if($lica -> execute() AND $insert_dok -> execute() AND $lica1 -> execute()){


       $lica -> close();
       $lica1 -> close();
       $insert_dok -> close();


      echo '<script>new Messi(\'Dokument uspjesno dodat.\', {title: \'Obavjestenje\', titleClass: \'success\', buttons: [{id: 0, label: \'Close\', val: \'X\'}]});</script>';
    header('location:login.php');
      }else{
       echo '<script>new Messi(\'Dokument uspjesno dodat.\', {title: \'Obavjestenje\', titleClass: \'anim warning\', buttons: [{id: 0, label: \'Close\', val: \'X\'}]});</script>'; 
    }

}

【问题讨论】:

  • 如果不绑定单个参数,为什么要使用准备好的语句?你的一半代码是完全没有必要的。你是在学习 PHP 还是这应该是生产代码?
  • 应该是生产代码。什么部分是不必要的?
  • 我将发布一个解决代码本身的答案,因为它应该是生产的。这是不安全的,并且容易发生 SQL 注入。同时,我建议接受约翰康德的回答,因为它是正确的。
  • 不可注射。我应该在开始时添加这个:ob_start(); ,这是正确的答案。
  • 好吧,如果你说不是,那我想没关系。祝你好运(为我节省了大量的打字时间)。此外,添加 ob_start() 不是正确答案。可悲的是,代码和“解决方案”非常错误,我建议您以正确的方式修复它。将代码投入生产是错误的。

标签: php forms redirect post


【解决方案1】:

输出内容后不能重定向。由于您输出 JavaScript,因此您需要将重定向更改为由 JavaScript 完成。

echo '<script>new Messi(\'Dokument uspjesno dodat.\', {title: \'Obavjestenje\', titleClass: \'success\', buttons: [{id: 0, label: \'Close\', val: \'X\'}]});</script>';
header('location:login.php');
//^^^ This won't work.
// Try this instead. Redirects five seconds after the page is loaded.
echo 'window.setTimeout(function() {window.location = "login.php"}, 5000);';

至于表单重新提交问题,需要实现POST/REDIRECT/GET pattern。基本上,您需要使用 303 HTTP 标头进行重定向,以防止浏览器重新提交页面。处理完表单后,您将使用类似的方法进行重定向:

header('Location: /login.php', true, 303);
exit;

【讨论】:

    【解决方案2】:

    我制作了一个加密应用程序,用于将我的密码保存在我的服务器上。如果我忘记关闭选项卡并让某人重新提交我的会话以获得对我所有站点密码的访问权限,我不希望我的会话被劫持。我想出的是将登录页面的时间戳传递到主页。如果重新提交,这个时间会被记住。然后我有javascript比较时间。如果时间不在 5 秒内,我将其禁用并清除所有变量,以防设置阻止重定向,然后重定向到登录页面。

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 2013-02-11
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多