2016-06-25 4 views
2

を働いていない私は与えられた映像ため、同じジャンル、国から関連するビデオタイトルを返すクエリを持って、日付は公表などPDOのMySQL「)(ではない」

。問題は、クエリで排除したい動画が返され、配列内で最初にソートされることです。なぜこうなった?

public function interval($month, $not, $limit) { 
    $this->not = array_unique($not); 
    $i = implode(',', $this->not); 

    echo $i;//prints: onajr,babyjem,posh 

    $query = ' 
     select title, artists, published, views, video_name, yt_id, duration, play_start, genre, country from videos 
     where 
     published BETWEEN :published - INTERVAL :month MONTH AND :published + INTERVAL :month MONTH 
     and MATCH(country) AGAINST(:country IN boolean mode) 
     and MATCH(genre) AGAINST(:genre IN boolean mode) 
     and 
     video_name not in (" :i ") 
     ORDER BY RAND() limit :limit 
    '; 

    $run_query = $this->pdo->prepare($query); 

    $run_query->bindValue(':published', $this->published); 
    $run_query->bindValue(':country', '+' . $this->data->country); 
    $run_query->bindValue(':genre', '+' . $this->data->genre); 
    $run_query->bindValue(':limit', $limit, PDO::PARAM_INT); 
    $run_query->bindValue(':month', $month, PDO::PARAM_INT); 
    $run_query->bindValue(':i', $i); 

    $run_query->execute(); 
    $data = $run_query->fetchAll(PDO::FETCH_ASSOC); 

    print_r($data); 
    //contains all three of them onajr,babyjem,posh 
} 
+3

'video_nameではない(:i)' –

+0

Gここで@MichaelBerkowskiのコメントを追加することを心配しています。「PDOはコンマ区切りのリストをIN()リストに展開することはしませんが、IN()に単一の文字列値として扱いますリテラル '、' '' $ i'とバインディングを動的に構築する必要があります。プレースホルダあたり1つの値。 – chris85

+0

それぞれの 'video_name'を別々にバインドしますか? @AlonEitanのコメントはうまくいきます。 –

答えて

3

あなたはパラメータの配列と、このような値を作成することができます:クエリにバインドする

$this->not = array_unique($not); 
$i = array(); 
foreach($this->not as $key => $val) { 
    $i[':vid_' . $key] = $val; 
} 

を:

' ..... video_name not in ('. implode(',', array_keys($i)) .') ....' 

そして、のparamsをバインド:

foreach($i as $key => $val) { 
    $run_query->bindValue($key, $val); 
} 
+0

'video_nameが(:i)ではない'は正常に動作しており、除外された動画は表示されません。 –

+1

ああ、知っておきたいことです。まだ - 私の答えは、数字だけでなく、文字列をバインドしたいときに便利かもしれません。 –

+0

はい、うまくいきます。私はテストしていて、それらのビデオは表示されません。とりあえずありがとう。 –