0

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

这就是我卡住的地方,因为每个事件都有多种音乐风格,它们必须存储在不同的表中。

一张表events_music_styles包含event_IDmusic_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.

我将如何拆分这些数字并将它们发送到我的 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
                }
4

3 回答 3

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 部分。

于 2012-12-17T16:02:03.250 回答
1

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

于 2012-12-17T15:54:07.010 回答
1

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

<?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 值之前对其进行验证。

于 2012-12-17T15:56:54.253 回答