【问题标题】:How do I use a question mark '?' in a Zend_Db_Select where() clause?如何使用问号“?”在 Zend_Db_Select where() 子句中?
【发布时间】:2012-01-24 20:41:32
【问题描述】:

我尝试将以下 MySQL 查询转换为等效的 Zend select() 语句:

SELECT `entity_id` FROM `my_table` WHERE `attribute_id` IN (541,554,555,556) \
AND LOWER(REPLACE(TRIM(`value`), '-', '')) REGEXP '([^[:space:]]* )?$param$'

$param 是一个 PHP 变量,经过过滤后仅包含字母数字字符。

这是到目前为止我使用 Zend select() 语句所做的:

$db->select()
   ->from('my_table', 'entity_id')
   ->where('attribute_id IN (?)', array(541,554,555,556))
   ->where('LOWER(REPLACE(TRIM('
       . $db->quoteIdentifier('value')
       . '), "-", "")) REGEXP "([^[:space:]]* )?'
       . $param
       . '$"');

实际输出的 SQL,当$param = 'foo':

SELECT `entity_id` FROM `my_table` WHERE (attribute_id IN (541, 554, 555, 556)) \
AND (LOWER(REPLACE(TRIM(`value`), "-", "")) REGEXP "([^[:space:]]* )foo$")

我需要能够告诉 where() 不要尝试替换问号。怎么样?

【问题讨论】:

  • 我意识到我可以使用等效的REGEXP "([^[:space:]]* ){0,1}foo$。我仍然想知道是否可以使用“?”在 select() 声明中而不被替换。
  • 问题是如何转义? 字符,使其不会被视为占位符,对吧?

标签: php mysql zend-framework


【解决方案1】:

总的来说,我相信您可以简单地替换“?”带有 Zend_Db_Expr('?') 的字符串。

在您的情况下,我认为您希望将整个第二个 WHERE 子句替换为:

->where(new Zend_Db_Expr('LOWER(REPLACE...'))

类似的东西...

【讨论】:

  • 我按照您的建议将整个 LOWER(REPLACE... 包裹在 Zend_Db_Expr 中,但它仍然表现出相同的行为。
  • @nachito:你确定这不起作用吗?我在本地进行了尝试,并得到了您想要的 SQL。
  • @DavidWeinraub 我又试了一次,它奏效了。我的错。谢谢你们俩
  • 问题不适合 Magento,但如果有人最终来到这里(就像我一样)寻找解决这个问题的方法(并且正在使用 Magento),这对我有用:$collection->getSelectSql()->where(new Zend_Db_Expr($yourRegexpCondition), null, Varien_Db_Select::TYPE_CONDITION);。希望对您有所帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多