mysqli: Строгие стандарты: только переменные должны передаваться по ссылке

Я пытаюсь создать небольшой класс запросов SQL.

Вот мой класс, но я не понимаю, у меня эта ошибка: Строгие стандарты: только переменные должны передаваться по ссылке в строке 52

Строка 52:

if (!$stmt->bind_param($param[$i][0], mysqli_real_escape_string($this->mysqli, $param[$i][1]))) { 

Мой код (я начинаю):

 <?php class Sql{ private $db; private $user; private $pwd; private $url; private $param; private $mysqli; function __construct($db, $user, $pwd, $url){ $this->db = $db; $this->user = $user; $this->pwd = $pwd; $this->url = $url; } /** * mysqli::connection() * * @return */ public function connection() { try{ $this->mysqli = new mysqli($this->db, $this->user, $this->pwd, $this->url); }catch(Exception $e){ throw new Exception("Impossible de se connecter à la base " . $this->db); } } public function select($query, $param, $debug=false){ $this->connection(); $r = $this->InitialiseResult("select"); if (!($stmt = $this->mysqli->prepare($query))) { echo "Echec de la préparation : (" . $this->mysqli->errno . ") " . $this->mysqli->error; } //Param for($i=0;$i<sizeof($param);$i++){ if (!$stmt->bind_param($param[$i][0], mysqli_real_escape_string($this->mysqli, $param[$i][1]))) { echo "Echec lors du liage des paramètres : (" . $stmt->errno . ") " . $stmt->error; } } if (!$stmt->execute()) { echo "Echec lors de l'exécution : (" . $stmt->errno . ") " . $stmt->error; } if (!($res = $stmt->get_result())) { echo "Echec lors de la récupération du jeu de résultats : (" . $stmt->errno . ") " . $stmt->error; }else{ $r["state"] = true; $r["rows"] = $res->fetch_assoc(); $r["num_rows"] = $res->num_rows; if($debug) var_dump($r); } return $r; } /** * mysqli::InitialiseResult() * * @param mixed $p * @return */ public function InitialiseResult($p) { $r = array(); //on écrase $r["state"] = false; switch($p){ case "select": $r["rows"] = array(); $r["num_rows"] = 0; break; } return $r; } } ?> 

Я пытаюсь поместить $ param в свойство и использовать mysqli_real_escape_string (), но ошибка все еще существует.

Есть идеи?

Related of "mysqli: Строгие стандарты: только переменные должны передаваться по ссылке"

$stmt->bind_param() требует, чтобы все параметры передавались по ссылке, поэтому вы не можете напрямую передать возвращаемое значение функции (не присваивая его переменной сначала, то есть). Но, как уже упоминалось в комментариях, вам не нужно вообще избегать параметров, это одно из преимуществ использования подготовленных операторов.

mysqli_stmt::bind_param ожидает, что второй и любые следующие параметры будут переменной, поскольку она передается по ссылке , которая обозначается символом & перед параметром:

 bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] ) 

Внутренне PHP не сохраняет фактическое значение, а только ссылку на переменную, содержащую значение. И фактическое значение выбирается только при выполнении подготовленного оператора. Вот почему вы не можете привязывать значения, а только переменные.

Однако из-за этого можно сделать следующее:

 $stmt = $mysqli->prepare('INSERT INTO table (a, b) VALUES (?, ?)'); $stmt->bind_param(1, $a); $stmt->bind_param(2, $b); $pairs = array( array('a1', 'b1'), array('a2', 'b2'), array('a3', 'b3'), ); foreach ($pairs as $pair) { list($a, $b) = $pair; $stmt->execute(); } 

Оператор INSERT подготовлен, и его параметры связаны только один раз, но он выполняется с разными значениями параметров несколько раз. Изменение значений переменных не разрушает ссылку на переменные.


Однако, что касается вашей реальной проблемы, вам не нужно и не следует использовать mysqli_real_escape_string для параметров для подготовленных операторов вообще. Просто привяжите переменные, а MySQLi сделает все остальное.