1<?php 2/* 3 * Copyright 2005-2016 OCSInventory-NG/OCSInventory-ocsreports contributors. 4 * See the Contributors file for more details about them. 5 * 6 * This file is part of OCSInventory-NG/OCSInventory-ocsreports. 7 * 8 * OCSInventory-NG/OCSInventory-ocsreports is free software: you can redistribute 9 * it and/or modify it under the terms of the GNU General Public License as 10 * published by the Free Software Foundation, either version 2 of the License, 11 * or (at your option) any later version. 12 * 13 * OCSInventory-NG/OCSInventory-ocsreports is distributed in the hope that it 14 * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty 15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with OCSInventory-NG/OCSInventory-ocsreports. if not, write to the 20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 21 * MA 02110-1301, USA. 22 */ 23 24 /** 25 * This class implement the base behavior for search : 26 * - Query generation 27 * - Data management 28 * - Return structure 29 * Used in new search 30 */ 31 class Search 32 { 33 34 const SESS_FIELDS = "fields"; 35 const SESS_VALUES = "value"; 36 const SESS_OPERATOR = "operator"; 37 const SESS_COMPARATOR = "comparator"; 38 39 const DB_TEXT = "text"; 40 const DB_INT = "int"; 41 const DB_VARCHAR = "varchar"; 42 const DB_DATETIME = "datetime"; 43 44 const HTML_SELECT = "SELECT"; 45 46 const MULTIPLE_DONE = "DONE"; 47 48 const GROUP_TABLE = "groups_cache"; 49 50 public $correspondance = [ 51 "NAME_ID" => self::DB_VARCHAR, 52 "PUBLISHER_ID" => self::DB_VARCHAR, 53 "VERSION_ID" => self::DB_VARCHAR, 54 "CATEGORY_ID" => self::HTML_SELECT, 55 "CATEGORY" => self::HTML_SELECT, 56 ]; 57 58 private $type; 59 60 public $fieldsList = []; 61 public $defaultFields = [ 62 "hardware.ID", 63 "hardware.DEVICEID", 64 "hardware.NAME", 65 "hardware.WORKGROUP", 66 "hardware.OSNAME", 67 ]; 68 69 public $baseQuery = "SELECT"; 70 public $baseLsitIdQuery = "SELECT hardware.ID"; 71 public $searchQuery = "FROM hardware "; 72 public $queryArgs = []; 73 public $columnsQueryConditions = ""; 74 public $values_cache_sql = []; 75 76 private $translationSearch; 77 private $databaseSearch; 78 private $accountinfoSearch; 79 public $groupSearch; 80 private $softwareSearch; 81 82 /** 83 * Excluded columns that won't be visible 84 */ 85 private $excludedVisuColumns = [ 86 "ID", 87 "HARDWARE_ID" 88 ]; 89 90 /** 91 * Operator list 92 */ 93 private $operatorList = [ 94 "EQUAL", 95 "MORE", 96 "LESS", 97 "LIKE", 98 "DIFFERENT", 99 "ISNULL", 100 "DOESNTCONTAIN", 101 "ISNOTEMPTY", 102 ]; 103 104 /** 105 * Delay operator list 106 */ 107 private $operatorDelay = [ 108 "MORETHANXDAY", 109 "LESSTHANXDAY", 110 ]; 111 112 /** 113 * Operator list 114 */ 115 private $operatorGroup = [ 116 "BELONG", 117 "DONTBELONG", 118 ]; 119 120 /** 121 * Operator list 122 */ 123 private $operatorAccount = [ 124 "HAVING", 125 "NOTHAVING", 126 ]; 127 128 /** 129 * Operator list 130 */ 131 private $operatorAccountCheckbox = [ 132 "HAVINGCHECK", 133 "NOTHAVINGCHECK", 134 ]; 135 136 /** 137 * Comparator list 138 */ 139 private $comparatorList = [ 140 "AND", 141 "OR" 142 ]; 143 144 /** 145 * Multiples fields search 146 */ 147 private $multipleFieldsSearch = []; 148 private $multipleFieldsSearchCache = []; 149 150 /** 151 * Final query and args used for multicrits 152 */ 153 private $finalQuery; 154 private $finalArgs; 155 156 157 /** 158 * Constructor 159 * 160 * @param TranslationSearch $translationSearch 161 * @param DatabaseSearch $databaseSearch 162 * @param AccountinfoSearch $accountinfoSearch 163 * @param GroupSearch $groupSearch 164 * @param SQLCache $sqlCache 165 */ 166 function __construct($translationSearch, $databaseSearch, $accountinfoSearch, $groupSearch, $softwareSearch) 167 { 168 169 $this->translationSearch = $translationSearch; 170 $this->databaseSearch = $databaseSearch; 171 $this->accountinfoSearch = $accountinfoSearch; 172 $this->groupSearch = $groupSearch; 173 $this->softwareSearch = $softwareSearch; 174 175 if ($_SESSION['OCS']['profile']->getConfigValue('DELETE_COMPUTERS') == "YES") { 176 $this->fieldsList['CHECK'] = 'hardwareID'; 177 } 178 179 // Translation for default fields 180 $defaultFieldsArray = ['CHECK' => 'CHECK']; 181 foreach ($this->defaultFields as $value) { 182 $translation = $this->translationSearch->getTranslationForListField($value); 183 if($value = "hardware.NAME"){ 184 $defaultFieldsArray["NAME"] = $value; 185 } 186 $defaultFieldsArray[$translation] = $value; 187 } 188 $this->defaultFields = $defaultFieldsArray; 189 } 190 191 /** 192 * Add sessions infos when search criteria is added 193 * 194 * @param Array $postData 195 * @return void 196 */ 197 public function addSessionsInfos($postData) 198 { 199 $_SESSION['OCS']['multi_search'][$postData['table_select']][uniqid()] = [ 200 self::SESS_FIELDS => $postData['columns_select'], 201 self::SESS_VALUES => null, 202 self::SESS_OPERATOR => null, 203 self::SESS_COMPARATOR => null, 204 ]; 205 } 206 207 /** 208 * Update sessions infos when changing search criteria 209 * 210 * @param Array $postData 211 * @return void 212 */ 213 public function updateSessionsInfos($postData) 214 { 215 foreach ($postData as $key => $value) { 216 $keyExploded = explode("_", $key); 217 if(count($keyExploded) > 1 && !is_null($_SESSION['OCS']['multi_search'][$keyExploded[1]])){ 218 if ($keyExploded[2] == self::SESS_OPERATOR) { 219 $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_OPERATOR] = $value; 220 } elseif($keyExploded[2] == self::SESS_FIELDS && $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_OPERATOR] != 'ISNULL') { 221 $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_VALUES] = $value; 222 }elseif($keyExploded[2] == self::SESS_COMPARATOR){ 223 $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_COMPARATOR] = $value; 224 } 225 }elseif(count($keyExploded) == 4){ 226 $keyExplodedBis = $keyExploded[1]."_".$keyExploded[2]; 227 if(!is_null($_SESSION['OCS']['multi_search'][$keyExplodedBis])){ 228 if ($keyExploded[3] == self::SESS_OPERATOR) { 229 $_SESSION['OCS']['multi_search'][$keyExplodedBis][$keyExploded[0]][self::SESS_OPERATOR] = $value; 230 } elseif($keyExploded[3] == self::SESS_COMPARATOR){ 231 $_SESSION['OCS']['multi_search'][$keyExplodedBis][$keyExploded[0]][self::SESS_COMPARATOR] = $value; 232 } else { 233 $_SESSION['OCS']['multi_search'][$keyExplodedBis][$keyExploded[0]][self::SESS_VALUES] = $value; 234 } 235 } 236 } 237 } 238 } 239 240 /** 241 * Remove sessions data when removing search field 242 * 243 * @param String $rowReference 244 * @return void 245 */ 246 public function removeSessionsInfos($rowReference){ 247 $explodedRef = explode("_", $rowReference); 248 if(empty($explodedRef[2])){ 249 unset($_SESSION['OCS']['multi_search'][$explodedRef[1]][$explodedRef[0]]); 250 }else{ 251 $exploded = $explodedRef[1]."_".$explodedRef[2]; 252 unset($_SESSION['OCS']['multi_search'][$exploded][$explodedRef[0]]); 253 if(empty($_SESSION['OCS']['multi_search'][$exploded])){ 254 unset($_SESSION['OCS']['multi_search'][$exploded]); 255 } 256 } 257 if(empty($_SESSION['OCS']['multi_search'][$explodedRef[1]])){ 258 unset($_SESSION['OCS']['multi_search'][$explodedRef[1]]); 259 } 260 } 261 262 /** 263 * Get the type of the searched field 264 * 265 * @param String $tablename 266 * @param String $fieldsname 267 * @return void 268 */ 269 public function getSearchedFieldType($tablename, $fieldsname) 270 { 271 $tableFields = $this->databaseSearch->getColumnsList($tablename); 272 return $tableFields[$fieldsname][DatabaseSearch::TYPE]; 273 } 274 275 /** 276 * Generate operator uniq id for displaying 277 * 278 * @param String $uniqid 279 * @param String $tableName 280 * @return void 281 */ 282 public function getOperatorUniqId($uniqid, $tableName) 283 { 284 return $uniqid."_".$tableName."_".self::SESS_OPERATOR; 285 } 286 287 /** 288 * Generate comparator uniq id for displaying 289 * 290 * @param String $uniqid 291 * @param String $tableName 292 * @return void 293 */ 294 public function getComparatorUniqId($uniqid, $tableName) 295 { 296 return $uniqid."_".$tableName."_".self::SESS_COMPARATOR; 297 } 298 299 /** 300 * Generate feilds uniq id for displaying 301 * 302 * @param String $uniqid 303 * @param String $tableName 304 * @return void 305 */ 306 public function getFieldUniqId($uniqid, $tableName) 307 { 308 return $uniqid."_".$tableName."_".self::SESS_FIELDS; 309 } 310 311 /** 312 * Generate search query (operator and values) 313 * 314 * @param Array $sessData 315 * @return void 316 */ 317 public function generateSearchQuery($sessData){ 318 319 $accountInfos = new AccountinfoSearch(); 320 $this->pushBaseQueryForTable("hardware", null); 321 if(!isset($sessData['accountinfo'])) $sessData['accountinfo'] = array(); 322 foreach ($sessData as $tableName => $searchInfos) { 323 if($tableName != "hardware"){ 324 $this->pushBaseQueryForTable($tableName, $sessData); 325 } 326 } 327 $i = 0; 328 $p = 0; 329 330 foreach ($sessData as $tableName => $searchInfos) { 331 332 if($tableName != "hardware"){ 333 // Generate union 334 if ($tableName == "groups_cache") { 335 $this->searchQuery .= "LEFT JOIN $tableName on hardware.id = $tableName.hardware_id "; 336 } else { 337 $this->searchQuery .= "INNER JOIN $tableName on hardware.id = $tableName.hardware_id "; 338 } 339 } 340 341 if($tableName == SoftwareSearch::SOFTWARE_TABLE) { 342 $this->searchQuery .= "LEFT JOIN software_name on software_name.id = $tableName.name_id "; 343 $this->searchQuery .= "LEFT JOIN software_publisher on software_publisher.id = $tableName.publisher_id "; 344 $this->searchQuery .= "LEFT JOIN software_version on software_version.id = $tableName.version_id "; 345 } 346 347 foreach ($searchInfos as $index => $value) { 348 if($tableName == "download_history" && $value['fields'] == "PKG_NAME") { 349 // Generate union 350 $this->searchQuery .= "INNER JOIN download_available on download_available.FILEID = $tableName.PKG_ID "; 351 } 352 353 if($value['comparator'] != null){ 354 $operator[] = $value['comparator']; 355 }elseif($i != 0 && $value['comparator'] == null){ 356 $operator[] = "AND"; 357 }else{ 358 $operator[] = ""; 359 } 360 $i++; 361 } 362 363 $isSameColumn = []; 364 $columnName = []; 365 $doesntcontainmulti = []; 366 367 368 foreach ($searchInfos as $index => $value) { 369 $values[] = $value; 370 $columnName[$index] = $value['fields']; 371 $containvalue[$index] = $value['operator']; 372 } 373 374 foreach ($searchInfos as $index => $value) { 375 $nameTable = $tableName; 376 $open=""; 377 $close=""; 378 // Generate condition 379 $this->getOperatorSign($value); 380 if($nameTable == SoftwareSearch::SOFTWARE_TABLE) { 381 $nameTable = $this->softwareSearch->getTableName($value['fields']); 382 $value[self::SESS_FIELDS] = $this->softwareSearch->getColumnName($value['fields']); 383 //var_dump() 384 } 385 386 foreach(array_count_values($columnName) as $name => $nb){ 387 if($nb > 1){ 388 $isSameColumn[$nameTable] = $name; 389 } 390 } 391 392 foreach(array_count_values($containvalue) as $name => $nb){ 393 if($nb > 1){ 394 $doesntcontainmulti[$nameTable] = $name; 395 } 396 } 397 398 if($p == 0 && $operator[$p+1] == 'OR'){ 399 $open = "("; 400 }if($operator[$p] =='OR' && $operator[$p+1] !='OR'){ 401 $close=")"; 402 }if($p != 0 && $operator[$p] !='OR' && $operator[$p+1] =='OR'){ 403 $open = "("; 404 } 405 406 unset($value['ignore']); 407 408 if($value[self::SESS_OPERATOR] == "DOESNTCONTAIN" && empty($doesntcontainmulti)){ 409 $excluID = $this->contain($value, $nameTable); 410 if($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE){ 411 $value[self::SESS_FIELDS] = "HARDWARE_ID"; 412 }else{ 413 $value[self::SESS_FIELDS] = "ID"; 414 } 415 416 $value[self::SESS_VALUES] = implode(',', $excluID); 417 $value[self::SESS_OPERATOR] = "NOT IN"; 418 419 }elseif($value[self::SESS_OPERATOR] == "DOESNTCONTAIN" && !empty($isSameColumn) && !empty($doesntcontainmulti)){ 420 $excluID = $this->containmulti($isSameColumn, $searchInfos); 421 if($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE){ 422 $value[self::SESS_FIELDS] = "HARDWARE_ID"; 423 }else{ 424 $value[self::SESS_FIELDS] = "ID"; 425 } 426 427 $value[self::SESS_VALUES] = implode(',', $excluID); 428 $value[self::SESS_OPERATOR] = "NOT IN"; 429 $value['ignore'] = ""; 430 } 431 432 if(!empty($isSameColumn) && $isSameColumn[$nameTable] == $value[self::SESS_FIELDS] 433 && !array_key_exists("ignore", $value) && !array_key_exists('devices', $isSameColumn)){ 434 if($value[self::SESS_OPERATOR] != "IS NULL"){ 435 if ($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE && $nameTable != self::GROUP_TABLE && $value[self::SESS_FIELDS] != 'CATEGORY_ID' && $value[self::SESS_FIELDS] != 'CATEGORY' 436 && $value[self::SESS_OPERATOR] != "NOT IN") { 437 $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s %s '%s')$close "; 438 $this->queryArgs[] = $nameTable; 439 $this->queryArgs[] = $nameTable; 440 $this->queryArgs[] = $nameTable; 441 $this->queryArgs[] = $value[self::SESS_FIELDS]; 442 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 443 $this->queryArgs[] = $value[self::SESS_VALUES]; 444 }elseif($nameTable == self::GROUP_TABLE || $value[self::SESS_FIELDS] == 'CATEGORY_ID' || $value[self::SESS_FIELDS] == 'CATEGORY' 445 || $value[self::SESS_OPERATOR] == "NOT IN"){ 446 $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s %s (%s))$close "; 447 if($nameTable == self::GROUP_TABLE){ 448 $this->queryArgs[] = $nameTable; 449 $this->queryArgs[] = $nameTable; 450 $this->queryArgs[] = 'hardware'; 451 $this->queryArgs[] = 'ID'; 452 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 453 $this->queryArgs[] = $this->groupSearch->get_all_id($value[self::SESS_VALUES]); 454 }else{ 455 $this->queryArgs[] = $nameTable; 456 $this->queryArgs[] = $nameTable; 457 $this->queryArgs[] = $nameTable; 458 $this->queryArgs[] = $value[self::SESS_FIELDS]; 459 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 460 $this->queryArgs[] = $value[self::SESS_VALUES]; 461 } 462 } elseif($value[self::SESS_OPERATOR] == "ISNOTEMPTY") { 463 $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s IS NOT NULL AND TRIM(%s.%s) != '')$close "; 464 $this->queryArgs[] = $nameTable; 465 $this->queryArgs[] = $nameTable; 466 $this->queryArgs[] = $nameTable; 467 $this->queryArgs[] = $value[self::SESS_FIELDS]; 468 $this->queryArgs[] = $nameTable; 469 $this->queryArgs[] = $value[self::SESS_FIELDS]; 470 }else{ 471 if($value[self::SESS_OPERATOR] == "MORETHANXDAY" || $value[self::SESS_OPERATOR] == "LESSTHANXDAY") { 472 $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE %s.%s %s NOW() - INTERVAL %s DAY)$close "; 473 $this->queryArgs[] = $nameTable; 474 $this->queryArgs[] = $nameTable; 475 $this->queryArgs[] = $value[self::SESS_FIELDS]; 476 if($value[self::SESS_OPERATOR] == "MORETHANXDAY") { $op = "<"; } else { $op = ">"; } 477 $this->queryArgs[] = $op; 478 $this->queryArgs[] = $value[self::SESS_VALUES]; 479 // text fix datetime in multisearch 480 } else if($this->getSearchedFieldType($nameTable, $value[self::SESS_FIELDS]) == 'datetime' && $value[self::SESS_OPERATOR] != "MORETHANXDAY" && $value[self::SESS_OPERATOR] != "LESSTHANXDAY" ) { 481 $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s str_to_date('%s', '%s')$close "; 482 $this->queryArgs[] = $nameTable; 483 $this->queryArgs[] = $value[self::SESS_FIELDS]; 484 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 485 $this->queryArgs[] = $value[self::SESS_VALUES]; 486 global $l; 487 $this->queryArgs[] = $l->g(269); 488 } else { 489 $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE %s.%s %s '%s')$close "; 490 $this->queryArgs[] = $nameTable; 491 $this->queryArgs[] = $nameTable; 492 $this->queryArgs[] = $value[self::SESS_FIELDS]; 493 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 494 $this->queryArgs[] = $value[self::SESS_VALUES]; 495 } 496 } 497 }else{ 498 if ($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE) { 499 $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s %s)$close "; 500 $this->queryArgs[] = $nameTable; 501 $this->queryArgs[] = $nameTable; 502 $this->queryArgs[] = $nameTable; 503 $this->queryArgs[] = $value[self::SESS_FIELDS]; 504 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 505 }else{ 506 $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE %s.%s %s)$close "; 507 $this->queryArgs[] = $nameTable; 508 $this->queryArgs[] = $nameTable; 509 $this->queryArgs[] = $value[self::SESS_FIELDS]; 510 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 511 } 512 } 513 }elseif($value[self::SESS_OPERATOR] == 'IS NULL' && (empty($isSameColumn))){ 514 $this->columnsQueryConditions .= "$operator[$p] $open%s.%s IS NULL OR TRIM(%s.%s) = ''$close "; 515 $this->queryArgs[] = $nameTable; 516 $this->queryArgs[] = $value[self::SESS_FIELDS]; 517 $this->queryArgs[] = $nameTable; 518 $this->queryArgs[] = $value[self::SESS_FIELDS]; 519 } elseif($value[self::SESS_OPERATOR] == "ISNOTEMPTY") { 520 $this->columnsQueryConditions .= "$operator[$p] $open%s.%s IS NOT NULL AND TRIM(%s.%s) != ''$close "; 521 $this->queryArgs[] = $nameTable; 522 $this->queryArgs[] = $value[self::SESS_FIELDS]; 523 $this->queryArgs[] = $nameTable; 524 $this->queryArgs[] = $value[self::SESS_FIELDS]; 525 } elseif($nameTable == self::GROUP_TABLE || $value[self::SESS_FIELDS] == 'CATEGORY_ID' || $value[self::SESS_FIELDS] == 'CATEGORY' 526 || $value[self::SESS_OPERATOR] == "NOT IN"){ 527 $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s (%s)$close "; 528 if($nameTable == self::GROUP_TABLE){ 529 $this->queryArgs[] = 'hardware'; 530 $this->queryArgs[] = 'ID'; 531 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 532 $this->queryArgs[] = $this->groupSearch->get_all_id($value[self::SESS_VALUES]); 533 }else{ 534 $this->queryArgs[] = $nameTable; 535 $this->queryArgs[] = $value[self::SESS_FIELDS]; 536 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 537 $this->queryArgs[] = $value[self::SESS_VALUES]; 538 } 539 // test fix datetime in multisearch 540 }else if($this->getSearchedFieldType($nameTable, $value[self::SESS_FIELDS]) == 'datetime' && $value[self::SESS_OPERATOR] != "MORETHANXDAY" && $value[self::SESS_OPERATOR] != "LESSTHANXDAY" ){ 541 $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s str_to_date('%s', '%s')$close "; 542 $this->queryArgs[] = $nameTable; 543 $this->queryArgs[] = $value[self::SESS_FIELDS]; 544 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 545 $this->queryArgs[] = $value[self::SESS_VALUES]; 546 global $l; 547 $this->queryArgs[] = $l->g(269); 548 } elseif($value[self::SESS_OPERATOR] == "MORETHANXDAY" || $value[self::SESS_OPERATOR] == "LESSTHANXDAY") { 549 $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s NOW() - INTERVAL %s DAY$close "; 550 $this->queryArgs[] = $nameTable; 551 $this->queryArgs[] = $value[self::SESS_FIELDS]; 552 if($value[self::SESS_OPERATOR] == "MORETHANXDAY") { $op = "<"; } else { $op = ">"; } 553 $this->queryArgs[] = $op; 554 $this->queryArgs[] = $value[self::SESS_VALUES]; 555 } else { 556 $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s '%s'$close "; 557 if($nameTable == "download_history" && $value[self::SESS_FIELDS] == "PKG_NAME"){ 558 $this->queryArgs[] = 'download_available'; 559 $this->queryArgs[] = 'NAME'; 560 }else{ 561 $this->queryArgs[] = $nameTable; 562 $this->queryArgs[] = $value[self::SESS_FIELDS]; 563 } 564 $this->queryArgs[] = $value[self::SESS_OPERATOR]; 565 $this->queryArgs[] = $value[self::SESS_VALUES]; 566 } 567 $p++; 568 } 569 } 570 $this->columnsQueryConditions = "WHERE".$this->columnsQueryConditions; 571 572 // has tag restrictions? 573 if(!empty($_SESSION['OCS']['TAGS'])) 574 { 575 $tags = $_SESSION['OCS']['TAGS']; 576 foreach($tags as $k => $v) 577 $tags[$k] = "'".mysqli_real_escape_string($_SESSION['OCS']["readServer"], $v)."'"; 578 $tags = implode(', ', $tags); 579 $this->columnsQueryConditions .= " AND accountinfo.TAG IN ($tags)"; 580 } 581 582 // has lock machine ? 583 if (isset($_SESSION['OCS']["mesmachines"]) && strpos($_SESSION['OCS']["mesmachines"], 'a.TAG') === false) { 584 $lockResult = str_replace('a.hardware_id', 'accountinfo.hardware_id', $_SESSION['OCS']["mesmachines"]); 585 $this->columnsQueryConditions .= " AND " . $lockResult; 586 } 587 588 $this->columnsQueryConditions .= " GROUP BY hardware.id"; 589 $this->baseQuery = substr($this->baseQuery, 0, -1); 590 } 591 592 /** 593 * Generate select query for table using session variables generated from the search 594 * 595 * @param String $tableName 596 * @param Array $sessData 597 * @return void 598 */ 599 private function pushBaseQueryForTable($tableName, $sessData = null){ 600 foreach($this->databaseSearch->getColumnsList($tableName) as $index => $fieldsInfos){ 601 $name = ""; 602 if($tableName == "download_history" && $fieldsInfos['Field'] == "PKG_NAME"){ 603 $tableName = "download_available"; 604 $fieldsInfos['Field'] = "NAME"; 605 } 606 607 if($tableName == "software" && array_key_exists($fieldsInfos['Field'], $this->correspondance)) { 608 if($fieldsInfos['Field'] == "CATEGORY") { 609 $table = $tableName."_name"; 610 $field = "CATEGORY"; 611 } else { 612 $name = explode("_", $fieldsInfos['Field']); 613 $table = $tableName."_".strtolower($name[0]); 614 $field = $name[0]; 615 } 616 $generatedId = $table.".".$field; 617 $selectAs = $table.$field; 618 $this->baseQuery .= " %s.%s AS ".$selectAs." ,"; 619 $this->queryArgs[] = $table; 620 $this->queryArgs[] = $field; 621 } else { 622 $generatedId = $tableName.".".$fieldsInfos['Field']; 623 $selectAs = $tableName.$fieldsInfos['Field']; 624 $this->baseQuery .= " %s.%s AS ".$selectAs." ,"; 625 $this->queryArgs[] = $tableName; 626 $this->queryArgs[] = $fieldsInfos['Field']; 627 } 628 629 630 if($generatedId == 'hardware.NAME'){ 631 $this->fieldsList["NAME"] = $selectAs; 632 } elseif($generatedId != 'hardware.ID') { 633 $this->fieldsList[$this->translationSearch->getTranslationForListField($generatedId)] = $selectAs; 634 } 635 636 /*if($sessData != null){ 637 if($sessData[$tableName][key($sessData[$tableName])][self::SESS_FIELDS] == $fieldsInfos['Field']){ 638 $this->defaultFields[$this->translationSearch->getTranslationForListField($generatedId)] = $generatedId; 639 } 640 }*/ 641 642 } 643 } 644 645 /** 646 * Depending on selected operator 647 * Return compliant operator for database query 648 * 649 * @param Array $valueArray 650 * @return void 651 */ 652 public function getOperatorSign(&$valueArray){ 653 switch ($valueArray[self::SESS_OPERATOR]) { 654 case 'EQUAL': 655 $valueArray[self::SESS_OPERATOR] = "="; 656 break; 657 case 'MORE': 658 $valueArray[self::SESS_OPERATOR] = ">"; 659 break; 660 case 'LESS': 661 $valueArray[self::SESS_OPERATOR] = "<"; 662 break; 663 case 'LIKE': 664 $valueArray[self::SESS_OPERATOR] = "LIKE"; 665 $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%"; 666 break; 667 case 'DIFFERENT': 668 $valueArray[self::SESS_OPERATOR] = "NOT LIKE"; 669 $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%"; 670 break; 671 case 'ISNULL': 672 $valueArray[self::SESS_OPERATOR] = "IS NULL"; 673 break; 674 case 'ISNOTEMPTY': 675 $valueArray[self::SESS_OPERATOR] = "ISNOTEMPTY"; 676 break; 677 case 'DOESNTCONTAIN': 678 $valueArray[self::SESS_OPERATOR] = "DOESNTCONTAIN"; 679 break; 680 case 'BELONG' : 681 $valueArray[self::SESS_OPERATOR] = "IN"; 682 break; 683 case 'DONTBELONG' : 684 $valueArray[self::SESS_OPERATOR] = "NOT IN"; 685 break; 686 case 'NOTHAVING' : 687 $valueArray[self::SESS_OPERATOR] = "!="; 688 break; 689 case 'NOTHAVINGCHECK' : 690 $valueArray[self::SESS_OPERATOR] = "NOT LIKE"; 691 $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%"; 692 break; 693 case 'HAVINGCHECK' : 694 $valueArray[self::SESS_OPERATOR] = "LIKE"; 695 $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%"; 696 break; 697 case 'MORETHANXDAY' : 698 $valueArray[self::SESS_OPERATOR] = "MORETHANXDAY"; 699 break; 700 case 'LESSTHANXDAY' : 701 $valueArray[self::SESS_OPERATOR] = "LESSTHANXDAY"; 702 break; 703 default: 704 $valueArray[self::SESS_OPERATOR] = "="; 705 break; 706 } 707 } 708 709 /** 710 * Generate HTML select options for operators 711 * 712 * @param String $defaultValue 713 * @return void 714 */ 715 public function getSelectOptionForOperators($defaultValue, $table = null, $field = null) 716 { 717 $account = new AccountinfoSearch(); 718 $accounttype = null; 719 if($field != null && $field != "LASTCOME" && $field != "LASTDATE"){ 720 $accounttype = $account->getSearchAccountInfo($field); 721 } 722 723 $html = ""; 724 $operatorList = array(); 725 if($table == self::GROUP_TABLE || $field == "CATEGORY_ID" || $field == "CATEGORY") { 726 $operatorList = $this->operatorGroup; 727 } elseif($accounttype == '2' || $accounttype == '11') { 728 $operatorList = $this->operatorAccount; 729 } elseif($accounttype == '5') { 730 $operatorList = $this->operatorAccountCheckbox; 731 } elseif($this->getSearchedFieldType($table, $field) == 'datetime') { 732 $operatorList = array_merge($this->operatorList, $this->operatorDelay); 733 } else { 734 $operatorList = $this->operatorList; 735 } 736 737 foreach ($operatorList as $value) { 738 $trValue = $this->translationSearch->getTranslationForOperator($value); 739 if ($defaultValue == $value) { 740 $html .= "<option selected value=".$value." >".$trValue."</option>"; 741 } else { 742 $html .= "<option value=".$value." >".$trValue."</option>"; 743 } 744 } 745 746 return $html; 747 } 748 749 /** 750 * Generate HTML select options for tables select 751 * 752 * @param String $defautValue 753 * @return void 754 */ 755 public function getSelectOptionForTables($defautValue = null) 756 { 757 $html = "<option>----------</option>"; 758 foreach ($this->databaseSearch->getTablesList() as $tableName) { 759 $translation = $this->translationSearch->getTranslationFor($tableName); 760 $sortTable[$tableName] .= $translation; 761 } 762 asort($sortTable); 763 foreach ($sortTable as $key => $value){ 764 if ($defautValue == $key) { 765 $html .= "<option selected value=".$key." >".$value."</option>"; 766 } else { 767 $html .= "<option value=".$key." >".$value."</option>"; 768 } 769 770 } 771 return $html; 772 } 773 774 /** 775 * Generate HTML select options for columns select 776 * 777 * @param String $tableName 778 * @return void 779 */ 780 public function getSelectOptionForColumns($tableName = null) 781 { 782 $html = ""; 783 $sortColumn = array(); 784 if($tableName == "accountinfo"){ 785 $accountinfoList = new AccountinfoSearch(); 786 $accountFields = $accountinfoList->getAccountInfosList(); 787 if(isset($accountFields['COMPUTERS']) && is_array($accountFields['COMPUTERS'])) 788 foreach ($accountFields['COMPUTERS'] as $index => $fieldsInfos) { 789 if(!in_array($fieldsIndefaultTablefos[DatabaseSearch::FIELD], $this->excludedVisuColumns)){ 790 $trField = $fieldsInfos; 791 $sortColumn[$index] .= $trField; 792 } 793 } 794 }elseif($tableName == self::GROUP_TABLE){ 795 $trField = $this->translationSearch->getTranslationFor('NAME'); 796 $sortColumn['name'] = $trField; 797 }else{ 798 $fields = $this->databaseSearch->getColumnsList($tableName); 799 if(is_array($fields)) foreach ($fields as $index => $fieldsInfos) { 800 if(!in_array($fieldsIndefaultTablefos[DatabaseSearch::FIELD], $this->excludedVisuColumns)){ 801 $trField = $this->translationSearch->getTranslationFor($fieldsInfos[DatabaseSearch::FIELD]); 802 $sortColumn[$fieldsInfos[DatabaseSearch::FIELD]] .= $trField; 803 } 804 } 805 } 806 asort($sortColumn); 807 foreach ($sortColumn as $key => $value){ 808 if(!in_array($fieldsIndefaultTablefos[DatabaseSearch::FIELD], $this->excludedVisuColumns)){ 809 $html .= "<option value=".$key." >".$value."</option>"; 810 } 811 } 812 return $html; 813 } 814 815 /** 816 * Generate HTML fields depending on database field type 817 * 818 * @param String $uniqid 819 * @param Array $fieldsInfos 820 * @param String $tableName 821 * @return String HTML 822 */ 823 public function returnFieldHtml($uniqid, $fieldsInfos, $tableName, $field = null, $operator = null) 824 { 825 global $l; 826 827 $fieldId = $this->getFieldUniqId($uniqid, $tableName); 828 $fieldGroup = array(); 829 830 $accountInfos = new AccountinfoSearch(); 831 832 if($field != null && $field != "CATEGORY_ID" && $field != "CATEGORY" && $operator == null){ 833 $accounttype = $accountInfos->getSearchAccountInfo($field); 834 } 835 836 if($tableName == self::GROUP_TABLE) { 837 $this->type = self::HTML_SELECT; 838 } elseif(array_key_exists($field, $this->correspondance)) { 839 $this->type = $this->correspondance[$field]; 840 }elseif($accounttype == '2' || $accounttype == '11' || $accounttype =='5') { 841 $this->type = self::HTML_SELECT; 842 } else { 843 $this->type = $this->getSearchedFieldType($tableName, $fieldsInfos[self::SESS_FIELDS]); 844 } 845 846 if($operator == "MORETHANXDAY" || $operator == "LESSTHANXDAY") { 847 $this->type = self::DB_INT; 848 } 849 850 $html = ""; 851 if($fieldsInfos[self::SESS_OPERATOR]== 'ISNULL' || $fieldsInfos[self::SESS_OPERATOR]== 'ISNOTEMPTY'){ 852 $attr = 'disabled'; 853 }else{ 854 $attr = ''; 855 } 856 857 switch ($this->type) { 858 case self::DB_VARCHAR: 859 $html = '<input class="form-control" type="text" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>'; 860 break; 861 862 case self::DB_TEXT: 863 $html = '<input class="form-control" type="text" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>'; 864 break; 865 866 case self::DB_INT: 867 $html = '<input class="form-control" type="number" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>'; 868 break; 869 870 case self::DB_DATETIME: 871 $html = '<div class="input-group date form_datetime"> 872 <input type="text" class="form-control" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'/> 873 <span class="input-group-addon"> 874 '.calendars($fieldId, $l->g(1270)).' 875 </span> 876 </div>'; 877 break; 878 case self::HTML_SELECT: 879 880 $html = '<select class="form-control" name="'.$fieldId.'" id="'.$fieldId.'">'; 881 if($accounttype != null) { 882 $fieldSelect = $accountInfos->find_accountinfo_values($field, $accounttype); 883 } elseif($field == 'CATEGORY_ID') { 884 $fieldSelect = $this->asset_categories(); 885 } elseif($field == 'CATEGORY'){ 886 require_once('require/softwares/SoftwareCategory.php'); 887 $soft = new SoftwareCategory(); 888 $fieldSelect = $soft->search_all_cat(); 889 unset($fieldSelect[0]); 890 } else { 891 $fieldSelect = $this->groupSearch->get_group_name(); 892 } 893 894 foreach ($fieldSelect as $key => $value){ 895 if ($fieldsInfos[self::SESS_VALUES] == $key) { 896 $html .= "<option value=".$key." selected >".$value."</option>"; 897 } else { 898 $html .= "<option value=".$key." >".$value."</option>"; 899 } 900 } 901 $html .= '</select>'; 902 break; 903 904 default: 905 $html = '<input class="form-control" type="text" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>'; 906 break; 907 } 908 909 return $html; 910 } 911 912 public function returnFieldHtmlAndOr($uniqid, $fieldsInfos, $infos, $tableName, $defaultValue = null) 913 { 914 global $l; 915 $i = 0; 916 917 foreach ($infos as $id => $value){ 918 if($value['fields'] == $fieldsInfos['fields']){ 919 $i++; 920 } 921 } 922 923 $fieldId = $this->getFieldUniqId($uniqid, $tableName); 924 $html = ""; 925 926 if($i > 1){ 927 $html = "<select class='form-control' name='".$this->getComparatorUniqId($uniqid, $tableName)."' id='".$this->getComparatorUniqId($uniqid, $tableName)."'>"; 928 foreach ($this->comparatorList as $value) { 929 $trValue = $this->translationSearch->getTranslationForComparator($value); 930 if ($defaultValue == $value) { 931 $html .= "<option selected value=".$value." >".$trValue."</option>"; 932 } else { 933 $html .= "<option value=".$value." >".$trValue."</option>"; 934 } 935 } 936 $html .= "</select>"; 937 } 938 939 return $html; 940 } 941 942 /** 943 * [link_multi description] 944 * @param string $fields [description] 945 * @param string $value [description] 946 * @param string $option [description] 947 * @return [type] [description] 948 */ 949 public function link_multi($fields, $value, $option = ""){ 950 switch($fields){ 951 case 'cveNamePublisherVersion': 952 $value = explode(";", $value); 953 $_SESSION['OCS']['multi_search'] = array(); 954 $_SESSION['OCS']['multi_search']['software']['allsoft'] = [ 955 'fields' => 'NAME_ID', 956 'value' => $value[0], 957 'operator' => 'EQUAL', 958 ]; 959 $_SESSION['OCS']['multi_search']['software']['allsoftpublisher'] = [ 960 'fields' => 'PUBLISHER_ID', 961 'value' => $value[1], 962 'operator' => 'EQUAL', 963 ]; 964 $_SESSION['OCS']['multi_search']['software']['allsoftversion'] = [ 965 'fields' => 'VERSION_ID', 966 'value' => $value[2], 967 'operator' => 'EQUAL', 968 ]; 969 break; 970 case 'cveNameVersion': 971 $value = explode(";", $value); 972 $_SESSION['OCS']['multi_search'] = array(); 973 $_SESSION['OCS']['multi_search']['software']['allsoft'] = [ 974 'fields' => 'NAME_ID', 975 'value' => $value[0], 976 'operator' => 'EQUAL', 977 ]; 978 $_SESSION['OCS']['multi_search']['software']['allsoftversion'] = [ 979 'fields' => 'VERSION_ID', 980 'value' => $value[1], 981 'operator' => 'EQUAL', 982 ]; 983 break; 984 case 'cveName': 985 $_SESSION['OCS']['multi_search'] = array(); 986 $_SESSION['OCS']['multi_search']['software']['allsoft'] = [ 987 'fields' => 'NAME_ID', 988 'value' => $value, 989 'operator' => 'EQUAL', 990 ]; 991 break; 992 993 case 'ipdiscover1': 994 $_SESSION['OCS']['multi_search'] = array(); 995 if(!isset($_SESSION['OCS']['multi_search']['networks']['ipdiscover1'])){ 996 if(strpos($value, ";") !== false) { 997 $explode = explode(";", $value); 998 $value = $explode[0]; 999 if(count($explode) == 2) { 1000 $tag = $explode[1]; 1001 } else { 1002 $tag = null; 1003 } 1004 } 1005 $_SESSION['OCS']['multi_search']['networks']['ipdiscover1'] = [ 1006 'fields' => 'IPSUBNET', 1007 'value' => $value, 1008 'operator' => 'EQUAL', 1009 ]; 1010 $_SESSION['OCS']['multi_search']['devices']['ipdiscover1'] = [ 1011 'fields' => 'NAME', 1012 'value' => 'IPDISCOVER', 1013 'operator' => 'EQUAL', 1014 ]; 1015 $_SESSION['OCS']['multi_search']['devices']['ipdiscover2'] = [ 1016 'fields' => 'IVALUE', 1017 'value' => '1', 1018 'operator' => 'EQUAL', 1019 ]; 1020 $_SESSION['OCS']['multi_search']['devices']['ipdiscover3'] = [ 1021 'fields' => 'IVALUE', 1022 'value' => '2', 1023 'operator' => 'EQUAL', 1024 'comparator' => 'OR', 1025 ]; 1026 $_SESSION['OCS']['multi_search']['devices']['ipdiscover4'] = [ 1027 'fields' => 'TVALUE', 1028 'value' => $value, 1029 'operator' => 'EQUAL', 1030 ]; 1031 if($tag != null && $tag != "") { 1032 $_SESSION['OCS']['multi_search']['accountinfo']['ipdiscover5'] = [ 1033 'fields' => 'TAG', 1034 'value' => $tag, 1035 'operator' => 'EQUAL', 1036 ]; 1037 } 1038 } 1039 break; 1040 1041 case 'stat': 1042 { 1043 $_SESSION['OCS']['multi_search'] = array(); 1044 $_SESSION['OCS']['multi_search']['devices']['stat'] = [ 1045 'fields' => 'NAME', 1046 'value' => 'DOWNLOAD', 1047 'operator' => 'EQUAL', 1048 ]; 1049 1050 $i = 0; 1051 if(isset($option['idPackage'])) foreach($option['idPackage'] as $key =>$value){ 1052 if($i == 0){ 1053 $comparator = 'AND'; 1054 }else{ 1055 $comparator = 'OR'; 1056 } 1057 $_SESSION['OCS']['multi_search']['devices']['stat'.$key] = [ 1058 'fields' => 'IVALUE', 1059 'value' => $value, 1060 'operator' => 'EQUAL', 1061 'comparator' => $comparator 1062 ]; 1063 $i++; 1064 } 1065 1066 $comparator = 'AND'; 1067 1068 if($option['stat'] == 'WAITING') 1069 { 1070 $value_stat = ''; 1071 $operator_stat = 'ISNULL'; 1072 } 1073 else if($option['stat'] == 'ERRORS') 1074 { 1075 $value_stat = 'EXIT_CODE'; 1076 $operator_stat = 'LIKE'; 1077 1078 $_SESSION['OCS']['multi_search']['devices']['stattvalue2'] = [ 1079 'fields' => 'TVALUE', 1080 'value' => $value_stat, 1081 'operator' => $operator_stat, 1082 'comparator' => $comparator 1083 ]; 1084 1085 $value_stat = 'ERR'; 1086 $comparator = 'OR'; 1087 } 1088 else 1089 { 1090 $value_stat = $option['stat']; 1091 $operator_stat = 'EQUAL'; 1092 } 1093 1094 $_SESSION['OCS']['multi_search']['devices']['stattvalue'] = [ 1095 'fields' => 'TVALUE', 1096 'value' => $value_stat, 1097 'operator' => $operator_stat, 1098 'comparator' => $comparator 1099 ]; 1100 } 1101 break; 1102 1103 case 'saas': 1104 if(!array_key_exists('saas',$_SESSION['OCS']['multi_search']['saas'])){ 1105 $_SESSION['OCS']['multi_search'] = array(); 1106 $_SESSION['OCS']['multi_search']['saas']['saas'] = [ 1107 'fields' => 'ENTRY', 1108 'value' => $value, 1109 'operator' => 'EQUAL', 1110 ]; 1111 } 1112 break; 1113 1114 case 'querysave': 1115 $parameters = $this->query_save($value); 1116 1117 $_SESSION['OCS']['multi_search'] = array(); 1118 $_SESSION['OCS']['multi_search'] = $parameters; 1119 1120 break; 1121 1122 default : 1123 break; 1124 } 1125 } 1126 1127 public function query_save($id) { 1128 $sql = "SELECT PARAMETERS FROM save_query WHERE ID = %s"; 1129 $sql_arg = array($id); 1130 1131 $result = mysql2_query_secure($sql, $_SESSION['OCS']['readServer'], $sql_arg); 1132 1133 while($item = mysqli_fetch_array($result)){ 1134 $parameters = $item['PARAMETERS']; 1135 } 1136 1137 return unserialize($parameters); 1138 } 1139 1140 /** 1141 * [link_index description] 1142 * @param string $fields [description] 1143 * @param string $comp [description] 1144 * @param string $value [description] 1145 * @return [type] [description] 1146 */ 1147 public function link_index($fields, $comp = "", $value, $value2 = null){ 1148 $field = explode("-", $fields) ; 1149 1150 if($comp== 'small') { $operator = 'LESS'; } 1151 elseif($comp == 'tall') { $operator = 'MORE'; } 1152 elseif($comp == 'exact') { $operator = 'EQUAL'; } 1153 1154 if($fields == 'HARDWARE-LASTDATE' || $fields == 'HARDWARE-LASTCOME'){ 1155 $value = str_replace(substr($value, -5), '00:00', $value); 1156 } 1157 1158 if(empty($field[2])){ 1159 if(strpos($field[0], 'HARDWARE') !== false){ 1160 if(!isset($_SESSION['OCS']['multi_search']['hardware']) || !array_key_exists('HARDWARE-'.$field[1].$comp.preg_replace("/\s+/","", preg_replace("/_/","",$value)).preg_replace("/_/","",$value2),$_SESSION['OCS']['multi_search']['hardware'])){ 1161 $_SESSION['OCS']['multi_search'] = array(); 1162 $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field[1].$comp.preg_replace("/\s+/","", preg_replace("/_/","",$value)).preg_replace("/_/","",$value2)] = [ 1163 'fields' => $field[1], 1164 'value' => $value, 1165 'operator' => $operator, 1166 ]; 1167 if($value2 != null && $value2 != 'all') 1168 $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field[1].$comp.preg_replace("/_/","",$value2)] = [ 1169 'fields' => 'USERAGENT', 1170 'value' => $value2, 1171 'operator' => 'LIKE', 1172 ]; 1173 } 1174 }elseif(strpos($field[0], 'ACCOUNTINFO') !== false){ 1175 if(!isset($_SESSION['OCS']['multi_search']['accountinfo']) || !array_key_exists('ACCOUNTINFO-'.$field[1].$comp.$value,$_SESSION['OCS']['multi_search']['accountinfo'])){ 1176 $_SESSION['OCS']['multi_search'] = array(); 1177 $_SESSION['OCS']['multi_search']['accountinfo']['ACCOUNTINFO-'.$field[1].$comp.preg_replace("/_/","",$value)] = [ 1178 'fields' => $field[1], 1179 'value' => $value, 1180 'operator' => $operator, 1181 ]; 1182 } 1183 }elseif(strpos($field[0], 'NETWORKS') !== false){ 1184 if(!isset($_SESSION['OCS']['multi_search']['networks']) || !array_key_exists('NETWORKS-'.$field[1].$comp.$value,$_SESSION['OCS']['multi_search']['networks'])){ 1185 $_SESSION['OCS']['multi_search'] = array(); 1186 $_SESSION['OCS']['multi_search']['networks']['NETWORKS-'.$field[1].$comp.preg_replace("/_/","",$value)] = [ 1187 'fields' => $field[1], 1188 'value' => preg_replace("/[^A-Za-z0-9\.]/", "", $value), 1189 'operator' => $operator, 1190 ]; 1191 } 1192 }elseif(strpos($field[0], 'VIDEOS') !== false){ 1193 if(!isset($_SESSION['OCS']['multi_search']['videos']) || !array_key_exists('VIDEOS-'.$field[1].$comp.$value,$_SESSION['OCS']['multi_search']['videos'])){ 1194 $_SESSION['OCS']['multi_search'] = array(); 1195 $_SESSION['OCS']['multi_search']['videos']['VIDEOS-'.$field[1].$comp.preg_replace("/_/","",$value)] = [ 1196 'fields' => $field[1], 1197 'value' => $value, 1198 'operator' => $operator, 1199 ]; 1200 } 1201 }elseif(strpos($field[0], 'ASSETS') !== false){ 1202 if(!isset($_SESSION['OCS']['multi_search']['hardware']) || !array_key_exists('ASSETS'.$value,$_SESSION['OCS']['multi_search']['hardware'])){ 1203 $_SESSION['OCS']['multi_search'] = array(); 1204 $_SESSION['OCS']['multi_search']['hardware']['ASSETS'.preg_replace("/_/","",$value)] = [ 1205 'fields' => 'CATEGORY_ID', 1206 'value' => $value, 1207 'operator' => "BELONG", 1208 ]; 1209 } 1210 } 1211 }else{ 1212 $field_bis = explode(",", $field[1]) ; 1213 $comps = explode(",", $comp) ; 1214 $values = explode(",", $value) ; 1215 1216 if($comps[1] == 'small') { $operator1 = 'LESS'; } 1217 if($comps[0] == 'tall') { $operator2 = 'MORE'; } 1218 1219 if(!array_key_exists('HARDWARE-'.$field_bis[0].$comps[0].$values[0],$_SESSION['OCS']['multi_search']['hardware'])){ 1220 $_SESSION['OCS']['multi_search'] = array(); 1221 $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field_bis[0].$comps[0].preg_replace("/_/","",$values[0])] = [ 1222 'fields' => $field_bis[0], 1223 'value' => $values[0], 1224 'operator' => $operator2, 1225 ]; 1226 1227 $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field_bis[0].$comp[1].preg_replace("/_/","",$values[1])] = [ 1228 'fields' => $field_bis[0], 1229 'value' => $values[1], 1230 'operator' => $operator1, 1231 ]; 1232 } 1233 } 1234 } 1235 1236 /** 1237 * Get all assets category 1238 */ 1239 public function asset_categories(){ 1240 $sqlAsset = "SELECT CATEGORY_NAME, ID FROM assets_categories"; 1241 $result = mysqli_query($_SESSION['OCS']["readServer"], $sqlAsset); 1242 1243 while($asset_row = mysqli_fetch_array($result)){ 1244 $asset[$asset_row['ID']] = $asset_row['CATEGORY_NAME']; 1245 } 1246 return $asset; 1247 } 1248 1249 /** 1250 * Doesn't contain traitment 1251 */ 1252 public function contain($value, $tableName){ 1253 if($tableName != DatabaseSearch::COMPUTER_DEF_TABLE){ 1254 $field = "HARDWARE_ID"; 1255 }else{ 1256 $field = "ID"; 1257 } 1258 $sql_search = "SELECT DISTINCT %s FROM %s WHERE %s LIKE '%s'"; 1259 $sql_search_arg = array($field, $tableName, $value['fields'], "%".$value['value']."%"); 1260 $result = mysql2_query_secure($sql_search, $_SESSION['OCS']["readServer"], $sql_search_arg); 1261 1262 while($notcontain = mysqli_fetch_array($result)){ 1263 $excluID[] = $notcontain[$field]; 1264 } 1265 1266 if($excluID[0] == null){ 1267 $excluID[0] = 0; 1268 } 1269 1270 return $excluID; 1271 } 1272 1273 /** 1274 * Doesn't contain traitment if multi search 1275 */ 1276 public function containmulti($name, $value){ 1277 $excluID = null; 1278 $allID = null; 1279 foreach ($name as $table => $field){ 1280 $tablename = $table; 1281 $column = $field; 1282 } 1283 1284 if($tablename != DatabaseSearch::COMPUTER_DEF_TABLE){ 1285 $fieldname = "HARDWARE_ID"; 1286 }else{ 1287 $fieldname = "ID"; 1288 } 1289 1290 foreach ($value as $uniqID => $values){ 1291 if ($values['fields'] == $field && $values['operator'] == "DOESNTCONTAIN"){ 1292 $search[] = $values['value']; 1293 if($values['comparator'] != null){ 1294 $comparator[] = $values['comparator']; 1295 } 1296 } 1297 } 1298 1299 for($i = 0; $i != count($comparator)+1; $i++){ 1300 1301 $sql = "SELECT DISTINCT %s FROM %s WHERE %s LIKE '%s'"; 1302 $sql_arg = array($fieldname, $tablename, $column, "%".$search[$i]."%"); 1303 1304 $result = mysql2_query_secure($sql, $_SESSION['OCS']["readServer"], $sql_arg); 1305 1306 while($notcontain = mysqli_fetch_array($result)){ 1307 $excluID[$notcontain[$fieldname]] = $notcontain[$fieldname]; 1308 $allID[$search[$i]][$notcontain[$fieldname]] = $notcontain[$fieldname]; 1309 } 1310 } 1311 1312 for($i = 0; $i != count($comparator)+1; $i++){ 1313 foreach($excluID as $key => $values){ 1314 foreach($allID as $searching => $compare){ 1315 if(!array_key_exists($values, $compare) && $comparator[$i] == "AND"){ 1316 unset($excluID[$key]); 1317 } 1318 } 1319 } 1320 } 1321 1322 if($excluID == null){ 1323 $excluID[0] = 0; 1324 } 1325 1326 return $excluID; 1327 } 1328 } 1329