【发布时间】: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