2015-04-23 46 views
-1

我不明白爲什麼這不起作用。我有以下內容在播種者:「6 4 7」沒有引號,但所有的空間包括開始和結束。這是數據庫中一行的播種者價值。使用LIKE查找字符串內的東西

我有行ID,我轉換成這種形式的字符串(ID爲4)「4」,然後在sowner內部搜索它,看看它是否存在。沒有結果返回。

這裏是我的代碼:

$sql = 'SELECT * FROM `services` WHERE `sowner` LIKE ?'; 
$stmt = $conn->prepare($sql); 
if($stmt === false) { 
    trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->errno . ' ' . $conn->error, E_USER_ERROR); 
} 
$spacedid = " " . strval($row['id']) . " "; 
$stmt->bind_param('s', $spacedid); 
$stmt->execute(); 
$res3 = $stmt->get_result(); 

的目的是讓人們對IDS的用空格分隔字符串未定義的號碼,只顯示東西的人,如果他們的ID是服務sowner領域內。

我是積極的,因爲如果我刪除WHERE,所有行都顯示出來。

而且我使用的是相同的實施是在上式搜索建議的形式是這樣

SELECT * FROM `users` WHERE username LIKE ? 
+2

您應該解決您的數據結構,這樣你就不會存儲在字符串的東西名單。你應該有一個單獨的表,比如說'ServicesOwners',每個服務和所有者都有一行。 –

+1

戈登,有一個像你推薦的關聯表會使數據庫*可能*強制引用完整性,使*更簡單*添加和刪除數據,並使*更容易*查詢。我們爲什麼要這樣做?我的意思是,這種方式從中獲得樂趣,當值列表長度超過我們允許的字符串最大值時,調試生產問題。不是嗎? – spencer7593

+0

'$ sql =「SELECT * FROM services WHERE sowner LIKE CONCAT('%',?)」'。如果你最後需要通配符,交換'CONCAT'的參數。 –

回答

3

需要通配符運營商加入到像

這樣的聲明變得更像

SELECT * FROM `users` WHERE username LIKE '% 6 %' 

更改的行

$spacedid = " " . strval($row['id']) . " "; 

$spacedid = "% " . strval($row['id']) . " %"; 
+1

上帝該死的我忘記了,會標記爲當我可以 – aron9forever

+1

@ aron9forever時,請注意,在varchars中存儲列表是一種不好的做法。看到你的問題的評論。 – 1010

相關問題