| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | 
							- <?php
 
- require_once(__DIR__.SLASH.'..'.SLASH.'WidgetElement.class.php');
 
- class Query extends WidgetElement{
 
- 	public $id,$connection,$sql;
 
- 	public $TABLE_NAME = 'statistic_query';
 
- 	public $javascript = 'function(){stats_element_init("query");}';
 
- 	public $icon = 'fas fa-database';
 
- 	public $typeLabel = 'Requête';
 
- 	function __construct(){
 
- 		parent::__construct();
 
- 		$this->fields['connection'] = 'int';
 
- 		$this->fields['sql'] = 'longstring';
 
- 		$this->fieldMapping = $this->field_mapping($this->fields);
 
- 	}
 
- 	function editor(){
 
- 		$html = '<label><i class="fas fa-database"></i> Base de données : </label><select id="connection" class="form-control-sm" onchange="stats_save_widget_connection()">';
 
- 		require_once (__DIR__.SLASH.'..'.SLASH.'Connection.class.php');
 
- 		foreach(Connection::loadAll() as $connection):
 
- 			$html .= '<option value="'.$connection->id.'" '.($this->connection==$connection->id ?'selected="selected"':'' ).' >'.$connection->label.'</option>';
 
- 		endforeach;
 
- 		$html .= '</select>
 
- 				<small><a id="database-add" target="_blank" href="setting.php?section=statistic"> Ajouter une base</a></small>
 
- 				<div id="server-status" class="d-inline-block float-right"></div>
 
- 				<div class="clear"></div>
 
- 				<hr>
 
- 				<div class="row workspace">
 
- 					<div class="col-md-7 query-area">
 
- 						<label>Requete SQL</label> <small class="text-muted"> - utilisez [[attribut]] pour acceder à une donnée ou {{attribut}} pour acceder à un filtre</small>
 
- 						<div class="prev-custom-query float-right btn btn-small mb-2" onclick="stats_element_preview(this);"><i class="fas fa-play-circle"></i> Exécuter</div>
 
- 						<div class="clear"></div>
 
- 						<textarea id="query">'.$this->sql.'</textarea>
 
- 					</div>
 
- 					<div class="col-md-5 tools-area">
 
- 						<ul class="nav nav-tabs" noPrint role="tablist">
 
- 							<li class="nav-item"><a data-toggle="tab" class="nav-link active" href="#tab-results" aria-controls="tab-results" aria-selected="false">Résultats</a></li>
 
- 							<li class="nav-item stats-table-tab"><a data-toggle="tab" class="nav-link" href="#tab-tables" aria-controls="tab-tables" aria-selected="true">Tables</a></li>
 
- 						</ul>
 
- 						<div class="tab-content">
 
- 							<div class="tab-pane fade show active in active show" id="tab-results" role="tabpanel" aria-labelledby="tab-results">
 
- 								<div id="editorOutput"></div>
 
- 							</div>
 
- 							<div class="tab-pane fade" id="tab-tables" role="tabpanel" aria-labelledby="tab-tables">
 
- 								<div id="stats-query-tables">
 
- 									<label class="text-muted">Recherche</label> <input type="text" class="form-control-sm" onkeyup="stats_element_query_table_filter(this)">
 
- 									<ul class="stats-widget-element">
 
- 										<li data-table="{{table}}" class="table-tree hidden" onclick="stats_query_add_table(this)"><span>{{table}}</span>
 
- 											<div class="right" title="Voir les colonnes" onclick="stats_search_query_columns(this,event)"><i class="fas fa-columns"></i></div>
 
- 											<div class="clear"></div>
 
- 											<ul class="hidden"></ul>
 
- 										</li>
 
- 									</ul>
 
- 								</div>
 
- 							</div>
 
- 						</div>
 
- 					</div>
 
- 				</div>';
 
- 		return $html;
 
- 	}
 
- 	function preview($data = array(),$filters = array()){
 
- 		$response = array('data'=>array());
 
- 		require_once (__DIR__.SLASH.'..'.SLASH.'Connection.class.php');
 
- 		if(isset($this->connection) && $this->connection!=false) {
 
- 			$connection = Connection::getById($this->connection);
 
- 			if($connection!=false && !empty($connection->handler) ){
 
- 				try{
 
- 					$pdo = $connection->getPdo();
 
- 					if(!isset($pdo)) throw new Exception("Connexion à la base impossible");
 
- 					$query = self::template($this->sql,$filters,true);
 
- 					$query = preg_replace('/\[\[([^\]]*)\]\]/iU','{{$1}}', $query);
 
- 					$query = self::template($query,$data,true);
 
- 					$query = html_entity_decode($query,ENT_QUOTES);
 
- 					$response['meta'] = array('Requete finale' => $query);
 
- 					$results = $pdo->prepare($query);
 
-            			$results->execute(array());
 
- 					foreach ($results->fetchAll(PDO::FETCH_ASSOC) as $element){
 
- 						foreach($element as $index => $row){
 
- 							if($connection->handler == 'Oracle'){
 
- 								$element[$index] =iconv("Windows-1254", "UTF-8", html_entity_decode($row, ENT_QUOTES, 'UTF-8'));
 
- 							}else{
 
- 								$element[$index] =html_entity_decode($row, ENT_QUOTES, 'UTF-8');
 
- 							}
 
- 						}
 
- 						$response['data'][] = $element;
 
- 					}
 
- 				} catch(Exception $e) {
 
- 					$error = utf8_encode($e->getMessage());
 
- 					if(isset($pdo)) $error .= json_encode($pdo->errorInfo());
 
- 					if(isset($query)) $error .= '<hr/>'.$query;
 
- 					$error = str_replace(
 
- 						array('Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ','SQLSTATE[42000]'),
 
- 						array(' ...','Mauvaise Syntaxe'),$error);
 
- 					throw new Exception("SQL ".PHP_EOL.$error);
 
- 				}
 
- 			}
 
- 		}
 
- 		return $response;
 
- 	}
 
- }
 
- ?>
 
 
  |