Средство поиска на основе php с ExtJS плохо работает в среде Windows - PullRequest
0 голосов
/ 03 февраля 2010

Я создал средство поиска с ExtJS и PHP.PHP-файл - это серверный скрипт, который связывается с базой данных.В моей среде Linux она работает без нареканий.Однако, поскольку мне нужно установить это приложение на Windows Server, я попытался скопировать его на свою персональную Windows XP.

Я установил Apache, PHP с необходимыми расширениями и MySQL.Загрузится экран входа в систему и аутентификация работает.Когда вы аутентифицируетесь, приложение успешно загружает данные (данные представляют собой информацию о людях; идентификационную карту и т. Д.).

Проблема возникает всякий раз, когда я пытаюсь выполнить поиск.Когда я искал в среде Linux, она работала, теперь Firebug показывает мне следующую ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'am' in 'where clause'

У меня нет столбца 'am'.Наиболее похожим на это является столбец NAME.Я попытался удалить куски кода из файла php, чтобы изолировать проблему, но все было напрасно.

У вас есть идеи, почему поиск не работает в Windowos, а работает в Linux?

Вот код для php-файла:

function regexp($search, $value) {
// case insensitive hard coded
return @preg_match("/$search/i", $value); 
}

function concat_ws() {
    $args = func_get_args();
    $sep = array_shift($args);
    return implode($sep, $args);
} // eo function concat_ws

 function quote_array(&$val, $key, $quot = '"') {
    $quot_right = array_key_exists(1, (array) $quot) ? $quot[1] : $quot[0];
    $val = is_null($val) ? "null" : $quot[0] . preg_replace("/'/", "''", $val) .    $quot_right;
}

class csql {

public function getLastTable() {

$sql  = "SELECT table_name, create_time FROM information_schema.TABLES WHERE table_schema = 'mydbname' ORDER BY CREATE_TIME desc LIMIT 1";

$ostmt = $this->odb->query($sql);
$tableArray = $ostmt->fetchAll(PDO::FETCH_OBJ);

$table = $tableArray[0]->table_name;

return $table;

}

// protected functions
protected function getOdb($engine) {
    switch($engine) {
        case "sqlite":
            if("/" !== $file[0]) {
                $file = realpath(".") . "/$file";
            }
            $odb = new PDO("sqlite:$file");
            $odb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $odb->sqliteCreateFunction("regexp", "regexp", 2);
            $odb->sqliteCreateFunction("concat_ws", "concat_ws");
        break;

        case "mysql";
            $hostname = 'localhost';
            $username = 'myuser';
            $password = 'mypass';
            $odb = new PDO("mysql:host=$hostname;dbname=mydbname", $username, $password);
            $odb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        break;
    }

    return $odb;
} 

protected function getWhere($params) {

    $where = isset($where) ? "where $where" : "";

    $query = "";

    if($query && is_array($search) && sizeof($search)) {
        $a = array();
        foreach($search as $f) {
            $a[] = "$f regexp '$query'";
        }
        $where .= $where ? " and(" : "where (";
        $where .= implode(" or ", $a) . ")";
    }

    return $where;

} 

public function __construct($engine = "mysql") {
    $this->odb = $this->getOdb($engine);
} 

public function getCount($params) {

    // params to variables
    extract($params);

    $selectedFields = $_POST['fields'];

    $selectedFields = explode(",", $selectedFields);


    $count = 0;
    foreach ($selectedFields as $selectedField)
    {

        if ($count == 0)
        {
            $selectedField = substr_replace($selectedField, "", 0, 3);
            $selectedField= substr_replace($selectedField, "", -2);

            $selectedFields[0] = $selectedField;
        }

        else if ($count == count($selectedFields)-1)
        {
            $selectedField = substr_replace($selectedField, "", 0, 2);
            $selectedField = substr_replace($selectedField, "", -3);

            $selectedFields[count($selectedFields)-1] = $selectedField;
        }
        else
        {
            $selectedField = substr_replace($selectedField, "", 0, 2);
            $selectedField = substr_replace($selectedField, "", -2);

            $selectedFields[$count] = $selectedField;
        }

        $count++;
    }

    if ($count == 1)
    {
        $selectedFields[0] = substr_replace($selectedFields[0], "", -1);
    }

    if ($_POST['fields'] == "")
    {
        $like = "";
        foreach ($fields as $field)
        {
            $like = $like . $field . " LIKE '%" . $query . "%' or ";    

        }
        $like = substr_replace($like, "", -3);

    }
    else
    {
        $queryExploded = explode(" ", $query);

        $fullLike = "";

        foreach ($queryExploded as $explode)
        {
            foreach ($selectedFields as $selectedField)
            {
                $fullLike = $fullLike . " " . $selectedField . " LIKE '%" . $explode . "%' OR ";
            }

            $fullLike = substr_replace($fullLike, ") AND (", -3);

        }
        $fullLike = substr_replace($fullLike, "", -5);

    }

    $count = null;

    if ($_POST['fields'] == "")
    {
        $ostmt = $this->odb->prepare("select count(*) from {$params['table']} " . $this->getWhere($params));
    }
    else
    {
        $ostmt = $this->odb->prepare("select count(*) from {$params['table']} where (" . $fullLike . $this->getWhere($params));
    }

    $ostmt->bindColumn(1, $count);
    $ostmt->execute();
    $ostmt->fetch();
    return (int) $count;

} 

public function getData($params) {

    $fullLike = "";
    // params to variables
    extract($params);
    $selectedFields = $_POST['fields'];
    $selectedFields = explode(",", $selectedFields);

    $count = 0;
    foreach ($selectedFields as $selectedField)
    {

        if ($count == 0)
        {
            $selectedField = substr_replace($selectedField, "", 0, 3);
            $selectedField= substr_replace($selectedField, "", -2);

            $selectedFields[0] = $selectedField;
        }
        else if ($count == count($selectedFields)-1)
        {
            $selectedField = substr_replace($selectedField, "", 0, 2);
            $selectedField = substr_replace($selectedField, "", -3);

            $selectedFields[count($selectedFields)-1] = $selectedField;
        }
        else
        {
            $selectedField = substr_replace($selectedField, "", 0, 2);
            $selectedField = substr_replace($selectedField, "", -2);

            $selectedFields[$count] = $selectedField;
        }
        $count++;
    }

    if ($count == 1)
    {
        $selectedFields[0] = substr_replace($selectedFields[0], "", -1);
    }

    if ($_POST['fields'] == "")
    {
        $like = "";
        foreach ($fields as $field)
        {
            $like = $like . $field . " LIKE '%" . $query . "%' or ";    

        }
        $like = substr_replace($like, "", -3);  
    }
    else
    {
        $queryExploded = explode(" ", $query);

        $fullLike = "";

        foreach ($queryExploded as $explode)
        {
            foreach ($selectedFields as $selectedField)
            {
                $fullLike = $fullLike . " " . $selectedField . " LIKE '%" . $explode . "%' OR ";
            }

            $fullLike = substr_replace($fullLike, ") AND (", -3);

        }

        $fullLike = substr_replace($fullLike, "", -5);
    }

    $sql  = "select * ";
    //$sql .= implode(",", $fields);
    if ($fullLike == "")
    {
        $sql .= " from $table";
    }
    else
    {
        $sql .= " from $table where  (" . $fullLike . $this->getWhere($params);
    }
    $sql .= isset($groupBy) && $groupBy ? " group by $groupBy" : "";

    if(!is_null($sort)) {
        $sql .= " order by $sort";
        $sql .= is_null($dir) ? "" : " $dir";
    }
    if(!is_null($start) && !is_null($limit)) {
        $sql .= " limit $start,$limit";
    }


    $ostmt = $this->odb->query($sql);

    return $ostmt->fetchAll(PDO::FETCH_OBJ);

}

Этот код является примером ExtJS.Я изменил это много.Тем не менее, я думаю, что источником проблемы была функция getWhere.Однако я попытался удалить его, и код все еще оставался там.

Последние 24 часа я боролся с этой проблемой.Единственное «решение», которое я нашел, было создание базы данных с дублирующимися полями.Вот причина:

При первой загрузке формы ExtJS столбцы верны, то есть имя, идентификационная карта и т. Д. Всякий раз, когда я начинаю поиск, первая и последняя буквы имени столбца исчезают, что означаетони становятся такими: am, dcar и т. д. *

Что я сделал, так это создал столбцы дублирования для имени, idcard и т. д. ... назвав их am, dcar и т. д.*

Я знаю, что это много дублирования данных, но я не могу понять, почему это происходит только в Windows!Это отстой!

Большое спасибо

Ответы [ 2 ]

1 голос
/ 07 февраля 2010

Сделайте некоторую изоляцию кода, чтобы сузить проблему.

Создать новый файл PHP. Скопируйте ТОЛЬКО поисковый код в него. Запустите файл php через браузер (не код extjs). Это терпит неудачу таким же образом?

0 голосов
/ 07 февраля 2010

Поскольку он работает в Linux, а не в Windows, может ли это быть проблемой кодировки файлов? Проблема с конфигурацией сервера? Windows и Linux указывают на одну и ту же базу данных?

...