Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过AJAX从单选按钮的形式向wp数据库添加序列化数据_Php_Arrays_Ajax_Wordpress_Serialization - Fatal编程技术网

Php 通过AJAX从单选按钮的形式向wp数据库添加序列化数据

Php 通过AJAX从单选按钮的形式向wp数据库添加序列化数据,php,arrays,ajax,wordpress,serialization,Php,Arrays,Ajax,Wordpress,Serialization,我有一个wordpress帖子,它显示了一个由几首列出的歌曲组成的表单,每首歌曲有两个单选按钮(“播放”和“不播放”) 我想将这些单选按钮的数据作为两组串行数据存储在我的数据库中,即如果选中了“播放”单选按钮 1:do_play=歌曲名称1 2:do_play=歌曲名称2 3:do_play=歌曲名称3 4:do_play=歌曲名称4 5:do_play=歌曲名称5 a:5:{i:0;s:11:"Song name 1";i:1;s:11:"Song name 2";i:2;s:11:"Song

我有一个wordpress帖子,它显示了一个由几首列出的歌曲组成的表单,每首歌曲有两个单选按钮(“播放”和“不播放”)

我想将这些单选按钮的数据作为两组串行数据存储在我的数据库中,即如果选中了“播放”单选按钮

1:do_play=歌曲名称1 2:do_play=歌曲名称2 3:do_play=歌曲名称3 4:do_play=歌曲名称4 5:do_play=歌曲名称5

a:5:{i:0;s:11:"Song name 1";i:1;s:11:"Song name 2";i:2;s:11:"Song name 3";i:3;s:11:"Song name 4";i:4;s:11:"Song name 5";}
对于从“不播放”中选择的歌曲,相同,但在不同的DB行中:

1:do_play=歌曲名称6 2:do_play=歌曲名称7 3:do_play=歌曲名称8 4:do_play=歌曲名称9 5:do_play=歌曲名称10

a:5:{i:0;s:11:"Song name 6";i:1;s:11:"Song name 7";i:2;s:11:"Song name 8";i:3;s:11:"Song name 9";i:4;s:11:"Song name 10";}
我想通过AJAX实现这一点,并将条目添加到wp_postemta表中。以下是我的表单html的一个示例:

<form id="songChoices-12028" method="POST">
        <input type="hidden" id="booking_id" name="booking_id" value="12028">
        <ul class="setlist_container">


            <li class="song_entry ">Ain’t No Sunshine - 
                <em>Bill Withers</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-397">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-397">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry ">No Diggity - 
                <em>Blackstreet</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12036">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12036">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 7-8-piece drinks-reception">Pricetag - 
                <em>Jessie J</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12038">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12038">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Rehab - 
                <em>Amy Winehouse</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12039">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12039">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Rolling in the Deep - 
                <em>Adele</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12035">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12035">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Sittin’ on the Dock of the Bay - 
                <em>Otis Redding</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-398">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-398">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Summer of ’69 - 
                <em>Bryan Adams</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12037">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12037">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>
                        </ul>
    </form>
然后,最重要的是,处理向数据库发送数据的函数:

function updateSetlistInfo() {

    if(empty($_POST) || !isset($_POST)) {
        self::ajaxStatus('error', 'Nothing to update.');
    } else {
        $data = $_POST;

        $dataString = $data['post'];
        parse_str($dataString, $dataArray);

        $nonce = $data['nonce'];

        if(wp_verify_nonce($nonce, 'update_user_info') !== false) {

            $user_ID = get_current_user_id();
            $post_id = $dataArray['booking_id'];
            //$dataArray['user_addressLine1'] = isset($dataArray['user_addressLine1']) ? $dataArray['user_addressLine1'] : false;


            if($user_ID != NULL) {
                foreach($dataArray as $key=>$value) {

                $status = update_post_meta($post_id, $key, $value);

            }
                self::ajaxStatus('success', 'Meta fields updated.', $dataArray);

            } else {
                self::ajaxStatus('error', 'You are unauthorized to perform this action.', $dataArray);
            }
        } else {
            self::ajaxStatus('error', 'Nonce check cannot fail.');
        }
    }
}

以上内容取自我页面上的另一个表单,该表单通过ajax向数据库提交用户地址详细信息。但是,这只是为每个表单项添加了一个新行——我希望有两行,“do_play”和“Don_play”,并在其中建立一个序列化数据数组。在这一点上,任何建议都会有很大帮助,因为我有点卡住了。好的,您没有包括包含
updateSetlistInfo()方法的完整类。但是你提供的看起来还可以

我要调试的第一件事是
$dataArray
。 它真的有2个(玩/不玩)键吗

添加以下内容(就在foreach调用之前):

您的foreach将每个(顶级)键保存为post_meta_键

像这样:

define( "WP_DEBUG", false );
我希望你明白现在发生了什么。作为开发人员,您必须经常使用调试日志。当你想检查是否一切都按预期运行时,它总是第一件事

我希望我给你指明了正确的方向,你可以在没有我帮助的情况下进一步调试你的应用程序。因为现在它超出了stackoverflow的范围,我不能帮助你一步一步地调试你的应用程序


WP调试
wp config.php
中,更改:

define( "WP_DEBUG", true );// just toggle this line to false to turn off
if ( WP_DEBUG ) {
    define( "WP_DEBUG_DISPLAY", false );
    define( "WP_DEBUG_LOG", true );
    @ini_set( "display_errors", 0 );
    define( "SCRIPT_DEBUG", true );
}
进入:


然后安装一个插件。

Hi@Bjorn-你能解释一下调试$dataArray中的内容的最佳方法吗?好的,很好,我已经安装了调试日志查看器,更改了wp-config.php,并在我的updateSetlistinfo()函数的foreach语句之前添加了tht行-当我提交
错误日志时,调试查看器中目前没有显示错误(“调试日志工作”)
直接在你的functions.php中,并确认它正在工作。好的,因此你尝试了ajax调用,但没有看到
$dataArray
日志项。这意味着代码没有被调用。现在你可以继续进行调试,直到看到日志,然后你就会知道代码执行停止的位置。我将从放置
er开始ror_log()
就在
updateSetlistInfo()之后
打开标签,检查它是否真的被ajax动作挂钩调用。还有一件事,你是从某处复制了这段代码吗?你有任何wp_ajax知识吗?我想了解你的技能水平。我假设你使用wright动作挂钩来设置ajax调用。你在哪里调用ajax,前端还是后端?
array(
  "status" => "success",
  "message" => "Meta fields updated.",
  "data" => array(
    "booking_id" => "12031"
    "songChoice" => array(
      "2" => "dont_play",
      "7" => "dont_play",
    )
  )
)
update_post_meta($post_id, 'status', 'success');
update_post_meta($post_id, 'message', 'Meta fields updated.');
update_post_meta($post_id, 'data', ARRAY_THAT_HOLDS_BOOKINGID_SONGCHOICE);
define( "WP_DEBUG", false );
define( "WP_DEBUG", true );// just toggle this line to false to turn off
if ( WP_DEBUG ) {
    define( "WP_DEBUG_DISPLAY", false );
    define( "WP_DEBUG_LOG", true );
    @ini_set( "display_errors", 0 );
    define( "SCRIPT_DEBUG", true );
}