提交时$_POST为空(相同代码,相同表单在本地服务器上正常提交)

时间:2016-11-08 作者:drake035

我的代码已经过检查,看起来还可以,所以问题可能在于htaccess 文件,其在我的联机服务器上的内容为:

SetEnv PHP_VER 5_4
Options -Indexes
ErrorDocument 404 /index.php
RewriteEngine on 
RewriteCond %{HTTP_HOST} !^www.example.fr$
RewriteRule ^(.*)   http://www.example.fr/$1  [QSA,L,R=301] 
为什么会这样htaccess 是否会阻止表单在我的网站上正确提交?

以防万一,这是我的代码:

<form id=\'contact_form_mmt\' action=\'<?php echo bloginfo("wpurl"); ?>/contact\' method=\'post\'>
  <input type=\'text\' name=\'contact_nom\' placeholder=\'Votre nom *\' data-validation=\'length\' data-validation-length=\'min3\' data-validation-error-msg=\'<?php echo $text_too_short_or_empty; ?>\'>  
  <input type=\'text\' name=\'contact_prenom\' placeholder=\'Votre prénom *\' data-validation=\'length\' data-validation-length=\'min3\' data-validation-error-msg=\'<?php echo $text_too_short_or_empty; ?>\'>
  <input type=\'text\' name=\'contact_mail\' placeholder=\'Votre mail *\' data-validation=\'email\' data-validation-length=\'min3\' data-validation-error-msg=\'<?php echo $email_valid; ?>\'>
  <select name=\'contact_destinataire\'>
    <option value="[email protected]|Information générales">Information générales</option>
    <option value="[email protected]|Problèmes liés au site">Problèmes liés au site</option>
  </select>
  <textarea name=\'contact_message\' placeholder=\'Message *\'data-validation=\'length\' data-validation-length=\'min3\' data-validation-error-msg=\'<?php echo $text_too_short_or_empty; ?>\'></textarea>  
  <input type=\'hidden\' name=\'sub\' value=\'1\'>  
  <input type=\'submit\' value=\'envoyer\'>
</form>
PHP(我知道语法很难看,我会改进):

if ( isset($_POST[\'sub\']) ) $sub = $_POST[\'sub\']; else $sub = \'\'; 
if ( isset($_POST[\'contact_nom\']) ) $contact_nom = $_POST[\'contact_nom\']; else $contact_nom = \'\'; 
if ( isset($_POST[\'contact_prenom\']) ) $contact_prenom = $_POST[\'contact_prenom\' ]; else $contact_prenom = \'\'; 
if ( isset($_POST[\'contact_mail\']) ) $contact_mail = $_POST[\'contact_mail\']; else $contact_mail = \'\'; 
if ( isset($_POST[\'contact_sujet\']) ) $contact_sujet = $_POST[\'contact_sujet\']; else $contact_sujet = \'\'; 
if ( isset($_POST[\'contact_destinataire\']) ) $contact_destinataire = $_POST[\'contact_destinataire\']; else $contact_destinataire = \'\'; 
if ( isset($_POST[\'contact_message\']) ) $contact_message = $_POST[\'contact_message\']; else $contact_message = \'\'; 

3 个回复
最合适的回答,由SO网友:haz 整理而成

在Wordpress中处理表单帖子的最佳方法是使用特殊端点,/wp-admin/admin-post.php.

POST数据可能会被WP查询调用和发生的任何重定向弄得一团糟。

因此,您可以使用以下操作设置表单:

<form action="<?= admin_url(\'admin-post.php\') ?>" method="post">
<input type="hidden" name="action" value="special_action">
<?php wp_nonce_field(\'special_action_nonce\', \'special_action_nonce\'); ?>
然后,您可以通过向主题或插件添加操作来处理表单:

add_action(\'admin_post_nopriv_special_action\', [\'My\\Plugins\\FormController\', \'specialAction\']);
add_action(\'admin_post_special_action\', [\'My\\Plugins\\FormController\', \'specialAction\']);
注意,Wordpress基于action 表中的值,admin_post_no_priv_special_action (如果您已注销)和admin_post_special_action (如果您已登录)。您可以将其指向不同的位置。

这些操作端点将始终有权访问POST,并且永远不会触发重定向(这通常是Wordpress为漂亮的路由所做的……它通常路由:site.com/aboutsite.com/?pageName=about)。

一旦按需要处理了表单,就可以执行wp_redirect() 去你需要的地方。这也很有用,因为意外的页面刷新不会重新发送表单。

在这里可以找到更长的文档:https://www.sitepoint.com/handling-post-requests-the-wordpress-way/

SO网友:sMyles

问题是你的htaccess 因为您正在重定向到另一个URL,导致POST数据不再可用。

RewriteRule ^(.*)   http://www.example.fr/$1 [QSA,L,R=301] 
应该是

RewriteRule ^(.*)   /$1 [QSA,L,R]
您还可以将其设置为在帖子上不重定向:

RewriteCond %{REQUEST_METHOD} !POST [NC]
或者,使用307重定向,这将保留POST数据https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection

您还可以使用PHP速记IF语句,并建议使用array_key_exists 结束isset 检查阵列时

$sub = array_key_exists( \'sub\', $_POST ) ? $_POST[ \'sub\' ] : \'\';
$contact_nom = array_key_exists( \'contact_nom\', $_POST ) ? $_POST[ \'contact_nom\' ] : \'\';
$contact_prenom = array_key_exists( \'contact_prenom\', $_POST ) ? $_POST[ \'contact_prenom\' ] : \'\';
$contact_mail = array_key_exists( \'contact_mail\', $_POST ) ? $_POST[ \'contact_mail\' ] : \'\';
$contact_sujet = array_key_exists( \'contact_sujet\', $_POST ) ? $_POST[ \'contact_sujet\' ] : \'\';
$contact_destinataire = array_key_exists( \'contact_destinataire\', $_POST ) ? $_POST[ \'contact_destinataire\' ] : \'\';
$contact_message = array_key_exists( \'contact_message\', $_POST ) ? $_POST[ \'contact_message\' ] : \'\';

https://davidwalsh.name/php-ternary-examples

您还应该清理来自前端表单的数据,以防止任何可能的安全漏洞https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data

为什么不使用类似火山口形状的东西来为您处理所有这些?https://wordpress.org/plugins/caldera-forms/

SO网友:Michelle

您可能需要使用bloginfo(\'url\') 又称作home_url() (显示的站点)而不是bloginfo(\'wpurl\') 又称作site_url() (wordpress文件位置),例如:

action="<?php echo home_url(\'/contact/\'); ?>"

相关推荐

使用htaccess重定向主页,除非我输入添加“/home”的链接

我正在尝试做一些具体的事情,这可能有点复杂,我不知道怎么做。这就是我对htaccess的了解:RewriteOptions inherit RewriteCond %{HTTP_HOST} ^homepageA\\.ar$ [OR] RewriteCond %{HTTP_HOST} ^www\\.homepageA\\.ar$ RewriteRule ^/?$ "https\\:\\/\\/homepageB\\.ar\\/" [R=301,L] -用