2013-06-18 57 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();