Mesnyankin
Новичок
Проблемы с поиском по кириллице
Здравствуйте!
Проблема следующего содержания. Делаю интернет магазин www.yougoods.ru на движке Sapid CMF. В форме поиска если запрос вводить на латыне результат выводит. Если на русском, то результа не кокого. К примеру если запрос "новости" на выходе
получаю сообщение "Результаты по запросу - %D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8" и естественно ни чего не находит. Видемо метод Get для передачи запроса преобразует кириллицу в UTF-16. Как решить эту проблему? База данных в utf8_general_ci сравнение то же. Вот код:
get_search.app.php
-----------------------------
<?
function getSearchMatch($keywords) {
$keywords = explode(' ', trim($keywords));
for ($i = 0, $length = sizeof($keywords); $i < $length; ++ $i) {
if (strlen($keywords[$i]) > 2) $keywords[$i] .= '*';
}
$keywords = implode(' ', $keywords);
return "MATCH (B.data) AGAINST('{$keywords}' IN BOOLEAN MODE) ";
}
/**
* Get document/record backup list
*
* @param array system
* @param array system
* @return array results
*/
function get_search($params=array(), $ddc_params=array(), &$ddc_parents) {
global $db;
$SearchMatch = getSearchMatch($params["keywords"]);
$sql = "SELECT {$SearchMatch} as relev, A.url, A.name, UNIX_TIMESTAMP(A.cdate) as cdate_uts, B.qc, B.data FROM ".DOCSTRUCTTABLE." A, ".DOCDATATABLE." B
WHERE {$SearchMatch} >0 AND
A.doc_id = B.struct_id AND
A.site_id = ".SITEID." AND A.everyone='7' GROUP by B.struct_id ORDER by relev DESC";
$data = $db->all($sql);
if($data) {
foreach ($data as $index=> $line) {
$data[$index]["href"] = HTTP_PATH.(preg_replace("/^\//", "", $line["url"]));
}
}
$sql = "SELECT {$SearchMatch} as relev, C.url, A.rec_id, A.name, UNIX_TIMESTAMP(A.cdate) as cdate_uts, B.qc, B.data FROM ".RECSTRUCTTABLE." A, ".RECDATATABLE." B, ".DOCSTRUCTTABLE." C
WHERE {$SearchMatch} >0 AND
C.doc_id = A.document_id AND
A.rec_id = B.struct_id AND
A.site_id = ".SITEID." AND A.everyone='7' GROUP by B.struct_id ORDER by relev DESC";
$rec_data = $db->all($sql);
if($rec_data) {
foreach ($rec_data as $index=> $line) {
$rec_data[$index]["href"] = $line["url"].format2recordid($line["rec_id"])."/";
}
}
$data = array_merge($data, $rec_data);
if($data) {
foreach ($data as $index=> $line) {
$data[$index]["counter"] = $index+1;
$data[$index]["data"] = mb__substr($data[$index]["data"], 1, 300)."...";
}
}
return $data;
}
?>
-~{}~ 30.09.09 16:47:
searchform.tpl - шаблон формы
-------------------------
<form action="/search/" method="GET"> /*вызывает шаблон search.tpl
<input class="text" type="text" name="keywords" />
<input class="botton_search" type="image" src="/views/delivery/img/search.gif" title="Искать" value="Look for" />
</form>
<a href="#">Расширенный поиск</a>
<script language="JavaScript" type="text/javascript">
<!--
var counter = 0
//-->
</script>
-~{}~ 30.09.09 16:48:
search.tpl - шаблон страницы поиска
---------------
В этом файле подключается сценарий ddc - search.xml
...
<sapi
aram name="menu">get_tree()</sapi
aram>
<sapi
aram name="content">
<div id="PageContent">
<sapi:apply name="ddc.search.value" />
</div>
</sapi
aram>
...
-~{}~ 30.09.09 16:51:
search.xml - сценарий ddc, так же содержит форму поиска
-----------------
...
<sapi:for-each select="get_search()" name="enum" title="Get channel">
<sapi
arams>
<sapi
aram name="keywords">&_get_keywords.value;</sapi
aram>
<sapi:code>
<div id="search_title">
<form action="/search/" method="GET">
<input class="stext" type="text" name="keywords" />
<input class="botton_search" type="image" src="/views/delivery/img/search.gif" title="Искать" value="Look for" />
</form>
<script language="JavaScript" type="text/javascript">
<!--
var counter = 0
//-->
</script></br>
Результаты по запросу - &_get_keywords.value; </br>
</div>
</sapi:code>
</sapi
arams>
<sapi:ifempty>Your search - &_get_keywords.value; - did not match any documents. </sapi:ifempty>
<sapi:fallback>CMS-application error</sapi:fallback>
<sapi:choose>
<sapi:when exp="1">
<sapi:code>
<div id="search_output">
<label class="java">
<script language="JavaScript" type="text/javascript">
<!--
add_one()
function add_one()
{ counter = counter + 1 }
document.write(counter + ". ")
//-->
</script>
</label>
<a href="&this.this.href.value;">&this.this.name.value;</a></br></div>
<div id="search_outtext">&this.this.data.value;</br></br>
<a class="slink" href="&this.this.href.value;"><label>http://www.yougoods.ru&this.this.href.value;</label></a></div>
</sapi:code>
...
Если у кого какие мысли есть помогите. Работа встала. На форуме разрабодчиков CMS похожей ситуации не нашел. Зарание спасибо.
Здравствуйте!
Проблема следующего содержания. Делаю интернет магазин www.yougoods.ru на движке Sapid CMF. В форме поиска если запрос вводить на латыне результат выводит. Если на русском, то результа не кокого. К примеру если запрос "новости" на выходе
получаю сообщение "Результаты по запросу - %D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8" и естественно ни чего не находит. Видемо метод Get для передачи запроса преобразует кириллицу в UTF-16. Как решить эту проблему? База данных в utf8_general_ci сравнение то же. Вот код:
get_search.app.php
-----------------------------
<?
function getSearchMatch($keywords) {
$keywords = explode(' ', trim($keywords));
for ($i = 0, $length = sizeof($keywords); $i < $length; ++ $i) {
if (strlen($keywords[$i]) > 2) $keywords[$i] .= '*';
}
$keywords = implode(' ', $keywords);
return "MATCH (B.data) AGAINST('{$keywords}' IN BOOLEAN MODE) ";
}
/**
* Get document/record backup list
*
* @param array system
* @param array system
* @return array results
*/
function get_search($params=array(), $ddc_params=array(), &$ddc_parents) {
global $db;
$SearchMatch = getSearchMatch($params["keywords"]);
$sql = "SELECT {$SearchMatch} as relev, A.url, A.name, UNIX_TIMESTAMP(A.cdate) as cdate_uts, B.qc, B.data FROM ".DOCSTRUCTTABLE." A, ".DOCDATATABLE." B
WHERE {$SearchMatch} >0 AND
A.doc_id = B.struct_id AND
A.site_id = ".SITEID." AND A.everyone='7' GROUP by B.struct_id ORDER by relev DESC";
$data = $db->all($sql);
if($data) {
foreach ($data as $index=> $line) {
$data[$index]["href"] = HTTP_PATH.(preg_replace("/^\//", "", $line["url"]));
}
}
$sql = "SELECT {$SearchMatch} as relev, C.url, A.rec_id, A.name, UNIX_TIMESTAMP(A.cdate) as cdate_uts, B.qc, B.data FROM ".RECSTRUCTTABLE." A, ".RECDATATABLE." B, ".DOCSTRUCTTABLE." C
WHERE {$SearchMatch} >0 AND
C.doc_id = A.document_id AND
A.rec_id = B.struct_id AND
A.site_id = ".SITEID." AND A.everyone='7' GROUP by B.struct_id ORDER by relev DESC";
$rec_data = $db->all($sql);
if($rec_data) {
foreach ($rec_data as $index=> $line) {
$rec_data[$index]["href"] = $line["url"].format2recordid($line["rec_id"])."/";
}
}
$data = array_merge($data, $rec_data);
if($data) {
foreach ($data as $index=> $line) {
$data[$index]["counter"] = $index+1;
$data[$index]["data"] = mb__substr($data[$index]["data"], 1, 300)."...";
}
}
return $data;
}
?>
-~{}~ 30.09.09 16:47:
searchform.tpl - шаблон формы
-------------------------
<form action="/search/" method="GET"> /*вызывает шаблон search.tpl
<input class="text" type="text" name="keywords" />
<input class="botton_search" type="image" src="/views/delivery/img/search.gif" title="Искать" value="Look for" />
</form>
<a href="#">Расширенный поиск</a>
<script language="JavaScript" type="text/javascript">
<!--
var counter = 0
//-->
</script>
-~{}~ 30.09.09 16:48:
search.tpl - шаблон страницы поиска
---------------
В этом файле подключается сценарий ddc - search.xml
...
<sapi
aram name="menu">get_tree()</sapi
aram><sapi
aram name="content"><div id="PageContent">
<sapi:apply name="ddc.search.value" />
</div>
</sapi
aram>...
-~{}~ 30.09.09 16:51:
search.xml - сценарий ddc, так же содержит форму поиска
-----------------
...
<sapi:for-each select="get_search()" name="enum" title="Get channel">
<sapi
arams><sapi
aram name="keywords">&_get_keywords.value;</sapi
aram><sapi:code>
<div id="search_title">
<form action="/search/" method="GET">
<input class="stext" type="text" name="keywords" />
<input class="botton_search" type="image" src="/views/delivery/img/search.gif" title="Искать" value="Look for" />
</form>
<script language="JavaScript" type="text/javascript">
<!--
var counter = 0
//-->
</script></br>
Результаты по запросу - &_get_keywords.value; </br>
</div>
</sapi:code>
</sapi
arams><sapi:ifempty>Your search - &_get_keywords.value; - did not match any documents. </sapi:ifempty>
<sapi:fallback>CMS-application error</sapi:fallback>
<sapi:choose>
<sapi:when exp="1">
<sapi:code>
<div id="search_output">
<label class="java">
<script language="JavaScript" type="text/javascript">
<!--
add_one()
function add_one()
{ counter = counter + 1 }
document.write(counter + ". ")
//-->
</script>
</label>
<a href="&this.this.href.value;">&this.this.name.value;</a></br></div>
<div id="search_outtext">&this.this.data.value;</br></br>
<a class="slink" href="&this.this.href.value;"><label>http://www.yougoods.ru&this.this.href.value;</label></a></div>
</sapi:code>
...
Если у кого какие мысли есть помогите. Работа встала. На форуме разрабодчиков CMS похожей ситуации не нашел. Зарание спасибо.
, но слова из формы отображает все так же в UTF-16 (Результаты по запросу - BE%D1%81%D1%82%D0%B8...)