PHP 中的搜索功能适用于数值,但不适用于 letters/words

Search function in PHP works with numeric values but doesn't work with letters/words

人们可以在我的平台上订购 link,这些存储在两个不同的 table 中,例如 wp_project 和 wp_articles。这样做的原因是,当人们下订单 1 link 时,会创建一个项目行和一个文章行。

但是,如果客户订购 10 links,则将有一个项目条目和十个文章条目。现在这与我的问题不是很相关,只是为了解释系统是如何工作的。

项目和文章有两个共同的标识符,ID和项目标题都存储在inpu_project和inpu_articles中。

现在,如果我想从一个项目中回显所有 link,我构建了一个搜索功能,我可以在其中 select 项目 ID,单击搜索以及客户是否订购了 1 link 或 20 link 将显示 link 的数量。

当我想根据项目标题而不是 ID 进行搜索时,问题就出现了,它是 non-numeric 但只是单词(有时中间有空格)。

这是为了防止我的错误日志中出现未定义索引错误

    $where_clouse='';

这是基于项目标题的搜索功能:

    if(isset($_GET['todo']) && $_GET['todo']=='search')
    {
        if($_GET['proid']!=0){
            $where_clouse.=' AND P.`project_title`='.$_GET['proid'];
        }
    }

这是从中提取 link 的数据库查询:

    $sql="SELECT P.`project_title`, P.`backlink` FROM `inpu_articles` AS P 
WHERE P.`post_it_posted` = '1' ".$where_clouse."  ORDER BY P.`project_title`  ASC";
    $backlinks=$wpdb->get_results($sql, ARRAY_A);

这是触发我粘贴的第一个代码的实际搜索功能:

    <p>Select a project title and hit search!</p>
    <form action="" method="get">
        <input type="hidden" name="todo" id="todo" value="search" />
        <select name="proid" id="proid">
        <option value="0">All Projects</option>
        <?php $projects=getTitles(); foreach($projects as $project){ ?>
            <option value="<?php echo $project['title']; ?>" <?php if(isset($_GET['proid']) && $_GET['proid']==$project['title'] ) { echo 'selected="selected"';  } ?> ><?php echo $project['title'] ?>
            </option>
        <?php } ?>
        </select>
        <input class="submit_search" type="submit" id="search_button" value="Search"/>
    </form>

这是从项目 table:

中提取项目标题的代码
    function getTitles($where=false)
    {
        global $wpdb;
        $sql="SELECT  `title`, `link` FROM `inpu_project` WHERE `link`='1' ORDER BY `title` ASC";
        $result = $wpdb->get_results($sql, ARRAY_A);
        return $result;
    }

一切都非常简单,如果我将 inpu_articles 和 inpu_project table 代码中的 non-numeric 标题替换为数字 ID。

然后代码完全按照它的方式执行,但是当我使用项目标题时,它只显示每个客户曾经订购的所有 link,并且我的数据库中没有错误显示。就好像找不到匹配什么的,这很奇怪。

我是不是漏掉了什么?是否无法匹配单词,或者在使用单词而不是数值时我应该调整什么?

最后,就其价值而言,这是回应查询的代码:

    <?php foreach ($backlinks as $backlink) {
        $backlink_overview=$backlink['backlink'];
    ?>
        <ul>
            <li><?php echo $backlink_overview; ?></li>
        </ul>
    <?php } ?>

标题确实出现在我的表单/搜索下拉菜单中,所以我很惊讶它无法将项目标题与文章中存储的标题相匹配 table。

我的直觉说这就是问题所在:

    P.`project_title`='.$_GET['proid'];

但它不会抛出任何语法错误或任何错误,它只是显示存储在 inpu_article table 中的所有 link,忽略我的搜索功能一共

我认为您在 SQL 的陈述中可能是错误的。您可以将 sql 字符串语句打印到屏幕上,然后将其复制到 Mysql 中进行检查。希望你能找到错误。

问题出在 where_clause 的条件和 where_clause 本身。 要检查输入,您需要检查参数是否已设置且不为空。然后对于 where 子句,您需要将字符串放入引号中。像下面这样更改那部分代码

if(isset($_GET['proid']) && !empty($_GET['proid'])){ 
      $where_clouse.=" AND P.project_title='".$_GET['proid']."'"; 
  }