php - WordPress 中的自动完成搜索功能会不断填充数据库中的所有职位名称

标签 php mysql wordpress search autocomplete

我刚刚开始开发网站,我对 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/

相关文章:

php - 如果两个表中都不存在记录,则从数据库返回记录? PDO

mysql - 如何在驻留在 2 个不同服务器上的 2 个不同数据库中的 2 个不同表上编写 MySQL 查询?

java - Android SQLite 从空表中获取列列表

c# - 如何在 ASP.NET MVC 3 应用程序中通过 Linq 查询 MySQL 数据库?

mysql - 如何在重新启动之间在 Windows 10 上保留 MySQL 容器

php - 如何获取 WooCommerce 运输方式成本和设置?

php - git 分支切换 Laravel 时发生 ReflectionException 类不存在

php - 在 Wordpress 主题中更改背景图片

php - Wordpress 侧边栏与内容不对齐

javascript - div 中的日期选择器在 ajax 调用后无法正常工作