Не нравятся результаты поиска? Попробуйте другой поиск!
dle-faq.ru FAQ (все вопросы) Общие вопросы по PHP MySQL error при поисковом запросе

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


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

вопрос
Есть сайт. Сайт работает на движке 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
39

1479 | 390

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'"; 

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 3 февраля 2014 14:18 - шашлычник

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

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


Вставить:

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

skype: elhan.isaev

vitnet
218

2172 | 930

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
3

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";
            }

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

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