Prechádzať zdrojové kódy

updated alc query builder for pdo quote

Piotr Labudda 8 rokov pred
rodič
commit
f6bad796e3
1 zmenil súbory, kde vykonal 37 pridanie a 26 odobranie
  1. 37 26
      SE/se-lib/AclQueryBuilder.php

+ 37 - 26
SE/se-lib/AclQueryBuilder.php

@@ -99,26 +99,27 @@ class AclQueryBuilder {
 	public function _generateWhereMain($where) { // @returns string
 		if (is_string($where)) return $where; // whereRaw
 		list($fieldName, $comparisonSign, $value) = $where;
-		$sqlFieldName = $fieldName; // TODO: getSqlFieldName // TODO: get sql field name with table prefix from join list to replace "{$this->_fromPrefix}.{$sqlFieldName}" below
+		// $sqlFieldName = $fieldName; // TODO: getSqlFieldName // TODO: get sql field name with table prefix from join list to replace "{$this->_fromPrefix}.{$sqlFieldName}" below
+		$sqlFieldName = $this->getPDO()->identifierQuote($fieldName);
 		switch ($comparisonSign) {
 			case 'is not null': return "{$this->_fromPrefix}.{$sqlFieldName} is not null";
 			case 'is null': return "{$this->_fromPrefix}.{$sqlFieldName} is null";
-			case 'Intersects': return "Intersects(GeomFromText('{$value}'), {$this->_fromPrefix}.`{$sqlFieldName}`)=1";
-			case 'GeometryType': return "GeometryType({$this->_fromPrefix}.`{$sqlFieldName}`)='{$value}'";
+			case 'Intersects': return "Intersects(GeomFromText('{$value}'), {$this->_fromPrefix}.{$sqlFieldName})=1";
+			case 'GeometryType': return "GeometryType({$this->_fromPrefix}.{$sqlFieldName})='{$value}'";
 			case 'or': return $this->_generateWhereBlock($where);
 			case 'and': return $this->_generateWhereBlock($where);
 			case 'UNIX_TIMESTAMP_LESS_THAN_NOW': return "
-				COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) < UNIX_TIMESTAMP()
-				and {$this->_fromPrefix}.`{$sqlFieldName}` != ''
-				and {$this->_fromPrefix}.`{$sqlFieldName}` != '0000-00-00 00:00:00'
+				COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) < UNIX_TIMESTAMP()
+				and {$this->_fromPrefix}.{$sqlFieldName} != ''
+				and {$this->_fromPrefix}.{$sqlFieldName} != '0000-00-00 00:00:00'
 			";
 			case 'UNIX_TIMESTAMP_NOW_3600': return "
-				COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) < UNIX_TIMESTAMP()+3600
-				and COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) > UNIX_TIMESTAMP()-3600
+				COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) < UNIX_TIMESTAMP()+3600
+				and COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) > UNIX_TIMESTAMP()-3600
 			";
-			case 'UNIX_TIMESTAMP_GREATER_THAN': return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) > '{$value}' ";
-			case 'UNIX_TIMESTAMP_LESS_THAN':		return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) < '{$value}' ";
-			default: return "{$this->_fromPrefix}.{$sqlFieldName} {$comparisonSign} " . DB::getPDO()->quote($value);
+			case 'UNIX_TIMESTAMP_GREATER_THAN': return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) > '{$value}' ";
+			case 'UNIX_TIMESTAMP_LESS_THAN':		return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) < '{$value}' ";
+			default: return "{$this->_fromPrefix}.{$sqlFieldName} {$comparisonSign} " . $this->getPDO()->quote($value);
 		}
 		return null;
 	}
@@ -179,7 +180,7 @@ class AclQueryBuilder {
 		}
 		if (is_string($select)) {
 			// TODO: only real table field
-			// TODO: if geometry type then `AsWKT(t.`{$fieldName}`) as {$fieldName}`
+			// TODO: if geometry type then `AsWKT(t.{$sqlFieldName}) as {$fieldName}`
 			try {
 				return $this->parseSelectFieldValueToSql($select, $this->_fromPrefix);
 			} catch (Exception $e) {
@@ -201,7 +202,7 @@ class AclQueryBuilder {
 		$this->orderBy = [];
 		if (!$orderBy) return $this;
 		// ID A,COL_X D,COL_Y A,...
-	if (false !== strpos($orderBy, '+')) $orderBy = str_replace('+', ' ', $orderBy);
+		if (false !== strpos($orderBy, '+')) $orderBy = str_replace('+', ' ', $orderBy);
 		$sortByEx = array_map('trim', explode(',', $orderBy));
 		$sortByEx = array_filter($sortByEx, ['V', 'filterNotEmpty']);
 		foreach ($sortByEx as $sortPart) {
@@ -228,7 +229,8 @@ class AclQueryBuilder {
 		if (empty($this->orderBy)) return '';
 		$sortByList = [];
 		foreach ($this->orderBy as $orderBy) {
-			$sortByList[] = "t.`{$orderBy[0]}` {$orderBy[1]}";
+			$sqlOrderByField = $this->getPDO()->identifierQuote($orderBy[0]);
+			$sortByList[] = "t.{$sqlOrderByField} {$orderBy[1]}";
 		}
 		return (!empty($sortByList))
 			? "order by " . implode(", ", $sortByList)
@@ -270,27 +272,32 @@ class AclQueryBuilder {
 		return $this->fetchAll();
 	}
 
+	public function getPDO() {
+		$idDatabase = $this->from->getDB();
+		return DB::getPDO($idDatabase);
+	}
+
 	public function fetchAll() {
 		$sql = $this->generateSql();
 		DBG::log((array)$this, 'array', "AclQueryBuilder::fetchAll");
-		return DB::getPDO()->fetchAll($sql);
+		return $this->getPDO()->fetchAll($sql);
 	}
 
 	public function fetchTotal() {
 		$sql = $this->generateSql("count(*) as cnt");
-		return DB::getPDO()->fetchValue($sql);
+		return $this->getPDO()->fetchValue($sql);
 	}
 
 	public function fetchValue() {
 		$sql = $this->generateSql();
 		DBG::log(['sql'=>$sql,'this'=>(array)$this], 'array', "AclQueryBuilder::fetchValue");
-		return DB::getPDO()->fetchValue($sql);
+		return $this->getPDO()->fetchValue($sql);
 	}
 
 	public function fetchFirst() {
 		$sql = $this->generateSql();
 		DBG::log(['sql'=>$sql,'this'=>(array)$this], 'array', "AclQueryBuilder::fetchFirst");
-		return DB::getPDO()->fetchFirst($sql);
+		return $this->getPDO()->fetchFirst($sql);
 	}
 
 	public function generateSql($select = null) {
@@ -376,9 +383,12 @@ class AclQueryBuilder {
 		}
 
 		$sqlOrderBy = $this->generateOrderBySql();
+		$sqlTableName = (is_object($this->from) && method_exists($this->from, 'getSqlTableFrom'))
+		? $this->from->getSqlTableFrom()
+		: $this->getPDO()->tableNameQuote( $tableName );
 		return "
 			select {$sqlSelect}
-			from `{$tableName}` {$this->_fromPrefix}
+			from {$sqlTableName} {$this->_fromPrefix}
 				{$sqlJoin}
 			{$sqlWhere}
 			{$sqlOrderBy}
@@ -394,24 +404,25 @@ class AclQueryBuilder {
 
 		$fieldType = $this->from->getXsdFieldType($fieldName);
 		@list($typePrefix, $typeName, $retTypeName) = explode(':', $fieldType);
+		$sqlFieldName = $this->getPDO()->identifierQuote($fieldName);
 		switch ($typePrefix) {
 			case 'xsd': {
 				switch ($typeName) {
-					case 'base64Binary': return "IF({$prefix}.`{$fieldName}` is not null, 1, 0) as `{$fieldName}`";
-					default: return "{$prefix}.`{$fieldName}`";
+					case 'base64Binary': return "IF({$prefix}.{$sqlFieldName} is not null, 1, 0) as {$sqlFieldName}";
+					default: return "{$prefix}.{$sqlFieldName}";
 				}
 			}
 			// 'gml:PolygonPropertyType':
 			// 'gml:PointPropertyType':
 			// 'gml:LineStringPropertyType':
 			// 'gml:GeometryPropertyType':
-			case 'gml': return "AsWKT({$prefix}.`{$fieldName}`) as `{$fieldName}`";
+			case 'gml': return "AsWKT({$prefix}.{$sqlFieldName}) as {$sqlFieldName}";
 			case 'p5': {
 				switch ($typeName) {
-					case 'price': return "{$prefix}.`{$fieldName}`";
-					case 'enum': return "{$prefix}.`{$fieldName}`"; // TODO: check if local or remote
-					case 'www_link': return "{$prefix}.`{$fieldName}`"; // TODO: check if local or remote?
-					case 'string': return "{$prefix}.`{$fieldName}`"; // TODO: check if local or remote?
+					case 'price': return "{$prefix}.{$sqlFieldName}";
+					case 'enum': return "{$prefix}.{$sqlFieldName}"; // TODO: check if local or remote
+					case 'www_link': return "{$prefix}.{$sqlFieldName}"; // TODO: check if local or remote?
+					case 'string': return "{$prefix}.{$sqlFieldName}"; // TODO: check if local or remote?
 					default: throw new Exception("Not implemented field type in select '{$fieldType}' (field: '{$fieldName}')");
 				}
 			}