Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » MySQL error при поисковом запросе

MySQL error при поисковом запросе


     03.02.2014    Общие вопросы по PHP, Модули, MySQL    3124

вопрос
Есть сайт. Сайт работает на движке DataLife Engine 10.1
На сайте установлен модуль "поиск по дополнительным полям" называется "SearchXField v5.0"
Модуль поддерживает сортировку по одному полю содержащему только числовые значения (Цена, количество, год рождения и т.д.)

форма поиска настраивается вручную.
Например: если я хочу найти товара по диапазону цен то это будет выглядеть так

<form action="/" name="search_xf" method="GET">
<input type="hidden" name="do" value="search_xf" />
<input type="hidden" name="loc" value="1" />
Диапазон цен:
От <input type="text" name="int_start_price" />
До <input type="text" name="int_end_price" />

<select name="cat" class="find3">
<option value=""></option>
<option value="Продажа">Продажа</option>
<option value="Покупка">Покупка</option>
</select>
</form>


Если значение полей между 100 и 200 то URL выглядет так:

_http://site.ru//sf/int_start_price:100/int_end_price:200
Проблем нет!

Проблема в том что если в поле диапазона цен в место цифр написать текс например:Москва

при этом URL выглядет так:
_http://site.ru//sf/int_start_price:Москва/int_end_price:200

то запрос выдает MySQL error
Код ошибки такой:

MySQL error in file: /engine/modules/show.short.php at line 64

Error Number: 1054

The Error returned was:

Unknown column 'Москва' in 'where clause'

SQL query:



SELECT id, autor, date, short_story, SUBSTRING(full_story, 1, 15) as full_story, xfields, title, category, alt_name, comm_num, allow_comm, approve, tags FROM ad_post where SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, 'price|', -1 ) , '||', 1 )>Москва AND SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, 'price|', -1 ) , '||', 1 )<200 AND approve AND date < '2014-02-02 13:53:54' ORDER BY date+0 DESC LIMIT 0,10


Помогите решить проблему..

Заранее огромное спасибо.

PHP код который обрабатывает данные:

<?php

if (!defined('DATALIFEENGINE')) {
    die("Hacking attempt!");
}

$disables = array( 'do', 'cstart', 'page', 'loc', 'news_direction_by', 'news_sort_by' );
$request = $_SERVER['REQUEST_URI'];
$query_string = $_SERVER['QUERY_STRING'];

if ($config['allow_alt_url'] == 'yes')
{
    if ($_GET['loc'])
    {
        $location = '';
        foreach ($_GET as $key => $value)
        {
            if ( $key != 'do' && $key != 'loc' && !is_array($value)){
                $location .= $key . ':' . $value . '/';
            }else if(is_array($value)){
                $location .= $key . ':' . implode(";", $value) . '/';
            }
        }

        header ("Location: $config[http_home_url]sf/$location");
    }

    $tmp_array = explode('/', $_GET['q']);
    $in_array = '';

    unset($_GET);
    $_GET['do'] = 'search_xf';
    $request = substr($request, 1);
    
    foreach($tmp_array as $value)
    {
        if ($value != '')
        {
            $in_array = explode(":", $value);
            $_GET[$in_array[0]] = $in_array[1];
            if($in_array[0] == 'page')
                $cstart = $in_array[1];
        }
    }
}

$url_page = $config['http_home_url'] . $request;

if($_GET['page'] > 1){
    $url_page = preg_replace( "/(page:[0-9]+\\/|cstart:[0-9]+)/", "", $url_page );
}else{
    $url_page = preg_replace( "/(\\/page:[0-9]+\\/|\\/cstart:[0-9]+)/", "", $url_page );
}

if(strpos($query_string, 'cstart') !== false)
{
    $query_string = preg_replace( '/cstart=[0-9]+/', "", $query_string );
    $query_string = substr($query_string, 1);
}
    $user_query = str_replace("&","&amp;",$query_string);

if ($cstart) {
    $cstart = $cstart - 1;
    $cstart = $cstart * $config['news_number'];
}

$newsmodule = true;

if (isset($_GET['news_sort_by'])) $news_sort_by = $_GET['news_sort_by'];
else $news_sort_by = 'date';
    
if (isset($_GET['news_direction_by'])) $news_direction_by = $_GET['news_direction_by'];
else $news_direction_by = 'DESC';

if ($news_sort_by != 'date')
    $select = ", SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$news_sort_by}|', -1 ) ,  '||', 1 ) as $news_sort_by";


$searchQuery = array();
$searchEngine = $_GET;

foreach ($searchEngine as $key => $value)
{
    if (!in_array($key, $disables) and $value !="" and $value != NULL)
    {
        preg_match_all('#int_(.*)_(.*)#', $key, $matches, PREG_SET_ORDER);
        if($matches)
        {
            if($matches[0][1]=='start')
            {
                $searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )>$value";    
            }
            else
            {
                $searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )<$value";
            }
        }
        else
        {
            // if(strpos($_SERVER['REQUEST_URI'], "?do=searchfields") || strpos($_SERVER['REQUEST_URI'], '/sf/'))
            // {
                // $value = $db->safesql(htmlspecialchars(stripslashes($value)));
            // }
            // else
            // {
                // $value = iconv("utf-8","windows-1251",$db->safesql(htmlspecialchars(stripslashes($value))));
            // }
            if ($key != 'category')
            {
                if(strpos($value, ";") === false)
                {
                    $searchArr = array($key, $value);
                    $searchQuery[] = "xfields LIKE '%" . implode('|', $searchArr) . "%'";
                }else{
                    $searchRes = explode(";", $value);
                    foreach($searchRes as $kent){
                        $searchArr = array($key, $kent);
                        $searchLS[] = "xfields LIKE '%" . implode('|', $searchArr) . "%'";
                    }
                    $searchRes = implode(" OR ", $searchLS);
                    $searchQuery[] = '(' .$searchRes. ')';
                    
                }
                
            }
            else
            {
                if ($config['allow_multi_category'] == 'yes')
                {
                    $searchQuery[] = "category regexp '[[:<:]]( $value  )[[:>:]]'";
                }
                else
                {
                    $searchQuery[] = "category = '$value'";
                }
            }
        }
    }
}

unset($matches);
if($searchQuery)
    $where .= implode(' AND ',$searchQuery)." AND";

$sql_select = "SELECT id, autor, date, short_story, SUBSTRING(full_story, 1, 15) as full_story, xfields, title, category, alt_name, comm_num, allow_comm  $select FROM " . PREFIX . "_post where {$where} approve" . $where_date . " ORDER BY " . $news_sort_by . "+0 " . $news_direction_by . " LIMIT " . $cstart . "," . $config['news_number'];  
$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_post where {$where} approve" . $where_date;
$allow_active_news = true;

?>

Ответа пока нет


4 комментария

dj-avtosh
PHP-developer

dj-avtosh - 3 февраля 2014 14:17 -

$searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )>$value"; 


попробовать заменить на

$searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )>'$value'"; 

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 3 февраля 2014 14:18 -

А вообще если туда только цифры нужны, то над:

$searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )>$value"; 


Вставить:

! is_numeric ( $value ) && $value = ( (int) $value );

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

vitnet
PHP-developer

vitnet - 3 февраля 2014 14:19 -

Пробуйте так
                $searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )>'{$value}'";    
            } else {
                $searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )<'{$value}'";

playll.net
Юзер

playll.net - 3 февраля 2014 14:47 -

dj-avtosh,
Спасибо огромное сработало вот так:

 !is_numeric ( $value ) && $value = ( (int) $value );
                $searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )>$value";    
            }
            else
            {
                                !is_numeric ( $value ) && $value = ( (int) $value );
                $searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$matches[0][2]}|', -1 ) ,  '||', 1 )<$value";
            }

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх