0

ユーザーが興味のある複数の音楽スタイルを(チェックボックスを介して)選択することでイベントのリストを見つけることができる検索機能を作成しようとしています。各イベントには複数の音楽スタイルを添付できます。イベントとの一致を検索した音楽スタイル-その後、表示されるはずです。

各イベントには複数の音楽スタイルが添付されているため、それらを異なるテーブルに保存する必要があるため、これは私が行き詰まっているところです。

1つのテーブルevents_music_stylesにはevent_IDmusic_style_ID が含まれ、もう1つのテーブルに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。....これらの各番号はのIDである必要があります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

javascriptの部分はそのままにしておくことができます。IN()PHP側では、SQLステートメントでコンマ区切りのリストを使用できます。

<?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 に答える
1

phpファイルセクションで音楽スタイルの配列を作成してから、mysqlのin_array()関数を使用してevent_eventsまたはmusicを選択する必要があると思います...

于 2012-12-17T15:54:07.010 に答える
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 に答える