Bootstrap Typeahead自动补双全引号及ID赋值问题求助
Bootstrap Typeahead自动补全:解决双引号显示与隐藏域赋值问题
我来帮你搞定这两个问题,先拆解下代码里的问题根源,再给出针对性的修正方案:
问题根源分析
- 双引号问题:你在JS的
map函数里把item.label转成了JSON字符串(JSON.stringify(someItem.myname)),这完全是多余操作,直接导致显示的文本自带双引号。 - 隐藏域赋值失败:你传给
process的是转义后的label字符串,不是包含value(IdBio)的完整对象,所以updater里根本拿不到Id值。
另外你的PHP代码还有两处小问题:语法错误(NameBiodatafrom少了空格、where NoUrut NameBiodata多了无效字段),还有严重的SQL注入风险,我也一起帮你修正了。
修正后的代码
1. PHP代码(修复语法+防SQL注入)
<?php include "database.php"; $query = $_REQUEST['query'] ?? ''; // 使用预处理语句避免SQL注入风险 $stmt = mysqli_prepare($con, "SELECT COUNT(*) as total FROM biodata WHERE NameBiodata LIKE ?"); $likeQuery = "%{$query}%"; mysqli_stmt_bind_param($stmt, "s", $likeQuery); mysqli_stmt_execute($stmt); $result = mysqli_fetch_object(mysqli_stmt_get_result($stmt)); if ($result->total > 0) { $stmt = mysqli_prepare($con, "SELECT IdBio, NameBiodata FROM biodata WHERE NameBiodata LIKE ?"); mysqli_stmt_bind_param($stmt, "s", $likeQuery); mysqli_stmt_execute($stmt); $data_tsk = mysqli_stmt_get_result($stmt); $data = array(); while($tsk = mysqli_fetch_object($data_tsk)){ array_push($data, array('label' => $tsk->NameBiodata, 'value' => $tsk->IdBio)); } echo json_encode($data); } ?>
2. JavaScript代码(修复双引号+隐藏域赋值)
$('#name_biodata').typeahead({ source: function (query, process) { $.ajax({ url: 'ajax/auto_complete_biodata.php', type: 'POST', dataType: 'JSON', data: 'query=' + query, // 直接用回调传入的query,更准确 success: function(data) { // 直接把完整的对象数组传给process,无需转成字符串 process(data); } }); }, minLength: 1, // 指定下拉列表显示的文本为label字段 displayText: function(item) { return item.label; }, updater: function(item) { // 现在item是完整的对象,直接取value赋值给隐藏域 $("#IdBio").val(item.value); // 返回label作为输入框最终显示的内容 return item.label; } });
解决逻辑说明
- 双引号消失:不再对label做JSON转义,直接传递原始对象,通过
displayText指定显示内容,下拉列表和输入框里的文本都是正常的原始内容,没有多余双引号。 - 隐藏域成功赋值:
updater函数现在接收的是包含label和value的完整对象,直接通过item.value就能获取IdBio,赋值给隐藏域自然没问题。
内容的提问来源于stack exchange,提问作者Maestro Vladimir
相关产品推荐
相关产品推荐

