2010-05-20 84 views
10

看看這個表,請select ... where id =任何值。可能嗎?

table 
|id| |name| |order| 

我必須讓行,其中name = somethingorder = somevalue

,所以我寫

select `id` from `table` where `name` = 'something' and `order` = 'somevalue' 

而是依賴於PHP的邏輯,有時我需要得到所有行,其中name = something,與order值無關。我不想改變查詢結構,因爲在實踐中有很多字段,可能的查詢次數會變得很大。所以我要查詢的保存結構,當我只需要通過名稱來選擇,我想寫的東西是這樣的:

select `id` from `table` where `name` = 'something' and `order` = any value 

這可能嗎?

感謝

+1

我會改變你構建你的查詢的方式...... – nickf 2010-05-20 22:42:29

回答

10

嗯,這是怎樣的一個黑客攻擊,但如果你真的需要做到這一點,它會像這樣工作:

select `id` from `table` where `name` = 'something' and `order` = `order` 

然後,你只是說:「只要是爲了和自己一樣「,所以它總是如此。

+2

我會考慮這個不斷變化的結構,因爲語法來引用一個字段是不一樣的,要引用一個字符串。 – 2010-05-20 22:46:01

+0

這不是這樣做的正確方法。 PHP代碼需要調整。 – vonPetrushev 2014-05-23 10:48:31

5

不,這是不可能的。你需要改變結構(可選擇LIKE,這樣你可以使用'%',但這非常醜陋)。

但是,您不需要編寫不同的查詢來處理每種可能的組合。你可以簡單地動態地創建查詢:

//create base query 
$query = "select `id` from `table` where `name` = 'something' "; 

//add order if we need it 
if ($use_order) 
    $query .= "and `order` = 'somevalue' "; 

//repeat for any other optional part 

注意,你當然應該仍然採取適當的措施,以避免SQL注入和其他安全問題 - 我沒有爲了簡單起見包含在此這裏。

+0

什麼是SQL注入?也許你會說mysql_real_escape_string()和這樣的函數?我不明白「SQL注入」的含義 – Simon 2010-05-20 22:53:38

+0

@Syom:SQL注入是提供影響查詢結構的數據的行爲,導致它執行的操作與本來應該執行的操作不同。 mysql(i)_real_escape_string確實是大多數人用來防止這種情況的東西(儘管參數化查詢嚴格來說是一種更好的方法,但這是一個不同的主題)。如果您想了解更多信息,有很多優秀的資源,無論是在SO上還是通過Google提供。我想說的是,當你動態構建時,你仍然需要記住做這樣的事情。 – 2010-05-20 23:00:09

2

如果使用綁定參數,那將是不可能的。

如果你只是替換值,你可以做到以下幾點:

select `id` from `table` where `name` = 'something' and `order` = `order` 
0

我不認爲你有任何的選擇......一旦你做一個選擇,你不能「不過濾」,並得到更多的行。

您應該只使用兩個查詢 - 兩個獨立的查詢,或者將名稱選擇到臨時表中,然後(可選)進一步選擇訂單屬性。

0

像乍得上面說的,只需將列設置爲等於它自己。但要小心,在某些平臺/安裝配置,NULL = NULL:

select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'') 
+4

NULL!= NULL實際上是SQL標準中定義的預期行爲。 – 2010-05-20 23:01:49

0

這是數據庫查詢一個共同的主題 - 你需要一個變量查詢這取決於你想多少濾波應用到數據吧!查詢。你可以將你的查詢重複爲整個代碼中的字符串,但這是不好的做法,因爲它不必要地增加了代碼的複雜性。如果由於某種原因需要更改查詢,並因此必須在多個位置更改查詢,則可能會發生錯誤。

更好的解決方案是創建建立查詢你的函數執行:

function buildMyQuery($name, $order = null) { 
    $sql = "SELECT `id` FROM `table` WHERE `name`='$name'"; 

    if ($order != null) { 
     $sql .= " AND `order`='$order'"; 
    } 

    return $sql; 
} 

然後,您可以運行這個只是使用「名稱」字段:

$query = buildMyQuery("somename"); 

或者這使用這兩個字段:

$query = buildMyQuery("somename", "someorder"); 

正如上面提到的人,這段代碼是故意simp並且不包含通過$ name或$ order傳入的可能危險數據的意外事件。您需要使用mysql_real_escape_string或類似的東西來首先清理數據,在函數的開始部分使用任何一段數據之前。

動態查詢生成是拜倫所說的生活中的一個現實,所以我現在習慣於這樣做,而不是使用hack-ish解決方法。

0

經過反思,我有了一個更好的答案。我的同事向我展示了可以完成的一種方式。

我的例子...

Select rentals.* From rentals Where ((? = '') OR (user_id = ?)) 

的變量必須是相同的。

如果他們都是5例如,第一個布爾值將是錯誤的,但第二個將是真實的,對於用戶ID爲5

如果你需要「所有」行,設置爲空字符串將導致看到的所有行都滿足where子句的條件。

0

你不能只用一個not null查詢嗎?

select `id` from `table` where `name` = 'something' and `order` is not null; 
相關問題