ExtJSとPHPで検索機能を作成しました。PHPファイルは、データベースと通信するサーバー側スクリプトです。私のLinux環境では、問題なく動作しています。ただし、このアプリケーションをWindows Serverにインストールする必要があるため、個人のWindowsXPにコピーしようとしました。
Apache、必要な拡張機能を備えたPHP、およびMySQLをインストールしました。ログオン画面が読み込まれ、認証が機能します。認証されると、アプリケーションはデータを正常にロードします(データは人に関する情報、idcardなどです)。
検索しようとすると問題が発生します。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フォームが最初に読み込まれるとき、列は正しいです。つまり、名前、idcardなどです。検索を開始するたびに、列名の最初と最後の文字が消えます。つまり、am、dcarなどのようになります。 ..
私がやったことは、名前、idcardなどの複製列を作成することです...それらにam、dcarなどの名前を付けます...
これはデータの重複が多いことは知っていますが、なぜこれがWindowsでのみ発生するのか理解できません。ひどい!
どうもありがとう