我正在尝试创建一个搜索功能,用户可以通过选择他们感兴趣的多种音乐风格(通过复选框)来查找事件列表。每个事件都可以附加多种音乐风格,如果搜索与事件匹配的音乐风格之一 - 然后它应该出现。
这就是我被困住的地方,因为每个事件都附加了多种音乐风格,所以它们必须存储在不同的表格中。
一个表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
}
答案 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部分。