2013-06-18 61 views
1

我有一個代碼,應該從表中選擇項目,其中字段color_base1和color_base2類似於特定的顏色。PDO查詢返回比預期使用LIKE CONCAT更多的值

但是,目前我的代碼只是返回的所有字段在我的表,那種無視我申請的,如:

$result3 = $con -> prepare("SELECT * FROM item_descr WHERE (color_base1 LIKE CONCAT ('%', ? , '%') OR color_base2 LIKE CONCAT ('%', ? , '%')) AND id_item != $itemId LIMIT 4"); 
$result3 -> execute(array("$color_base1", "$color_base2")); 
$row3 = $result3->fetch(); 

會有人對SQL如何建立任何輸入和我應該怎麼建立它?

+0

您選擇其中color_base1包含字符串$ color_base1 PLUS(工會,或...),其中color_base2包含stirng $ color_base2所有記錄的所有記錄。 假設存儲在color_base1/2中的顏色是RGB十六進制顏色代碼(DC0000用於深紅色),如果搜索WHERE color_base1 LIKE「%C0%」,它將與DC0000匹配記錄,但是如果搜索LIKE「%D0C% 「它不會匹配。這是你的問題嗎?否則,我沒有得到你的問題... –

+0

我想獲取其中color_base1類似於$ color_base1的記錄,或者color_base2類似於$ color_base2。我使用%,因爲我的顏色是實際名稱(綠色,紅色),有時我有「淺綠色」,所以「淺綠色」應該類似於「綠色」 – samyb8

+0

好的,但是您的查詢出了什麼問題?除了一些PHP錯誤,你的查詢應該完成這項工作。除非你想要一些與OR不同的東西:你是否需要XOR(請參閱:http://en.wikipedia.org/wiki/Exclusive_or)? –

回答

1

您需要仔細檢查是否均爲您的變量包含任何值。否則,一個空的將使查詢返回所有行。

儘管最好將表結構和數據標準化並根本除掉LIKE。

另請注意,您必須綁定項目ID以及
而PHP中的變量必須用引號解決。 一致的命名也是一件好事。你的結果沒有什麼特別之處。這只是一個PDO語句,對您的應用程序沒有任何特殊含義。

$sql = "SELECT * FROM item_descr WHERE 
(color_base1 LIKE CONCAT ('%', ? , '%') OR color_base2 LIKE CONCAT ('%', ? , '%')) 
AND id_item != ? LIMIT 4" 
$stmt = $con->prepare($sql); 
$stmt->execute(array($color_base1, $color_base2, $itemId)); 
$row = $stmt->fetch();