Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.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&;前端WordPress-数据库未更新_Php_Jquery_Ajax_Wordpress - Fatal编程技术网

Php Ajax&;前端WordPress-数据库未更新

Php Ajax&;前端WordPress-数据库未更新,php,jquery,ajax,wordpress,Php,Jquery,Ajax,Wordpress,所以我在一个WordPress网站上工作。我在获取用户输入以更新数据库时遇到了一些困难 JS: PHP(编辑items.PHP) 每当我尝试更新表时,我都能够在前端成功地进行更新,但在刷新时,数据更改不会持续。检查数据库进一步验证数据是否未更改。。。看起来“成功”是通过AJAX传递的,但出于某种原因,它没有更新数据库 任何关于这方面的见解都会很有帮助 编辑 决定开始使用admin ajax.php方法。一切都是一样的,只是我将JS中的url更改为url:“/wp admin/admin ajax

所以我在一个WordPress网站上工作。我在获取用户输入以更新数据库时遇到了一些困难

JS:

PHP(编辑items.PHP)

每当我尝试更新表时,我都能够在前端成功地进行更新,但在刷新时,数据更改不会持续。检查数据库进一步验证数据是否未更改。。。看起来“成功”是通过AJAX传递的,但出于某种原因,它没有更新数据库

任何关于这方面的见解都会很有帮助

编辑 决定开始使用
admin ajax.php
方法。一切都是一样的,只是我将JS中的url更改为
url:“/wp admin/admin ajax.php”
,并且
edit items.php
中的代码现在位于
functions.php
中,如下所示:

 function editCommittee() {  
  global $wpdb;

if($_POST['id']) {
    $id = esc_sql($_POST['id']);
    $name = esc_sql($_POST['name']);
    $created = esc_sql($_POST['createDate']);
    $stats = esc_sql($_POST['stats']);
    $dateExpire = esc_sql($_POST['dateExpire']);

    $wpdb->update('itemsTable',
                array(
                    'name' => $name
                ),
                array(
                    'committee_id' => $id
                ),

                array(
                  '%s'
                )
  );
  echo $id;
  exit();
  }
}
add_action('wp_ajax_editItems', 'editItems');

我很确定您没有将POST数据发送到PHP文件-请检查它。在php中键入
var\u dump($\u POST)
,并在ajax的成功部分添加
console.log(html)

还可以尝试将JS中的
dataString
变量更改为:

var dataString = {
 id:ID,
 name:name,
 createDate:createDate,
 stats:stats,
 dateExpire:dateExpire
};

问题是,对于ajax请求,我们使用
http://example.com/wp-admin/admin-ajax.php

此外,您的数据字符串应该包含
&action=editItems
(与您在
wp\u ajax\u editItems
中使用的相同)

您的ajax请求代码应该如下所示

  $.ajax({
    type: "POST",
    url: "/wp-admin/admin-ajax.php",
    data: dataString + '&action=editItems',
    cache: false,
    error: function(xhr, status, error) {
      var err = eval("(" + xhr.responseText + ")");
      alert(err.Message);
    },
    success: function (html) {
      $("#name_"+ID).html(name);
      $("#createDate_"+ID).html(createDate);
      $("#stats_"+ID).html(stats);
      $("#dateExpire_"+ID).html(dateExpire);
    }
  });
有关更多详细信息,请查看


希望有帮助:)

好的,首先本地化您的
ajaxurl
对象

add_action( 'wp_enqueue_scripts', 'frontend_enqueued_scripts' );

/**
 * Localization object
 *
 * @since 1.0.0
 */
function frontend_enqueued_scripts() {

    wp_enqueue_script( 'script', get_template_directory_uri() . '/js/custom.js', array( 'jquery' ), '', true );
    wp_localize_script( 'script', 'ajax_object', array(
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
    ));
}
如果有,在
functions.php
中,您将前端脚本排队的地方将
wp\u enqueue\u脚本和
wp\u localize\u脚本的一部分放在那里。另外,如果您将ajax调用javascript放在一个未命名为
custom.js
的文件中,请更改名称以指向该文件。我总是使用
custom.js
作为存储所有与主题相关的javascript的文件

上述代码将在前端创建一个
ajax\u对象
对象,该对象将可用于
custom.js
中的代码,因为您已将其附加到该脚本中。排队文件和本地化脚本(在我们的例子中是
script
)中的句柄必须相同才能工作

然后,您可以在
functions.php
文件中,或者在您放置ajax函数的任何包含文件中创建回调函数

/**
 * Front and back end ajax hooks.
 */
add_action( 'wp_ajax_edit_committee', 'edit_committee' );
add_action( 'wp_ajax_nopriv_edit_committee', 'edit_committee' );

/**
 * Ajax callback function
 *
 * @since 1.0.0
 */
function edit_committee() {
    global $wpdb;

    if ( isset( $_POST['id'], $_POST['committee_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['committee_nonce'] ), 'committee_nonce_action' ) && '' !== $_POST['id'] ) { // Input var okay.
        $id          = ( isset( $_POST['id'] ) && '' !== $_POST['id'] ) ? sanitize_text_field( wp_unslash( $_POST['id'] ) ); : ''; // Input var okay.
        $name        = ( isset( $_POST['name'] ) && '' !== $_POST['name'] ) ? sanitize_text_field( wp_unslash( $_POST['name'] ) ); : ''; // Input var okay.
        $created     = ( isset( $_POST['create_date'] ) && '' !== $_POST['create_date'] ) ? sanitize_text_field( wp_unslash( $_POST['create_date'] ) ); : ''; // Input var okay.
        $stats       = ( isset( $_POST['stats'] ) && '' !== $_POST['stats'] ) ? sanitize_text_field( wp_unslash( $_POST['stats'] ) ); : ''; // Input var okay.
        $date_expire = ( isset( $_POST['date_expire'] ) && '' !== $_POST['date_expire'] ) ? sanitize_text_field( wp_unslash( $_POST['date_expire'] ) ); : ''; // Input var okay.

        $updated = $wpdb->update( 'itemsTable', array(  'name' => $name ), array( 'committee_id' => $id ), array( '%s' ) );
        if( false !== $updated ) {
            wp_die( 'success' );
        } else {
            wp_die( 'fail' );
        }

    }
}
我加了消毒检查。在表单中包含用于提交数据的nonce是至关重要的

您可以通过放置

wp_nonce_field( 'committee_nonce_action', 'committee_nonce' );
在前端的
元素内部。这将生成一个安全性测试,这是一个很好的安全措施,尤其是在向数据库写入数据时

回调函数将检查nonce是否已设置,以及
$\u POST['id']
变量是否已设置且不为空,并将首先验证nonce

然后您可以继续执行该函数

我把所有的
$POST
变量都放在那里了,尽管您没有使用它们,但以后可能会想使用它们。我还对它们进行了消毒和脱毛

//输入变量正常。
注释用于phpcs,您可以忽略它

然后执行更新。如果数据库中有
itemsTable
,则应使用您提供的数据对其进行更新

最后但并非最不重要的是javascript代码。我假设您是通过某种按钮点击来执行ajax调用的。这需要更改以使其工作(我使用了
#update_按钮
,您将放置正确的按钮id或类别)

我还将变量名改为
short\u name
格式,而不是
shortName
。我觉得那更整洁

请注意,对于url,我们使用了
ajax\u object.ajaxurl
——这是从一开始就本地化的
ajax\u对象
,引用了
admin ajax.php
文件的正确路径。数据只是字符串,但作为对象写入

因此,当您单击该按钮时,ajax调用将把所有数据放在一个全局
$\u POST
变量中

您可以通过运行inspector并单击网络>XHR选项卡来检查它

另外,如果您不确定
$\u POST
变量包含的内容,请将

error_log(print_r($_POST, true));
在您的
edit_committee()
函数中,就在验证检查(if条件)之前。如果在
wp config.php中启用了调试

define('WP_DEBUG', true);
ini_set('log_errors',TRUE);
ini_set('error_reporting', E_ALL);
ini_set('error_log', dirname(__FILE__) . '/error_log.txt');
WordPress安装的根目录中有
error\u log.txt
,您可以检查
$\u POST
变量的内容


希望这有帮助;)

似乎没有任何东西被打印到控制台上。然而,我得到了这个错误:
jquery.js?ver=1.12.4:4 POSThttp://url.com/~directory/committee\u edit\u ajax.php 500(内部服务器错误)
有趣的是,每当我将ajax url设置为
“./wp admin/admin ajax.php”
时,只要前端的输入更新,它就会向控制台打印0(但仍然没有更新到数据库)如果您想使用admin-ajax.php,请查看示例表单文档:对POST 500内部服务器错误有何想法?如果这不起作用,我可能会使用admin-ajax.php方法。老实说,我不确定该方法是否仅限于在管理仪表板端使用ajax……请查看php错误日志,了解它提供内部服务的原因r错误。您是否在
edit items.php
中加载了wp core?否,
edit items.php
仅包含我原始帖子中的php。我回家后将检查php错误日志您正在传递字符串格式,您无法访问$\u post['id'],而不是像Tomsaz建议的那样传递json,并在json中添加另一个键,action:'editCommittee'和echo'success';和die;在php函数editCommittee@sleepy_dazeI的末尾设置了以下内容:
data:dataString,
dataTyp
wp_nonce_field( 'committee_nonce_action', 'committee_nonce' );
jQuery(document).ready(function($) {
    'use strict';

    $('#update_button').on('click', function(e){
        e.preventDefault();

        var ID = $(this).attr('id'); // Button that is clicked is in $(this) object
        var name = $('#name_input_'+ID).val();
        var create_date = $('#created_input_'+ID).val();
        var stats = $('#status_input_'+ID).val();
        var date_expire = $('#disbanded_input_'+ID).val();

        // Can place loading image here
        if ( name.length > 0 || create_date.length > 0 || stats.length > 0 || date_expire.length > 0 ) {
            $.ajax({
                type: 'POST',
                url: ajax_object.ajaxurl,
                data: {
                    'action' : 'edit_committee',
                    'id' : ID,
                    'name' : name,
                    'create_date' : create_date,
                    'stats' : stats,
                    'date_expire' : date_expire,
                    'committee_nonce' : $( '#committee_nonce' ).val()
                },
                cache: false,
                error: function( jqXHR, textStatus, errorThrown ) {
                    console.log( jqXHR + ' :: ' + textStatus + ' :: ' + errorThrown );
                },
                success: function (html) {
                    if ( html == 'success' ) {
                        $('#name_'+ID).html(name);
                        $('#createDate_'+ID).html(create_date);
                        $('#stats_'+ID).html(stats);
                        $('#dateExpire_'+ID).html(date_expire);
                    }
                }
            });
        } else {
            alert('Enter text to make an edit.');
        }

    });

});
error_log(print_r($_POST, true));
define('WP_DEBUG', true);
ini_set('log_errors',TRUE);
ini_set('error_reporting', E_ALL);
ini_set('error_log', dirname(__FILE__) . '/error_log.txt');