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에서만 발생하는지 이해할 수 없습니다! 그것은 빤다!
많은 감사
대화가 적고 코드가 적습니다. –