76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\m\base;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\m\IConn;
 | |
| use nur\m\IQueryLogger;
 | |
| 
 | |
| /**
 | |
|  * Class AbstractConn
 | |
|  */
 | |
| abstract class AbstractConn implements IConn {
 | |
|   static function fix_sql_with_seq_bindings(string &$sql, ?array $bindings): void {
 | |
|     if ($bindings !== null) {
 | |
|       # si une des valeurs est un tableau séquentiel, il faut binder sur chaque
 | |
|       # valeur du tableau. ici, on corrige la requête
 | |
|       foreach ($bindings as $name => $values) {
 | |
|         if (A::is_seq($values)) {
 | |
|           $count = count($values);
 | |
|           $names = [];
 | |
|           for ($i = 0; $i < $count; $i++) {
 | |
|             $names[] = ":${name}_${i}";
 | |
|           }
 | |
|           $names = implode(", ", $names);
 | |
|           $sql = str_replace(":$name", "($names)", $sql);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /** @var IQueryLogger */
 | |
|   protected $queryLogger;
 | |
| 
 | |
|   /**
 | |
|    * spécifier une instance de IQueryLogger permettant le suivi des requêtes
 | |
|    * exécutées par cet objet.
 | |
|    *
 | |
|    * retourner l'instance spécifiée.
 | |
|    */
 | |
|   function setQueryLogger(IQueryLogger $queryLogger): IQueryLogger {
 | |
|     $this->queryLogger = $queryLogger;
 | |
|     return $queryLogger;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * supprimer l'instance de IQueryLogger configurée avec {@link setQueryLogger()}.
 | |
|    * retourner l'instance qui a été supprimée, ou null s'il n'y en avait pas.
 | |
|    *
 | |
|    * @return IQueryLogger
 | |
|    */
 | |
|   function resetQueryLogger(): ?IQueryLogger {
 | |
|     $query_logger = $this->queryLogger;
 | |
|     $this->queryLogger = null;
 | |
|     return $query_logger;
 | |
|   }
 | |
| 
 | |
|   function all(string $sql, ?array $filter=null): array {
 | |
|     return $this->query()->select($sql, $filter)->all();
 | |
|   }
 | |
| 
 | |
|   function allVals(?string $name, string $sql, ?array $filter=null): array {
 | |
|     return rows::vals($this->all($sql, $filter), $name);
 | |
|   }
 | |
| 
 | |
|   function first(string $sql, ?array $filter=null): ?array {
 | |
|     return $this->query()->select($sql, $filter)->first();
 | |
|   }
 | |
| 
 | |
|   function firstVal(?string $name, string $sql, ?array $filter=null, $default=null) {
 | |
|     return rows::val($this->first($sql, $filter), $name, $default);
 | |
|   }
 | |
| 
 | |
|   function update(string $sql, ?array $filter=null): int {
 | |
|     return $this->query()->update($sql, $filter)->execute(true)->numRows();
 | |
|   }
 | |
| }
 |