我刚刚开始开发网站,我对 wordpress、php、mysql、jquery 很陌生,希望有人能帮助我解决我几个月来一直试图解决的问题,谢谢
目标:让用户能够在搜索框中输入职位名称,并且搜索框会像 Google 搜索一样自动从下拉列表中的数据库中填充相似的职位名称
问题:无论在搜索栏中输入什么文本,搜索栏下拉菜单都会不断填充数据库表中的所有职位
环境:Wordpress、XAMPP、php、html、MYSQL 上的自定义页面数据库名称“jobsdatabase”
开发者的编程能力:初学者,刚开始开发网站5个月,已经尝试解决这个问题6周
相关文件和位置:
C:\xampp\htdocs\wordpress\wp-admin\admin-ajax.php
C:\xampp\htdocs\wordpress\wp-content\themes\twentysixteen\page_search_job_form V6.php
C:\xampp\htdocs\wordpress\wp-content\themes\twentysixteen\functions.php
以下是我的wordpress自定义搜索页面的代码----> page_search_job_form V6.php
<?php
get_header();
?>
<!DOCTYPE html>
<html>
<head>
<style>
ul{
background-color:#eee;
cursor:pointer;
}
li{
padding:12px;
}
</style>
<script type="text/javascript" >
jQuery.noConflict();
jQuery(document).ready(function()
{
jQuery('#searchform_jobtitle').keyup(ajaxsubmit);
function ajaxsubmit()
{
var searchform_jobtitle = jQuery(this).val();
if (searchform_jobtitle.length >= 3)
{
jQuery.ajax({
url:'/wordpress/wp-admin/admin-ajax.php',
method:"POST",
data:{'action':'searchform_jobtitle'},
success:function(data)
{
console.log(data);
jQuery("#jobtitle").fadeIn();
jQuery("#jobtitle").html(data);
},
error:function(errorThrown)
{
console(errorThrown);
}
});
}
}
jQuery(document).on('click', 'li', function(){
jQuery('#searchform_jobtitle').val(jQuery(this).text());
jQuery('#jobtitle').fadeOut();
});
});
</script>
</head>
<body>
<form action="/" form type="post" id="searchform_jobtitle1" style="width:500px;">
<input type="text" id="searchform_jobtitle" name="s" placeholder="Search...">
</form>
<div id="jobtitle"></div>
</body>
</html>
以下是我包含在 wordpress function.php 中的代码
add_action('wp_ajax_searchform_jobtitle','searchform_jobtitle');
add_action('wp_ajax_nopriv_searchform_jobtitle','searchform_jobtitle');
function searchform_jobtitle()
{
$search_jobtitle = ucfirst($_POST["action"]);
$con = mysqli_connect('127.0.0.1','root','');
if(!$con)
{
echo 'Not connected to server';
$con->print_error();
}
if(!mysqli_select_db($con,'jobsdb'))
{
echo 'Database not selected';
$con->print_error();
}
if(isset($_POST["action"]))
{
$output = '';
$query = "SELECT * FROM job_info WHERE job_title like '%".$_post["action"]."%' ";
$result = mysqli_query($con, $query);
$output = '<ul class="list-unstyled">';
if(mysqli_num_rows($result) > 0)
{
while($row = mysqli_fetch_array($result))
{
$output .= '<li>'.$row["job_title"].'</li>';
}
}
else
{
$output .= '<li>Job Not Found</li>';
}
$output.= '</ul>';
echo $output;
mysqli_close($con);
die();
}
}
最佳答案
您为初学者选择了一项复杂的功能!
从哪里开始解决这个问题?从这行 php 开始:
$query = "SELECT * FROM job_info WHERE job_title like '%".$_post["action"]."%' ";
1.我认为$_post
应该是大写$_POST
。
2. 我知道当用户未推送超过三个字母时,浏览器端会限制 AJAX 请求。但在你的 php 程序中也应设置同样的限制。如果您的 action
变量为空,您将收到此查询;我认为这就是为什么您将表格的所有行重新返回到自动完成功能中的原因。
SELECT * FROM job_info WHERE job_title like '%%'
3. 如果您的用户输入 junk'; 该怎么办?删除表 job_info; -- '
进入您的搜索框?在这种情况下,执行的 SQL 将是
SELECT * FROM job_info WHERE job_title like '%junk'; DROP TABLE job_info; --'%'
这似乎不太可能是您想要的。这就是所谓的 SQL 注入(inject)。您需要在您的项目在互联网上上线之前处理它。
关于php - WordPress 中的自动完成搜索功能会不断填充数据库中的所有职位名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414846/