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
Dans mon objet j'ai en résumé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $resultat = Request::createSelect()->from('nomtable')->where('nomcolonne', Request::OPE_EGAL, $valeur, 'i')->get();
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
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 } }
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 !
Partager