PHP - 我如何停止循环以两次注册数据?

Posted

技术标签:

【中文标题】PHP - 我如何停止循环以两次注册数据?【英文标题】:PHP - how do i stop my loop to register data twice? 【发布时间】:2015-06-28 05:21:57 【问题描述】:

我在这里遇到了问题。

下面的代码在我的网站上运行,当我填写表格并检查我的数据库时,数据已经注册了两次。

请从我的functions.php文件中获取以下php代码。

function map_location_report_form()


    global $wpdb;

    $this_page  =   $_SERVER['REQUEST_URI'];
    $page       =   $_POST['page'];

    if ( $page == NULL )
    
        echo '<form method="post" action="' . $this_page .'">

                <div class="formfield-report" id="formfield-report-firstname">
                    <label for="first_name" id="first_name">Navn: </label>
                    <input type="text" name="first_name" id="first_name" />
                </div>

                <div class="formfield-report" id="formfield-report-lastname">
                    <label for="last_name" id="last_name">Efternavn: </label>
                    <input type="text" name="last_name" id="last_name" />
                </div>

                <div class="formfield-report" id="formfield-report-locationtype">
                    <label for="location_type" id="location_type">Rapport type: </label>
                    <select name="location_type" />
                        <option value="sigtmelding" selected>Sigtmelding</option>
                        <option value="fangstrapport">Fangstrapport</option>
                        <option value="jagtomraade">Jagtområde</option>
                    </select>
                </div>

                <div class="formfield-report" id="formfield-report-latitude">
                    <label for="location_latitude" id="location_latitude">Breddegrad: </label>
                    <input type="text" name="location_latitude" id="location_latitude" />
                </div>

                <div class="formfield-report" id="formfield-report-longitude">
                    <label for="location_longitude" id="location_longitude">Længdegrad: </label>
                    <input type="text" name="location_longitude" id="location_longitude" />
                </div>

                <input type="hidden" value="0" name="page" />

                <div id="formfield-report-button">
                    <input class="btn btn-default submit-form-button" type="Submit" />
                </div>

        </form>';
     //End Page 1 of Form
    // Start Page 2 of Form
    elseif ( $page == 0 )
    
        $first_name             =   $_POST['first_name'];
        $last_name              =   $_POST['last_name'];
        $location_type          =   $_POST['location_type'];
        $location_latitude      =   $_POST['location_latitude'];
        $location_longitude     =   $_POST['location_longitude'];
        $page                   =   $_POST['page'];

        $page_one_table = 'maplocationreports';

        $page_one_inputs =  array
        (
            'first_name'            => $first_name,
            'last_name'             => $last_name,
            'location_type'         => $location_type,
            'location_latitude'     => $location_latitude,
            'location_longitude'    => $location_longitude,
            'page'                  => $page
        );

        $insert_page_one = $wpdb->insert($page_one_table, $page_one_inputs);

        echo '<h3>Mange tak for dit bidrag!</h3>';
        echo '<p>Der er sat stor pris på at du har taget dig tid til at registrere et punkt på kortet!</p>';
     // End Page 2 of Form
;

add_shortcode('map_location_report','map_location_report_form');`

如何阻止此代码两次注册数据?

提前致谢!

【问题讨论】:

【参考方案1】:

将您的 add_shortcode() 方法包装在 init 操作中

add_action('init', 'my_function');

function my_function()
    add_shortcode('map_location_report','map_location_report_form');`
 

【讨论】:

谢谢施拉万施拉玛。这解决了数据被复制的问题,但随后又出现了另一个问题。当使用 'add_action('init', 'my_function');'表单出现在标题中,从我可以从文档中阅读和理解的内容来看,它是“init”参数,它定义了表单的放置位置。如果我有一个应该显示我的表单的特定区域,我应该如何定义它?以前我使用 'add_shortcode()' 作为管理位置的解决方案。 @KimAndreasen 此解决方案适用于您的 function.php 文件。如果您创建了单独的插件文件来生成数据,则使用 add_shortcode('map_location_report','map_location_report_form'); 注册您的简码和使用 add_shortcode('in','save_report_form'); 保存所有表单数据。【参考方案2】:

检查 $_POST 如下所示

if (!empty($_POST)) 
   //Insert the values to table

if (empty($_POST)) 
   //display the form

【讨论】:

【参考方案3】:

由于某种原因,表单在标题中运行时会注册一次数据,如下所示:

add_action('init', 'map_location_report_form');

function map_location_report_form()

    global $wpdb;

    $this_page  =   $_SERVER['REQUEST_URI'];
    $page       =   $_POST['page'];

    if ( $page == NULL ) 
    
        echo '<form method="post" action="' . $this_page .'">

                <div class="formfield-report" id="formfield-report-firstname">
                    <label for="first_name" id="first_name">Navn: </label>
                    <input type="text" name="first_name" id="first_name" />
                </div>

                <div class="formfield-report" id="formfield-report-lastname">
                    <label for="last_name" id="last_name">Efternavn: </label>
                    <input type="text" name="last_name" id="last_name" />
                </div>

                <div class="formfield-report" id="formfield-report-locationtype">
                    <label for="location_type" id="location_type">Rapport type: </label>
                    <select name="location_type" />
                        <option value="sigtmelding" selected>Sigtmelding</option>
                        <option value="fangstrapport">Fangstrapport</option>
                        <option value="jagtomraade">Jagtområde</option>
                    </select>
                </div>

                <div class="formfield-report" id="formfield-report-latitude">
                    <label for="location_latitude" id="location_latitude">Breddegrad: </label>
                    <input type="text" name="location_latitude" id="location_latitude" />
                </div>

                <div class="formfield-report" id="formfield-report-longitude">
                    <label for="location_longitude" id="location_longitude">Længdegrad: </label>
                    <input type="text" name="location_longitude" id="location_longitude" />
                </div>

                <input type="hidden" value="0" name="page" />

                <div id="formfield-report-button">
                    <input class="btn btn-default submit-form-button" type="Submit" />
                </div>

        </form>';           
     //End Page 1 of Form
    // Start Page 2 of Form
    elseif ( $page == 0 ) 
    
        $first_name             =   $_POST['first_name'];
        $last_name              =   $_POST['last_name'];    
        $location_type          =   $_POST['location_type'];
        $location_latitude      =   $_POST['location_latitude'];
        $location_longitude     =   $_POST['location_longitude'];
        $page                   =   $_POST['page'];

        $page_one_table = 'maplocationreports';

        $page_one_inputs =  array
        (
            'first_name'            => $first_name,
            'last_name'             => $last_name,
            'location_type'         => $location_type,
            'location_latitude'     => $location_latitude,
            'location_longitude'    => $location_longitude,
            'page'                  => $page
        );

        $insert_page_one = $wpdb->insert($page_one_table, $page_one_inputs);

        echo '<h3>Mange tak for dit bidrag!</h3>';
        echo '<p>Der er sat stor pris på at du har taget dig tid til at registrere et punkt på kortet!</p>';                
     // End Page 2 of Form
;´

但是使用页面模板上的do_action函数在页面上运行时注册数据两次:

<?php do_action('map_location_form'); ?>

...以及 functions.php 中的代码,如下所示:

add_action('map_location_form', 'map_location_report_form');

function map_location_report_form()

    global $wpdb;

    $this_page  =   $_SERVER['REQUEST_URI'];
    $page       =   $_POST['page'];

    if ( $page == NULL ) 
    
        echo '<form method="post" action="' . $this_page .'">

                <div class="formfield-report" id="formfield-report-firstname">
                    <label for="first_name" id="first_name">Navn: </label>
                    <input type="text" name="first_name" id="first_name" />
                </div>

                <div class="formfield-report" id="formfield-report-lastname">
                    <label for="last_name" id="last_name">Efternavn: </label>
                    <input type="text" name="last_name" id="last_name" />
                </div>

                <div class="formfield-report" id="formfield-report-locationtype">
                    <label for="location_type" id="location_type">Rapport type: </label>
                    <select name="location_type" />
                        <option value="sigtmelding" selected>Sigtmelding</option>
                        <option value="fangstrapport">Fangstrapport</option>
                        <option value="jagtomraade">Jagtområde</option>
                    </select>
                </div>

                <div class="formfield-report" id="formfield-report-latitude">
                    <label for="location_latitude" id="location_latitude">Breddegrad: </label>
                    <input type="text" name="location_latitude" id="location_latitude" />
                </div>

                <div class="formfield-report" id="formfield-report-longitude">
                    <label for="location_longitude" id="location_longitude">Længdegrad: </label>
                    <input type="text" name="location_longitude" id="location_longitude" />
                </div>

                <input type="hidden" value="0" name="page" />

                <div id="formfield-report-button">
                    <input class="btn btn-default submit-form-button" type="Submit" />
                </div>

        </form>';           
     //End Page 1 of Form
    // Start Page 2 of Form
    elseif ( $page == 0 ) 
    
        $first_name             =   $_POST['first_name'];
        $last_name              =   $_POST['last_name'];    
        $location_type          =   $_POST['location_type'];
        $location_latitude      =   $_POST['location_latitude'];
        $location_longitude     =   $_POST['location_longitude'];
        $page                   =   $_POST['page'];

        $page_one_table = 'maplocationreports';

        $page_one_inputs =  array
        (
            'first_name'            => $first_name,
            'last_name'             => $last_name,
            'location_type'         => $location_type,
            'location_latitude'     => $location_latitude,
            'location_longitude'    => $location_longitude,
            'page'                  => $page
        );

        $insert_page_one = $wpdb->insert($page_one_table, $page_one_inputs);

        echo '<h3>Mange tak for dit bidrag!</h3>';
        echo '<p>Der er sat stor pris på at du har taget dig tid til at registrere et punkt på kortet!</p>';                
     // End Page 2 of Form
;

有没有一种解决方案可以在页面上显示表单而无需两次注册数据?

【讨论】:

以上是关于PHP - 我如何停止循环以两次注册数据?的主要内容,如果未能解决你的问题,请参考以下文章

循环使用可变 URL 的 api 获取请求

Vim 注册标准

我的注册码允许同一电子邮件注册两次(仅当表格连续多次提交时非常快)[重复]

php submit 提交了两次

如何停止 NVP 强迫客户注册帐户

如何使用for语句打印出1-100的偶数?