Bonjour à tous,
J'utilise des requêtes paramétrées en Mysqli. J'en ai un peu marre de mettre de '&' partout et je tente de réduire au maximum leur besoin.
J'ai un objet PHP que je compte utiliser comme ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$resultat = Request::createSelect()->from('nomtable')->where('nomcolonne', Request::OPE_EGAL, $valeur, 'i')->get();
Dans mon objet j'ai en résumé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Request {
	const OPE_EQUAL = '=';
	public $conditions = array();
 
	public function DbRequest(){
	}
 
	public static function createSelect() {
		return new DbRequest();
	}
 
	public function where($columnName, $operator, $value, $valueType) {
		$this->conditions[] = array('name' => $columnName, 'ope' => $operator, 'value' => $value, 'type' => $valueType);
		return $this;
	}
 
	public function whereArray(array $all) {
		$this->conditions = $all;
		return $this;
	}
 
	public function get(){
		$result=null;
		$params = $this->getParams();
		$q = Db::select($sql, $result, $params); 
		return $result;
	}
 
	private function getParams() {
		// Mysqli a besoin d'un tableau de type [0=>'concaténation des types', 1=>'valeur1', ...]
		$p = array(0 => '');
		foreach ($this->conditions as $f) {
			$p[0] .= $f['type'];
			$p[] = &$f['value']; // JE VEUX GARDER LE PASSAGE PAR REFERENCE SEULEMENT ICI
		}	
		return $p;
	}
}
 
class Db {
	public static function select($sql, &$result, array &$params) {
		$q = self::query($sql, $params, $result);
		// et d'autres trucs
	}
 
	public static function query($query, array &$params, &$result){
		$stmt = self::$cnx->prepare($query);
		call_user_func_array(array($stmt, 'bind_param'), $params);
		$stmt->execute();
		// et d'autres trucs
	}
}
Au niveau de la requête Mysqli Db::query() j'ai des erreurs Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given
Request est un vrai objet instancié, j'y ajoute des valeurs dans des tableaux. Quand je crée mon tableau $params il FAUT des références, donc je fais référence aux valeurs de mon objet instancié Request.
Pourquoi alors est-ce que j'ai un problème de référence ?
Pour éviter ces erreurs il faut que je remonte d'objet en objet jusqu'à la création de la valeur originale, ce qui me fait gérer des '&' partout dans mon code ! Et si par malheur je passe par des fonctions aux héritages un peu alambiqués le tableau perd la référence et garde seulement la valeur !
Comment faire pour qu'il me suffise de donner toutes les valeurs à un objet Request sans passer par référence et faire référence uniquement en dernier ressort aux valeurs de CET objet LA (ligne 34 ci-dessus) ?

Merci beaucoup pour votre aide !