【问题标题】:Search function in PHP works with numeric values but doesn't work with letters/wordsPHP 中的搜索功能适用于数值,但不适用于字母/单词
【发布时间】:2017-09-12 03:12:14
【问题描述】:

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

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

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

现在,如果我想回显一个项目中的所有链接,我构建了一个搜索功能,我可以在其中选择项目 ID、单击搜索以及客户订购 1 个链接还是 20 个链接,链接数量将显示。

当我想根据项目标题而不是 ID 进行搜索时,问题就开始了,ID 不是数字,而是单词(有时之间有空格)。

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

    $where_clouse='';

这是基于项目名称的搜索功能:

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

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

    $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>

这是从项目表中提取项目标题的代码:

    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;
    }

一切都很简单,如果我用数字 id 替换 inpu_articles 和 inpu_project 表的代码中的非数字标题,它可以 100% 正常工作。

然后代码完全按照它的功能进行操作,但是当我使用项目标题时,它只显示了每个客户曾经订购过的所有链接,并且在我的数据库中没有出现任何错误。就好像它找不到匹配的东西一样,这很奇怪。

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

最后,对于它的价值,这是回显查询的代码:

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

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

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

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

但它不会抛出任何语法错误或任何错误,它只是显示存储在 inpu_article 表中的所有链接,完全忽略了我的搜索功能。

【问题讨论】:

  • 您是否在代码中启用了 PHP 警告和错误?如果没有,您可以通过将ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); 放在 php 代码的顶部来实现。这样您就可以看到任何警告和错误。
  • 这个条件语句if($_GET['proid']!=0) 是关于什么的?我猜这是你的问题。我认为,非数字输入不属于这种情况。然后你会得到所有数据,因为 where 子句不测试标题。
  • 我添加了代码,但没有出现其他错误。我通过在选择表单下拉列表中回显项目标题来进行临时修复,同时比较 ID。这当然可行,而且我更容易通过标题而不是 ID 来识别项目,但我觉得很奇怪它无法匹配文本字段而不是 INT 字段。
  • N Moeini,当我删除 if($_GET['proid']!=0 我得到一个非常奇怪的错误,说它在 where 子句中找不到列 mysewingproject。但甚至没有一个名为 where 子句的表(我也没有在代码中的任何地方说明这些词),而 mysewingproject 是项目标题,根本不是一列。
  • 我认为您对此有一定的看法 if($_GET['proid']!=0),您能告诉我如何针对非数字输入进行调整吗?

标签: php mysql numeric alphabetical


【解决方案1】:

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

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

【讨论】:

  • 没有看到这条评论,马上试试!
  • 问题已修复 :) 非常感谢,对所有这些额外的引号一无所知,但它现在可以通过以下语句完美执行:SELECT P.project_title, P.project_id, P.backlink, P.post_it_posted FROM inpu_articles AS P WHERE P.post_it_posted='1' AND P.project_title='Armchair' ORDER BY P.project_id ASC
  • 我连续看到 3 个引号,这让我完全困惑,但现在我明白了你做了什么,你说的是:'".$_GET['proid']."' - 再次感谢一百万。我会在以后的情况下记住这一点。仍然很困惑它使用 INT 作为比较字段,但我猜这就是 PHP 的工作方式:)
  • 很高兴它解决了您的问题。问题是 mysql 中的字符串必须在引号中,否则它认为它们是列名,但它接受整数。所有这些单引号和双引号都是从 php 变量正确创建有效查询所必需的
  • 我没有看到任何接受答案的选项,底部只有一个按钮,上面写着回答您的问题。我点击了几次投票,但看起来我需要为此获得 15 个声望点。
【解决方案2】:

我认为你在 SQL 语句中可能是错误的。并且可以将sql字符串语句打印到屏幕上,复制到Mysql中查看。我希望你能找到你的错误。

【讨论】:

  • 恕我直言,这不是一个答案。它更像是一条评论。
  • tks 为您的建议 =)
  • 如果 SQL 语句出错,我认为它会像往常一样出现在我的 error_log 中,我在试验和错误过程中看到了很多这样的错误。
  • 您打印并复制到这里,我会检查以帮助您
  • 目前在调整我们上面讨论的内容后,显示的是:[12-Sep-2017 04:29:10 UTC] WordPress 数据库错误“where 子句”中的未知列“DennisH” query SELECT P.project_title, P.project_id, P.backlink, P.post_it_posted FROM inpu_articles AS P WHERE P.post_it_posted='1' AND P.project_title=DennisH ORDER BY P.project_id ASC 由 require('wp-blog- header.php'), require_once('wp-includes/template-loader.php'), include('/themes/seoexp/findlinks.php')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多