(在联系表格 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 为数组,在的主要内容,如果未能解决你的问题,请参考以下文章