Php PDO查询返回的值比使用CONCAT时预期的多

Php PDO查询返回的值比使用CONCAT时预期的多,php,sql,pdo,concat,sql-like,Php,Sql,Pdo,Concat,Sql Like,我有一个代码,用于从表中选择项目,其中字段color_base1和color_base2与特定颜色相似 但是,目前我的代码只是返回表中的所有字段,有点忽略我正在应用的字段: $result3 = $con -> prepare("SELECT * FROM item_descr WHERE (color_base1 LIKE CONCAT ('%', ? , '%') OR color_base2 LIKE CONCAT ('%', ? , '%')) AND id_item != $i

我有一个代码,用于从表中选择项目,其中字段color_base1和color_base2与特定颜色相似

但是,目前我的代码只是返回表中的所有字段,有点忽略我正在应用的字段:

$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是如何构建的以及我应该如何构建它有什么意见吗?

您需要仔细检查两个变量是否都包含任何值。否则,空的查询将使查询返回所有行

不过,最好是规范化表结构和数据,并完全消除类似的内容

还要注意,您还必须绑定项目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();

您需要再次检查两个变量是否都包含任何值。否则,空的查询将使查询返回所有行

不过,最好是规范化表结构和数据,并完全消除类似的内容

还要注意,您还必须绑定项目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();

您正在选择color\u base1包含字符串$color\u base1 PLUS(union或…)的所有记录,color\u base2包含字符串$color\u base2的所有记录。假设存储在color_base1/2中的颜色是RGB十六进制颜色代码(DC0000表示深红色),如果搜索color_base1的位置(如“%C0%”),它将与记录匹配DC0000,但如果搜索方式为“%D0C%”,它将不匹配。这是你的问题吗?否则我就不明白你的问题了……我正在尝试获取color\u base1与$color\u base1相似或color\u base2与$color\u base2相似的记录。我使用%是因为我的颜色是它们的实际名称(绿色,红色…),有时我有“浅绿色”,所以“浅绿色”应该类似于“绿色”,好吧,但是你的查询有什么问题?除了一些PHP错误之外,您的查询应该可以完成这项工作。除非您想要与或稍有不同的内容:是否需要XOR(请参阅:)?您正在选择color\u base1包含字符串$color\u base1 PLUS(union或…)的所有记录,其中color\u base2包含stirng$color\u base2。假设存储在color_base1/2中的颜色是RGB十六进制颜色代码(DC0000表示深红色),如果搜索color_base1的位置(如“%C0%”),它将与记录匹配DC0000,但如果搜索方式为“%D0C%”,它将不匹配。这是你的问题吗?否则我就不明白你的问题了……我正在尝试获取color\u base1与$color\u base1相似或color\u base2与$color\u base2相似的记录。我使用%是因为我的颜色是它们的实际名称(绿色,红色…),有时我有“浅绿色”,所以“浅绿色”应该类似于“绿色”,好吧,但是你的查询有什么问题?除了一些PHP错误之外,您的查询应该可以完成这项工作。除非您想要的东西与或稍有不同:是否需要XOR(请参阅:)?