(在联系表格 7 中填充下拉列表,出现此错误 - 警告:array_keys() 期望参数 1 为数组,在

Posted

技术标签:

【中文标题】(在联系表格 7 中填充下拉列表,出现此错误 - 警告:array_keys() 期望参数 1 为数组,在【英文标题】:(populate dropdown in contact form 7 getting this error - Warning: array_keys() expects parameter 1 to be array, null given in 【发布时间】:2019-06-19 04:15:48 【问题描述】:

好的,从哪里开始,我会尽力解释。

我正在使用带有联系表格 7 的 wordpress,我正在尝试在联系表格上填充 3 个下拉项目,我发现了一些我可以毫无问题地使用的代码,但问题在于它正在获取信息从 excel 文件中,该文件现在很大,将不再在我的网站上运行,所以我想现在从我的数据库中获取信息。

我在我的数据库“vehicle_information”中创建了一个表,其中包含 3 列“vehicle_type”、“vehicle_make”、vehicle_model”

我的 functions.php 中有代码,页脚中有代码,以便能够使用 cf7 短代码。

来自 funtions.php 的代码

function ajax_cf7_populate_values() 

//mysqli information

$db_host     = '***';
$db_username = '***';
$db_password = '***';

$vehicles_makes_models = array();


//connect to mysqli database (Host/Username/Password)
$connection = mysqli_connect($db_host, $db_username, $db_password) or die('Error ' . mysqli_error());

//select MySQLi dabatase table
$vehicles_makes_models = mysqli_select_db($connection, 'vehicle_information') or die('Error ' . mysqli_error());

$sql = mysqli_query($connection, 'SELECT * FROM vehicle_type');

while($row = mysqli_fetch_array($sql)) 
$vehicles_makes_models[$row[0]][$row[1]][] = $row[2];   





    // setup the initial array that will be returned to the the client side script as a JSON object.

$return_array = array(
        'vehicles' => array_keys($vehicles_makes_models),
        'makes' => array(),
        'models' => array(),
        'current_vehicle' => false,
        'current_make' => false
    );

    // collect the posted values from the submitted form

$vehicle = key_exists('vehicle', $_POST) ? $_POST['vehicle'] : false;
$make = key_exists('make', $_POST) ? $_POST['make'] : false;
$model = key_exists('model', $_POST) ? $_POST['model'] : false;

    // populate the $return_array with the necessary values

if ($vehicle) 
    $return_array['current_vehicle'] = $vehicle;
    $return_array['makes'] = array_keys($vehicles_makes_models[$vehicle]);
    if ($make) 
    $return_array['current_make'] = $make;
    $return_array['models'] = $vehicles_makes_models[$vehicle][$make];
    if ($model) 
            $return_array['current_model'] = $model;
        
        
    

    // encode the $return_array as a JSON object and echo it

    echo json_encode($return_array);
    wp_die();



 // These action hooks are needed to tell WordPress that the cf7_populate_values() function needs to be called
 // if a script is POSTing the action : 'cf7_populate_values'

 add_action( 'wp_ajax_cf7_populate_values', 'ajax_cf7_populate_values' );
 add_action( 'wp_ajax_nopriv_cf7_populate_values', 'ajax_cf7_populate_values' );

我的页脚代码

<script>
(function($) 

    // create references to the 3 dropdown fields for later use.

    var $vehicles_dd = $('[name="vehicles"]');
    var $makes_dd = $('[name="makes"]');
    var $models_dd = $('[name="models"]');


    // run the populate_fields function, and additionally run it every time a value changes

    populate_fields();
    $('select').change(function() 
        populate_fields();
    );

    function populate_fields() 

        var data = 

            // action needs to match the action hook part after wp_ajax_nopriv_ and wp_ajax_ in the server side script.

            'action' : 'cf7_populate_values', 

            // pass all the currently selected values to the server side script.

            'vehicle' : $vehicles_dd.val(),
            'make' : $makes_dd.val(),
            'model' : $models_dd.val()
        ;

        // call the server side script, and on completion, update all dropdown lists with the received values.

        $.post('<?php echo admin_url( 'admin-ajax.php' ) ?>', data, function(response) 
            all_values = response;

            $vehicles_dd.html('').append($('<option>').text(' -- choose vehicle -- '));
            $makes_dd.html('').append($('<option>').text(' -- choose make  -- '));
            $models_dd.html('').append($('<option>').text(' -- choose model -- '));

            $.each(all_values.vehicles, function() 
                $option = $("<option>").text(this).val(this);
                if (all_values.current_vehicle == this) 
                    $option.attr('selected','selected');
                
                $vehicles_dd.append($option);
            );
            $.each(all_values.makes, function() 
                $option = $("<option>").text(this).val(this);
                if (all_values.current_make == this) 
                    $option.attr('selected','selected');
                
                $makes_dd.append($option);
            );
            $.each(all_values.models, function() 
                $option = $("<option>").text(this).val(this);
                if (all_values.current_model == this) 
                    $option.attr('selected','selected');
                
                $models_dd.append($option);
            );
        ,'json');
    

)( jQuery );

问题是我还在学习,这是我第一次不得不使用这个功能。

我的网站出现错误

警告:array_keys() 期望参数 1 为数组,/customers/4/0/0/motobid.co.uk/httpd.www/wp-content/themes/storevilla-child/functions.php 中给出的 null在第 38 行 "vehicles":null,"makes":[],"models":[],"current_vehicle":false,"current_make":false

任何帮助都会非常有用。

就像说代码是由 BDMW 提供的。

【问题讨论】:

您将mysqli_select_db()(这是一个布尔值)的响应分配给您以后尝试用作数组的变量$vehicles_makes_models?如果查询将返回任何结果,您还应该在 while 循环中收到如下警告:“警告:不能将标量值用作数组” 您还应该编辑您的数据库用户并在发布代码时传递。该错误告诉您 $vehicles_makes_models 不是数组,正如 magnus 所说,您将其分配给 mysqli_select_db() ,它返回一个布尔值(真/假) 您实际上可以完全删除mysqli_select_db(),并将数据库名称作为第四个参数传递给mysqli_connect() @MagnusEriksson 感谢您提供的信息和对我帖子的编辑(我以为我这样做了,但有时必须再次复制代码)我的错。在您的回复中,我会摆脱 mysqli_db() 还是需要添加更多代码?请问你有例子吗? @Second2None 感谢您的回复 【参考方案1】:

你在哪里使用方法array_keys(),而不是:

  $return_array['makes'] = array_keys($vehicles_makes_models[$vehicle]);

试试这个:

$return_array['makes'] = ! empty($vehicles_makes_models[$vehicle]) ? array_keys($vehicles_makes_models[$vehicle]) : [];

根据我的阅读,array_keys() 一直是一个问题,具体取决于 php 版本。希望这会有所帮助!

【讨论】:

以上是关于(在联系表格 7 中填充下拉列表,出现此错误 - 警告:array_keys() 期望参数 1 为数组,在的主要内容,如果未能解决你的问题,请参考以下文章

试图在选择下拉列表中选择值但是它只给我文本值?联系表格 7

联系表格 7 - Wordpress - 从 <select> 下拉列表中选择默认值

在下拉列表中选择特定值时如何在联系表单 7 中启用字段

访问子表单可见性

怎么把EXCEL内容自动填充到WORD里?

根据以前的表单输入和来自 MySQL 的数据填充下拉列表