【问题标题】:PDO query returning more values than intended using LIKE CONCATPDO 查询返回比使用 LIKE CONCAT 预期更多的值
【发布时间】:2013-06-18 15:04:10
【问题描述】:

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

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

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

【问题讨论】:

  • 您正在选择 color_base1 包含字符串 $color_base1 的所有记录加上(联合,或...)其中 color_base2 包含搅拌 $color_base2 的所有记录。假设存储在 color_base1/2 中的颜色是 RGB 十六进制颜色代码(DC0000 表示深红色),如果您搜索 WHERE color_base1 LIKE "%C0%" 它将匹配 DC0000 的记录,但如果您搜索 LIKE "%D0C%"它不会匹配。那是你的问题吗?否则我没有得到你的问题......
  • 我正在尝试获取其中 color_base1 类似于 $color_base1 或 color_base2 类似于 $color_base2 的记录。我使用 % 因为我的颜色是它们的实际名称(绿色、红色..),有时我有“浅绿色”,所以“浅绿色”应该类似于“绿色”
  • 好的,但是您的查询有什么问题?除了一些 PHP 错误之外,您的查询应该可以完成工作。除非你想要一些不同于 OR 的东西:你需要 XOR(参见:en.wikipedia.org/wiki/Exclusive_or)吗?

标签: php sql pdo concat sql-like


【解决方案1】:

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

虽然最好规范化您的表结构和数据并完全摆脱 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多