用于正确处理HTML查询的PHP代码

时间:2012-02-19 17:21:52

标签: php mysql forms

几个星期以来,我一直致力于MYSQL和PHP。我已经构建了一个包含大约15个数据列的音乐数据库。手动 - 我能够在QUERY数据库中获得很好的结果:

SELECT * FROM $tableName WHERE category RLIKE ('option-choice') and
genre RLIKE ('option-choice') and Sub_genre RLIKE ('option-choice')
and lyrical_theme RLIKE ('option-choice') and lead RLIKE
('option-choice') and tempo RLIKE ('option-choice'); "

我的可用HTML表单有 NINE 下拉按钮,我想要执行这些按钮,每个按钮包含多个选项。没有单选按钮,复选框或多个选项。每个按钮名称都是这样的:

<select id="category" name="category"><option value="" class="header">Category</option>

通过我的HTML表单和_POST,我可以获得任何 1 字段选择结果,输出正确的表格格式正确,颜色等等。很棒!

当我添加第二个或第三个或第四个表单选项时,我仍然可以获得所有记录但不会过滤(手动)。访客选择顺序不是1,2,3,但可以是2,5,7或6,7或9等任何组合....

我需要正确的PHP处理语句来生成正确的SELECT语句(POST ARRAY / IGNORE BLANK CHOICE OPTIONS)以确保我的努力成为现实。真的很感激任何帮助。几个星期后,我厌倦了自己阅读并没有产生正确的结果 - 数百次试验和错误,但至少我已经尽了最大的努力......我需要帮助......!谢谢!!!!

2 个答案:

答案 0 :(得分:1)

根据您的评论我发现了一些问题: 您在查询中使用OR而不是AND,这是您的主要问题。 AND将选择具有指定选项的ALL的记录;或者选择任何具有任何一个选项的记录,即使它没有其余的选项。

$query1= "SELECT * FROM $tableName 
WHERE category= '$category' AND genre='$genre' AND sub_genre= '$sub_genre' 
LIMIT $start, $limit";

如果我理解正确的第二件事是你想根据选择的选项动态构建语句?

检查每个下拉列表的值,如果它有值,则添加到WHERE子句

$query1 = "SELECT * FROM $tableName WHERE [some condition thats always required]";
if (!empty ($category))
    $query1 .= "AND category = '$category' ";
if (!empty ($genre))
    $query1 .= "AND genre= '$genre' ";
[etc...]
$query1 .= "LIMIT $start, $limit;"

如果您在WHERE子句中的唯一条件是传入的选项,那么您需要首先检查是否传入任何选项以确定是否需要添加“WHERE”关键字到您的查询;然后检查哪个是第一个要包含的选项,这样当没有先前条件将其添加到时,您不会包含“AND”关键字。或者你可以作弊并放入一个永远正确的任意条件,例如: “WHERE $ table_id&gt; 0”(假设您的表中有一个id字段)

您还应该使用数字ID作为选项,而不是在数据库上进行文本比较,这样效率会更低,但这完全是另一回事......

答案 1 :(得分:0)

感谢您指向该网站。我认为您遇到的问题是您使用AND来查询条件。因此,当从HTML表单中,用户只选择一个或两个字段,比如Category和Genre时,所有其他字段中的值都是“”(空字符串)。将这些空值放入查询时,找不到匹配的条目。查询的外观示例如下:

SELECT * FROM $tableName
WHERE category RLIKE 'Indie'
and genre RLIKE 'Blues'
and Sub_genre RLIKE ''
and lyrical_theme RLIKE ''
and lead RLIKE ''
and tempo RLIKE '';

解决方案是检查从表单传递的非空字段,并相应地将WHERE条件添加到查询中。类似的东西:

<?php
$arrConditions = Array();
if (isset($_POST['category']) && !empty($_POST['category'])) {
    $arrConditions[] = 'category RLIKE "' . $_POST['category'] . '"';
}
if (isset($_POST['genre']) && !empty($_POST['genre'])) {
    $arrConditions[] = 'genre RLIKE "' . $_POST['genre'] . '"';
}
if (isset($_POST['sub_genre']) && !empty($_POST['sub_genre'])) {
    $arrConditions[] = 'Sub_genre RLIKE "' . $_POST['sub_genre'] . '"';
}
/* ADD SIMILAR IF STATEMENTS FOR ALL OTHER FORM FIELDS */

$qryWhere = '';
if (!empty($arrConditions)) { // assuming that there is at least one condition
    $qryWhere = ' WHERE ' . implode(' AND ', $arrConditions);
}
$query = 'SELECT * FROM ' . $tableName . ' ' . $qryWhere;
?>

希望以上内容有道理。