php pdo,重构外卡声明

时间:2014-08-06 15:44:29

标签: php mysql sql pdo

我想知道如何重构这段代码,它似乎不是每个字母(A-Z)拉出每个结果的最佳方法。

我正在考虑foreach语句,例如foreach %a, %b等。查询数据库。

$categoryA = query('SELECT * FROM category WHERE category LIKE "A%"',
  array('category' => ['category']),
  $conn);

$categoryB = query('SELECT * FROM category WHERE category LIKE "B%"',
  array('category' => ['category']),
  $conn);

这是我的功能

function query($query, $bindings, $conn)
{
    $stmt = $conn->prepare($query);
    $stmt->execute($bindings);
    return $stmt;
}

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式而不是LIKE来执行此操作。将您的查询更改为:

SELECT * FROM category WHERE category REGEXP "^[A-Z].*"

进一步说明:正则表达式^ [A-Z]。*表示以A到Z的字母开头的任何字符串,后跟任意数量的字符。

我会注意到这种形式的查询,虽然看起来比一堆LIKE查询更优雅,但速度不是很快,因为它不会使用索引。这意味着只有在您知道没有很多行要扫描或者您将返回表中的大多数行时才应该使用它。如果这些条件都不存在,那么最好将LIKE语句连接起来,如下所示:

SELECT * FROM category WHERE (category LIKE "A%" OR category LIKE "B%" OR ... )

后一种形式将使用类别字段上的索引(如果存在)。

答案 1 :(得分:0)

如果我没弄错的话,你几乎不想写26次(26个字符)代码。哪个好,因为那与DRY相反。

你可以这样试试:

$categories = array();

for($i = ord('A'); $i <= ord('Z'); $i++) {
    $char = chr($i);        
    $categories[$char] = $conn->query('SELECT * FROM category WHERE category LIKE "'.$char.'%"')->fetchAll();
}

然后,您将拥有一个关联数组,其中26个字母为键,类别为值。

您的查询功能遗憾地无法为您完成工作,因为它只会返回true(成功时)或false(失败时)。

性能:您仍然会执行26个查询。它不是最高效的解决方案,但我想它很容易理解。

还有:

  

过早优化是万恶之源

(唐纳德克努特)

所以,如果你现在正在学习,试试它是否适合你,并且现在不要过多担心查询的数量。