'... WHERE LOWER(users.name) REGEXP LOWER(" '.$q.'") OR LOWER(users.name) REGEXP LOWER("^'.$q.'") OR LOWER(users.login) REGEXP LOWER("'.$q.'") OR links.lv REGEXP LOWER("'.$q.'+")'
我需要在PostgreSQL和PDO中准备相同的条件。我正在尝试使用regexp_matches(),但它不适用于PDO。
答案 0 :(得分:2)
如果您坚持修复正则表达式,则需要出现错误消息,但我猜测Postgres正在吐出未找到列的错误或者该订单中的某些内容,如果您的原始查询是任何内容。原因是你使用的是双引号;这些用于引用Postgres中的标识符,其方式与MySQL中的反引号相同。
另请注意,Postgres提供的内容比您尝试使用全文搜索形式发布的查询更好。为了说明,你可以使用类似的东西:
...
where (setweight(to_tsvector(coalesce(users.name, '')), 'A') ||
setweight(to_tsvector(coalesce(users.login, '')), 'B') ||
setweight(to_tsvector(coalesce(users.bio, '')), 'D') ||
setweight(to_tsvector(coalesce(links.lv, '')), 'B')
) @@ plainto_tsquery(:query)
http://www.postgresql.org/docs/current/static/textsearch.html
答案 1 :(得分:2)
你还没有向我们展示$q
是什么,所以你很难猜到你想要做什么。如果它是正则表达式,你可以做类似的事情:
WHERE
LOWER(users.name) ~ :q OR
LOWER(users.name) ~ :q OR
LOWER(users.login) ~ :q OR
links.lv ~ :q
其中:q
是占位符变量,您将其作为命名查询参数传递。请参阅PDO::Prepare。
我强烈怀疑您的$q
实际上只是.*somestring.*
,即您只是在进行中缀模式搜索。如果是这种情况,您最好使用LIKE
而不是MySQL REGEXP
或PostgreSQL ~
并使用模式%somestring%
。
不要像上面那样将文字直接插入到SQL中。
如果$q
为"); DROP TABLE users; --
会怎样?哎呀!请阅读: