2010-02-03 47 views
0

我使用ExtJS和PHP創建了一個搜索工具。 PHP文件是與數據庫通信的服務器端腳本。在我的Linux環境中,它的工作完美無瑕。但是,因爲我需要在Windows Server上安裝此應用程序,所以我試圖將其複製到我的個人Windows XP。基於php的ExtJS搜索工具在Windows環境下工作不正常

我安裝了Apache,PHP以及必要的擴展和MySQL。登錄屏幕加載和身份驗證工作。當您通過身份驗證時,應用程序會成功加載數據(數據是關於人員,idcard等的信息)。

每當我嘗試搜索時都會出現問題。當我搜索在Linux envirnoment,這是工作,現在螢火蟲讓我看到以下錯誤:

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表單第一次加載時,列是正確的,即名稱,idcard等......每當我開始搜索時,列名的第一個和最後一個字母消失,這意味着它們變成是這樣的:上午,DCAR等..

我所做的是爲名稱,idcard等造成重複列...命名他們感到,DCAR等..

我知道這是很多重複的數據,但我不明白爲什麼這隻發生在Windows上!它很爛!

非常感謝

+1

少說話,多點代碼。 – 2010-02-03 10:38:34

回答

1

做一些代碼隔離,以縮小問題。

創建一個新的PHP文件。將僅限於的搜索代碼。通過瀏覽器運行php文件(不是extjs代碼)。它是否以同樣的方式失敗?

+0

我離開了重複的列,因爲我在截止日期,沒有時間去縮小代碼。這不會因爲每年創建新表格而產生影響,並且它始終包含相同數量的信息。執行搜索仍然非常快 – seedg 2010-02-09 14:53:40

0

由於它適用於Linux而不是Windows,它可能是文件編碼問題嗎?服務器配置問題? Windows和Linux都指向同一個數據庫嗎?