关系数据库中的搜索功能

时间:2012-12-17 15:49:30

标签: php jquery mysql

我正在尝试创建一个搜索功能,用户可以通过选择他们感兴趣的多种音乐风格(通过复选框)来查找事件列表。每个事件都可以附加多种音乐风格,如果搜索与事件匹配的音乐风格之一 - 然后它应该出现。

这就是我被困住的地方,因为每个事件都附加了多种音乐风格,所以它们必须存储在不同的表格中。

一个表events_music_styles包含 event_ID music_style_ID 第二个,music_styles包含不同语言的音乐风格名称。

这就是我在MySql中加入它们的方式,当我想要显示所有事件及其相应的音乐风格时它很有效。

SELECT
    events.ID,
    events.EVENT_NAME,
    GROUP_CONCAT(music_styles.MUSIC_STYLE_NAME) AS MUSIC_STYLE_NAME
FROM events
INNER JOIN events_music_styles
    ON events.ID = events_music_styles.event_id
INNER JOIN music_styles
    ON events_music_styles.music_style_id = music_styles.id
GROUP BY events.ID

但是,当我提交搜索查询时,数据变量如下所示:var MusicStyles = 1,2,3,5,20 ....这些数字中的每一个都应该是events_music_styles的ID。

我如何拆分这些数字并将它们发送到我的php文件,看起来像这样?

var MusicStyles = $("#music").val();
$.ajax({
                type: "POST",
                url: "do_search.php",
                data: {
                    dataFromDate: FromDate,
                    dataToDate: ToDate,
                    dataMusicStyles: MusicStyles,
                    dataLocations: Locations,
                    dataFromPrice: FromPrice,
                    dataToPrice: ToPrice
                }

3 个答案:

答案 0 :(得分:1)

我认为你应该在php文件部分为音乐风格创建一个数组,然后在mysql中使用in_array()函数来选择event_events或音乐......

答案 1 :(得分:1)

您可以保留javascript部分。在PHP端,您可以在SQL IN()语句中使用逗号分隔列表。

<?php

// JQuery as used in the question will send the 'MusicStyles' post var in 
// array form. This means that the raw post contains multiple occurences 
// of 'MusicStyles[]'. Note the [] at the end.
// PHP will convert such post vars automatically to an array.  
// In this case we'll have to flatten the array to a comma separated list first
if(is_array($_POST['MusicStyles'])) {
    $musicStyles = implode(',', $_POST['MusicStyles']);
} else {
    $musicStyles = $_POST['MusicStyles'];
}

$query = 
"SELECT
    events.ID,
    events.EVENT_NAME,
    GROUP_CONCAT(music_styles.MUSIC_STYLE_NAME) AS MUSIC_STYLE_NAME
FROM events
INNER JOIN events_music_styles
    ON events.ID = events_music_styles.event_id
INNER JOIN music_styles
    ON events_music_styles.music_style_id = music_styles.id";

if(!empty($musicStyles)) {
    // you can use the comma separated list as param for the IN statement
    $query .= " WHERE music_styles.id IN($musicStyles)";
}

$query .= " GROUP BY events.ID";

// ...

注意:这只是一个例子。当然,在MySQL语句中使用它们之前,应验证传入的$ _POST值。

答案 2 :(得分:1)

我发现你已经将MusicStyles变量传递给了PHP。我只是重新阅读代码并看到它将是一个字符串。

我没有测试或检查过查询。我假设您的代码将字符串传递给PHP,您需要做的就是在查询中使用它。您的查询将更改为:

<?php
// Split the input and filter it (for security)
$styles = array();
foreach (explode(",", $_POST['dataMusicStyles']) as $style_id)
{
    $style_id = (int)trim($style_id);
    if ($style_id)
    {
        $styles[] = $style_id;
    }
}
$styles = implode(",", $styles);

$sql = "SELECT
    events.ID,
    events.EVENT_NAME,
    GROUP_CONCAT(music_styles.MUSIC_STYLE_NAME) AS MUSIC_STYLE_NAME
FROM events
INNER JOIN events_music_styles
    ON events.ID = events_music_styles.event_id
INNER JOIN music_styles
    ON events_music_styles.music_style_id = music_styles.id
WHERE events_music_styles IN ($styles)
GROUP BY events.ID";

// Execute the SQL and process the results.
?>

您无需在此处更改Javascript部分。