2015-05-26 42 views
1

我在PHP代碼,並在選擇查詢它有三個不同的地方情況類似NULL或NOT NULL值,其中條件

SELECT * FROM table1 WHERE pid = $pid AND qid = $qid AND text="$text" ; 

動態它將改變變量,有時寫小MySQL的選擇查詢該變量將成爲當時空的一個我的病情看起來像

SELECT * FROM table1 WHERE pid = $pid AND text="$text" ; 

同樣的事情可以是文字,也PID控制,我怎麼能做到這一點,是否有任何解決方案或我應該去,如果/切換條件在PHP ..

+3

使用'if' /'之開關在PHP 。 –

+4

查看@GordonLinoff的答案,注意你的代碼是打開的SQL注入看看準備好的語句。 – Daan

+0

這是個壞主意,因爲,如果所有的參數都爲空,你會收到可怕的查詢,將選擇所有記錄... –

回答

0

您可以使用if s來創建查詢並執行PDO準備語句(http://php.net/manual/en/pdo.prepare.php)。

<?php 
$query = "SELECT * FROM table1 WHERE 1 = 1"; 
$params = array(); 

if(null !== $pid) { 
    $query .= ' AND pid = :pid'; 
    $params[':pid'] = $pid; 
} 
if(null !== $qid) { 
    $query .= ' AND qid = :qid'; 
    $params[':qid'] = $qid; 
} 
if(null !== $text) { 
    $query .= ' AND text = :text'; 
    $params[':text'] = $text; 
} 

$sth = $dbh->prepare($query); 
$sth->execute($params); 
$result = $sth->fetchAll(); 
+0

謝謝,它幫助我.. :) – prabhu

+0

@prabhu,很高興聽到這個。 – SpartakusMd

+0

你的編輯使這個答案沒用......而你可以刪除你的答案,並upvote其他。 – giraff

-1

可以包括它變成像下面的SQL:

SELECT * 
FROM table1 
WHERE ("$pid" = "" OR pid = "$pid") 
AND ("$qid" = "" OR qid = "$qid") 
AND ("$text" = "" OR text="$text") ; 

了MySQL,服務器會看到... WHERE ("" = "" OR pid = ""),並通過去除這部分執行之前優化查詢。

+0

**否**。這隻會加劇已經非常猖獗的注入問題。 – tadman

+0

嗯,是的,我同意,SQL注入必須處理。但是這不在這個問題的範圍之內。例如,$ pid可能事先已被轉換爲(int),並且$ text可能是一個靜態字符串。 – giraff

+0

這就是這些假設,一切都好,導致大量問題。編寫正確的代碼永遠不會超出範圍。另外'=='不是有效的MySQL比較。 – tadman

0

這裏另一個MySQL變種:

SELECT * 
FROM tbl 
WHERE 
    IF($pid > 0, pid = $pid, 1 = 1) 
AND IF($qid > 0, qid = $qid, 1 = 1) 
AND IF($text > '', `text` = $text, 1 = 1) 
; 

但在這裏硬編碼值。而且,您不能選擇pid或qid恰好等於0或行數等於''(空字符串)的行。
你可以接收查詢,將在你的表中選擇所有行,我想這將是非常糟糕......

PHP的:

<?php 

$dbh = new PDO('mysql:dbname=test;host=127.0.0.1', 'root'); 
$pid = 1; 
$qid = 2; 
$text = '3'; 
$sql = 'SELECT * FROM tbl WHERE 1 = 1'; 
$params = []; 
if (isset($pid)) { 
    $sql .= ' AND pid = :pid'; 
    $params[':pid'] = $pid; 
} 
if (isset($qid)) { 
    $sql .= ' AND qid = :qid'; 
    $params[':qid'] = $qid; 
} 
if (isset($text)) { 
    $sql .= ' AND `text` = :text'; 
    $params[':text'] = $text; 
} 
$sth = $dbh->prepare($sql); 
$sth->execute($params); 
$result = $sth->fetchAll(PDO::FETCH_ASSOC); 
var_export($result); 
+0

第二個版本**大大優於第一個版本,我甚至不知道爲什麼它在那裏。這是奇怪和浪費。不必要的條件不屬於查詢字符串,應用程序代碼的作用是忽略它們,而不是MySQL忽略它們。第二個版本可以通過製作'$ conditions = []'來清除,然後追加到該數組中,稍後使用'implode('AND',$ conditions)將其引入到查詢中',使其更具動態性並移除沒有意義的'1 = 1'的東西。 – tadman