2014-03-30 16 views
0

我只想在設置流派和藝術家列時才搜索流派和藝術家列。所以如果其中一個設置爲'all',我會聲明它們爲'NULL',而不是搜索該列。這是我想出來的,但它不起作用。未設置值時PDO不搜索

if($genre=='all') 
{ 
    $genre=NULL; 
} 
if($artist=='all') 
{ 
    $artist=NULL; 
} 

$query=$conn->prepare('SELECT * FROM songs WHERE (genre=?) && (artist=?)'); 
$query->bindValue(1,$genre,PDO::PARAM_STR); 
$query->bindValue(2,$artist,PDO::PARAM_STR); 
$query->execute(); 
$array=$query->fetchAll(PDO::FETCH_ASSOC); 
echo json_encode($array); 
+0

'if($ genre ='all')'不會做你認爲它做的事情。它**將'$ genre'的值設置爲'all',而不是檢查它是否爲'all'。你需要使用'=='來代替:'if($ genre =='all')'。 –

+0

也''genre = null'與'PDO :: PARAM_STR'不是sql'NULL' ... –

+0

@Amal Murali我道歉,我做了一個misstype(我在某個問題上做了一個......)。該行確實是'if($ genre =='all')'。這部分的完整代碼實際上是對很多POST請求進行排序。 – aaaaaa4422

回答

0

此問題與PDO無關,但與一般的(My)SQL無關。

努力擴大佔位符在查詢中查詢,看看:

mysql> select 1=null; 
+--------+ 
| 1=null | 
+--------+ 
| NULL | 
+--------+ 
1 row in set (0.05 sec) 

mysql> select 1 && 1=null; 
+-------------+ 
| 1 && 1=null | 
+-------------+ 
|  NULL | 
+-------------+ 
1 row in set (0.00 sec) 

如果比較值設置爲null,你會得到空
如果在邏輯運算符使用空,你會得到空

所以,你需要一種方式

$params = array(); 
$where = array(); 
if($genre && $genre != 'all') 
{ 
    $where[] = "(genre=?)"; 
    $params[] = $genre; 
} 
if($artist && $artist != 'all') 
{ 
    $where[] = "(artist=?)"; 
    $params[] = $artist; 
} 
$sql = 'SELECT * FROM songs'; 
if ($where) { 
    $sql .= 'WHERE '.implode('&&', $where); 
} 
$stm = $conn->prepare($sql); 
$stm->execute($params); 
echo json_encode($stm->fetchAll(PDO::FETCH_ASSOC)); 
+0

啊哈,幾乎相同) –

+0

謝謝,這就像一個魅力! – aaaaaa4422

+0

是不是有一個空的'$ where數組? –

0

嘗試如下:

$where = array(); 
$preps = array(); 
if ($genre!=='all') { 
    $where[] = 'genre = ?'; 
    $preps[] = $genre; 
} 
if ($artist!=='all') { 
    $where[] = 'artist = ?'; 
    $preps[] = $artist; 
} 

$where = $where ? "WHERE ". implode(' AND ', $where) : ''; 


$query=$conn->prepare('SELECT * FROM songs '.$where); 
if($preps) $query->execute($preps); 
else $query->execute(); 
$array=$query->fetchAll(PDO::FETCH_ASSOC); 
echo json_encode($array);