{"id":231,"date":"2021-04-03T19:19:02","date_gmt":"2021-04-03T19:19:02","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=231"},"modified":"2021-04-05T03:28:45","modified_gmt":"2021-04-05T03:28:45","slug":"php-flex-search-encontrando-registros-por-multiplos-argumentos-numa-so-tacada","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2021\/04\/03\/php-flex-search-encontrando-registros-por-multiplos-argumentos-numa-so-tacada\/","title":{"rendered":"PHP Flex Search Encontrando Registros Por M\u00faltiplos Argumentos Numa s\u00f3 Tacada"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>$inputTextString = 'cano pvc 3mm rosca azul tigre pc';\n$baseQuery = 'SELECT * FROM product WHERE 1=1 %s';\n\n$flexQuery = ' %1$s (product.code LIKE \\'%%%2$s%%\\' OR product.long_desc LIKE \\'%%%2$s%%\\' OR product.short_desc LIKE \\'%%%2$s%%\\' OR product.brand LIKE \\'%%%2$s%%\\' OR product.measure_unit LIKE \\'%%%2$s%%\\')';\n            \n$flexWhere = '';\n$flexArgs = explode(' ',$inputTextString);\nforeach($flexArgs as $flexArg) {\n  $flexAnd = empty($flexWhere) ? 'AND(' : 'AND';\n  $flexWhere .= vsprintf($flexQuery,&#91;$flexAnd, $flexArg]); \n}\n\n$flexWhere .= empty($flexWhere) ? '' : ')';\n$flexSearch = sprintf($baseQuery, $flexWhere);\n\n$conn = mysqli_connect('localhost', 'username', 'password', 'database');\n$result = mysqli_query($conn, $flexSearch);<\/code><\/pre>\n\n\n\n<p>Sabe quando voc\u00ea vai \u00e0quele material de constru\u00e7\u00e3o e o vendedor n\u00e3o consegue achar o produto que voc\u00ea pediu dentro do sistema de vendas? Pois \u00e9, que falta de sorte n\u00e9!<\/p>\n\n\n\n<p>No meu caso eu acho que dei bastante sorte quando iniciei na programa\u00e7\u00e3o WEB no in\u00edcio dos anos 2000&#8230; trabalhando com sistemas eCommerce uma das j\u00f3ias do nosso aplicativo PHP era a busca de produtos simplesmente informando todas as caracter\u00edsticas para pesquisa num \u00fanico campo string. <\/p>\n\n\n\n<p>Todas as informa\u00e7\u00f5es como partes do nome, marca, modelo, dimens\u00f5es, unidade de medida eram informados num \u00fanico campo TYPE TEXT simplesmente separando as partes por espa\u00e7o em branco, o separador universal mais r\u00e1pido de ser digitado.<\/p>\n\n\n\n<p>Como a t\u00e9cnica n\u00e3o tinha sido nomeada at\u00e9 ent\u00e3o eu acabei dando o nome de FLEX SEARCH por que \u00e9 exatamente isto que este conceito de busca faz, flexibiliza a pesquisa de registros para o operador.. o desenvolvedor que se vire pra fazer o c\u00f3digo funcionar.<\/p>\n\n\n\n<p>Observe no c\u00f3digo que a busca \u00e9 flexibilizada ao m\u00e1ximo, pois tentamos encontrar os fragmentos de pesquisa informados n\u00e3o somente na descri\u00e7\u00e3o do produto, mas tamb\u00e9m em outros campos na tabela, e esta busca \u00e9 feita de forma n\u00e3o obstrutiva, ou seja, a busca tentar encontrar os fragmentos onde for poss\u00edvel mas n\u00e3o requer obrigatoriedade de exist\u00eancia em todos os pontos.<\/p>\n\n\n\n<p>Se voc\u00ea imprimir o conte\u00fado em $flexSearch voc\u00ea vai encontrar uma query como o SELECT logo abaixo. Ent\u00e3o basta simplesmente executar a instru\u00e7\u00e3o SQL para obter os registros desejados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM product WHERE 1=1  AND( (product.code LIKE '%cano%' OR product.long_desc LIKE '%cano%' OR product.short_desc LIKE '%cano%' OR product.brand LIKE '%cano%' OR product.measure_unit LIKE '%cano%') AND (product.code LIKE '%pvc%' OR product.long_desc LIKE '%pvc%' OR product.short_desc LIKE '%pvc%' OR product.brand LIKE '%pvc%' OR product.measure_unit LIKE '%pvc%') AND (product.code LIKE '%3mm%' OR product.long_desc LIKE '%3mm%' OR product.short_desc LIKE '%3mm%' OR product.brand LIKE '%3mm%' OR product.measure_unit LIKE '%3mm%') AND (product.code LIKE '%rosca%' OR product.long_desc LIKE '%rosca%' OR product.short_desc LIKE '%rosca%' OR product.brand LIKE '%rosca%' OR product.measure_unit LIKE '%rosca%') AND (product.code LIKE '%azul%' OR product.long_desc LIKE '%azul%' OR product.short_desc LIKE '%azul%' OR product.brand LIKE '%azul%' OR product.measure_unit LIKE '%azul%') AND (product.code LIKE '%tigre%' OR product.long_desc LIKE '%tigre%' OR product.short_desc LIKE '%tigre%' OR product.brand LIKE '%tigre%' OR product.measure_unit LIKE '%tigre%') AND (product.code LIKE '%pc%' OR product.long_desc LIKE '%pc%' OR product.short_desc LIKE '%pc%' OR product.brand LIKE '%pc%' OR product.measure_unit LIKE '%pc%'))<\/code><\/pre>\n\n\n\n<p>Resumindo, a busca s\u00f3 vai falhar se algum fragmento de pesquisa informado n\u00e3o existir em nenhuma das fontes poss\u00edveis. O PHP ajuda muito na constru\u00e7\u00e3o de queries din\u00e2micas, e este SQL \u00e9 bastante padr\u00e3o ANSI e deveria rodar f\u00e1cil em pelo menos uma d\u00fazia de diferentes bancos de dados.<\/p>\n\n\n\n<p>Da pr\u00f3xima vez que for ao com\u00e9rcio e se deparar com um vendedor em dificuldades, voc\u00ea vai lembrar&#8230; vai a\u00ed um Flex Search?!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sabe quando voc\u00ea vai \u00e0quele material de constru\u00e7\u00e3o e o vendedor n\u00e3o consegue achar o produto que voc\u00ea pediu dentro do sistema de vendas? Pois \u00e9, que falta de sorte n\u00e9! No meu caso eu acho que dei bastante sorte quando iniciei na programa\u00e7\u00e3o WEB no in\u00edcio dos anos 2000&#8230; trabalhando com sistemas eCommerce uma [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,2,19,3,50],"tags":[120,119,121,117,118],"class_list":["post-231","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-database","category-php","category-sql","tag-explode","tag-flex-search","tag-foreach","tag-query","tag-vsprintf"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/comments?post=231"}],"version-history":[{"count":4,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/231\/revisions"}],"predecessor-version":[{"id":240,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/231\/revisions\/240"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}