2010-02-03 2 views
0

ExtJS 및 PHP로 검색 기능을 만들었습니다. PHP 파일은 데이터베이스와 통신하는 서버 측 스크립트입니다. 내 Linux 환경에서 완벽하게 작동합니다. 그러나이 응용 프로그램을 Windows Server에 설치해야하므로 내 개인 Windows XP에 복사하려고했습니다.Windows 환경에서 제대로 작동하지 않는 ExtJS가있는 PHP 기반 검색 기능

필요한 확장과 MySQL을 사용하여 Apache, PHP를 설치했습니다. 로그온 화면이로드되고 인증이 작동합니다. 사용자가 인증되면 응용 프로그램에서 데이터를 성공적으로로드합니다 (데이터는 사람, ID 카드 등의 정보입니다).

검색을 시도 할 때마다 문제가 발생합니다. 나는 리눅스 envirnoment에 검색 할 때, 지금 방화범이 나에게 다음과 같은 오류를 보여줍니다 일하는 :

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

나는 모든 열 '오전'가 없습니다. NAME 컬럼과 가장 유사합니다. 문제를 격리하기 위해 PHP 파일에서 코드 덩어리를 제거하려고했지만 모두 헛된 것이 었습니다.

검색이 Windowos에서 작동하지 않고 Linux에서 작동하는 이유는 무엇입니까?

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에서 샘플을했다 : 여기

는 PHP 파일에 대한 코드입니다. 나는 그것을 많이 수정했다. 그러나 문제의 원인은 getWhere 함수에서 발생했습니다. 그러나 제거하려고 시도하고 코드가 여전히 남아 있습니다.

저는이 문제로 지난 24 시간 동안 고심하고 있습니다. 유일하게 발견 된 '솔루션'은 중복 필드가있는 데이터베이스를 만드는 것이 었습니다. 이유는 다음과 같습니다 :

ExtJS 양식이 처음으로로드 될 때 열 이름, ID 카드 등이 정확합니다. 검색을 시작할 때마다 열 이름의 첫 번째 및 마지막 문자가 사라져서 이 같은 : 오전 DCAR, 등등 ...

내가 무슨 짓을했는지 것은 ... 등, DCAR, 나는 그들을 명명 ... 등 이름, idcard에 대한 중복 열을 만들 내가 아는

입니다 이것은 많은 데이터 중복이지만, 왜 이것이 Windows에서만 발생하는지 이해할 수 없습니다! 그것은 빤다!

많은 감사

+1

대화가 적고 코드가 적습니다. –

답변

1

문제를 좁힐 일부 코드 분리를 수행합니다.

새 PHP 파일을 만듭니다. 에만 검색 코드를 복사하십시오. 브라우저를 통해 PHP 파일을 실행하십시오 (extjs 코드가 아님). 같은 방식으로 실패합니까?

+0

마감 시간에 코드를 좁힐 시간이 없었기 때문에 중복 열을 남겼습니다. 매년 새로운 테이블이 생성되고 항상 같은 양의 정보가 포함되므로 차이는 없습니다. 검색을 수행하는 것이 여전히 매우 빠릅니다. – seedg

0

Linux에서 작동하며 Windows에서는 작동하지 않으므로 파일 인코딩 문제 일 수 있습니까? 서버 구성에 문제가 있습니까? Windows와 Linux가 동일한 데이터베이스를 가리키고 있습니까?

관련 문제