【问题标题】:PDO mysql query like array valuesPDO mysql查询类似数组值
【发布时间】:2013-01-02 11:04:44
【问题描述】:

我对 PDO 还很陌生,但我遇到了一些可能很容易回答的问题。

我有一个类别编号数组,我需要在 mysql 数据库中搜索以找到具有匹配类别编号的所有项目。

我知道我已正确连接到数据库,因为我正在从不同的查询接收类别数组。

$category = Array ( [0] => 3259 [1] => 3617 [2] => 3257 [3] => 3258 [4] => 3450 [5] => 3452 [6] => 3478 [7] => 3479 [8] => 3480 [9] => 3448 [10] => 3449 [11] => 3451 [12] => 3456 [13] => 3454 [14] => 3455 [15] => 3459 [16] => 3460 [17] => 3458 [18] => 3453 [19] => 3461 [20] => 3462 [21] => 3457 [22] => 3463 [23] => 3447 ) 

现在我需要通过项目数据库来检查匹配的类别。 每个项目可以有多个类别,每个类别有4位数字。 多个类别用 = 分开

$categoryResults = $conn->prepare('SELECT * FROM items WHERE category like :cats ORDER BY promotions,price ASC');
$categoryResults->execute(array(':cats' => '%'.$category.'%'));
$categoryNumber = $categoryResults->rowCount();

这是我似乎出错的地方。使用 mysql 请求,我将使用通过数组的循环手动构建它以获得长 sql 查询:

'Select * From items WHERE category like '%3259%' OR WHERE category LIKE '%3617%'........etc

但我确信这是使用 PDO 的优势之一。 只是为了添加它,我需要结果是独一无二的。 如果项目 97 在类别 3259 和类别 3617 中,我只想得到一次结果。

提前致谢。

【问题讨论】:

  • 好问题。我个人在 $category 数组上的循环中使用 PDO::quote 来处理此类 SQL 查询。

标签: php mysql arrays pdo


【解决方案1】:

这样做

<?php
$categoryId = array(1, 21, 63, 171);
$place_holders = implode(',', categoryId);


$sth = $dbh->prepare("SELECT * FROM items WHERE category in (?) ORDER BY 
                      promotions,price ASC");
$sth->bindParam(1, $place_holders, PDO::PARAM_STR, 12);
$sth->execute($params);

?>

【讨论】:

    【解决方案2】:

    我发现您正在寻找带有LIKE 语句的数字,这很奇怪。 category 不只是类别的 ID 还是如何存储的?如果category 是 CSV 列表,我建议您更改它以使用单独的表进行多对多连接。

    如果它已经是一个数值,只需使用IN 语句

    $categoryResults = $conn->prepare('SELECT * FROM items WHERE category IN (:cats) ORDER BY promotions,price ASC');
    $categoryResults->execute(array(':cats' => implode(',', $category));
    $categoryNumber = $categoryResults->rowCount();
    

    更新 或者更好的是,看看这个问题是一样的。

    Can I bind an array to an IN() condition?

    【讨论】:

    • 每个项目可以是许多不同的类别,因此客户添加一个项目并选择要在其中显示该项目的类别。这可以是他们认为想要显示它的任意多个类别。所以该项目实际上将类别保存到数据库中作为由 a = 分隔的字符串,即 .. 3617=3927=4125 所以使用 = 分解类别会给我 3617 3927 4125。这就是我使用通配符的原因。如果我列出类别 3927 中的所有项目,它将显示。
    • 这就是我使用单独的表格而不是 CSV(或者在你的情况下使用等号分隔列表而不是逗号分隔列表)。在您的数据库上使用规范化,那么您将不会遇到这个问题。 databases.about.com/od/specificproducts/a/normalization.htm
    • 感谢您的回答。我会看看标准化并回来。
    • 你不需要 PHP。您可以使用 mysql JOIN 来组合表,甚至可以使用带有新 SELECT 的 in 函数。 SELECT * FROM items WHERE id IN (SELECT ItemId FROM ItemCategoryTable WHERE CategoryId IN (1,2,3,4,5))
    • 查看我的问题中的链接,将数组绑定到 IN 条件。更详细,然后我可以放入 cmets。归结为使用 implode(',', $array) 来制作逗号分隔列表
    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2013-01-05
    相关资源
    最近更新 更多