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']."'";
}
人们可以在我的平台上订购 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']."'";
}