EDIT: после того, как я прочитал все данные от других пользователей, я решил использовать то, что @chris предложило call_user_func_array () еще одну причину не использовать eval () медленнее, чем call_user_func_array () , но до сих пор никто не смог ее использовать мой путь, если вы найдете способ, отправьте его в ответ или комментарий :). Поэтому каждый может учиться на этом. Веселый XMAS для всех!
— EDIT END —
Хорошо мне нужно сделать динамический код:
Я получаю пользовательский ввод, например $ _POST ['a'], $ _POST ['b']; // Зависит от каждого запроса, сколько пользовательского ввода.
$sql = "SELECT 1, 2, 3 FROM x WHERE b = ? AND a = ? LIMIT 10"; // SQL STATEMENT $input = array($_POST['a'], $_POST['b']); $output = 3; // Number of variables need for 1, 2, 3 $data = readDB2($sql, $input, $output); var_dump($data);
этот вход, передается в mysqli-> подготовленные заявления
вызвать число переменных динамическим ($ input и $ output);
Я использовал функцию php eval (); Теперь мой вопрос может быть использован в моем коде?
Просто загляните в мою функцию readDB2, чтобы увидеть, как я использовал функцию eval () (она использовалась 3 раза).
public function readDB2($sql, $input, $output1) { $stmt = $this->mysqli->prepare($sql); if(!empty($input) && is_array($input)) { $sp = ""; $data = ""; $inputn = count($input) - 1; for($i = 0; $i <= $inputn; $i++) { if($i !== $inputn) { $data .= '$input[' . $i . "],"; } else { $data .= '$input[' . $i . "]"; } $sp .= "s"; } $bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');'; eval("return $bind"); } if (!$stmt) {throw new Exception($this->mysqli->error);} $stmt->execute(); if (!$stmt) {throw new Exception($this->mysqli->error);} $stmt->store_result(); $checker = $stmt->num_rows; if($checker !== 0) { if(!empty($output1)) { $out = ""; for($i = 1; $i <= $output1; $i++) { if($i !== $output1) { $out .= '$out' . $i . ","; } else { $out .= '$out' . $i; } } $res = '$stmt->bind_result(' . $out . ');'; eval("return $res"); $vars = "array(" . $out . ");"; while ($stmt->fetch()) { $results[] = eval("return $vars"); } } } else { $results = "NO RESULTS"; } $stmt->fetch(); $stmt->close(); $this->results = array('num_rows' => $checker, $results); return $this->results; }
Изменить для meagar
$bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');'; == $bind = '$stmt->bind_param('ss', $input[0], $input[1]);); OR and so on $bind = '$stmt->bind_param('sss', $input[0], $input[1], $input[2]););
EDIT для инкогнито:
$input = array($_POST['pwnd']); $data = readDB2($sql, $input, $output) { public function readDB2($sql, $input, $output) { ... $inputn = count($input) - 1; for($i = 0; $i <= $inputn; $i++) { if($i !== $inputn) { $data .= '$input[' . $i . "],"; } else { $data .= '$input[' . $i . "]"; } $sp .= "s"; } $bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');'; eval("return $bind"); ... }
в моем результате
$bind = '$stmt->bind_param(\''. $sp . '\',' . $data . ');';
получает
eval("return $bind");
получает
$stmt->bind_param('s', $input[0]);
не то, что вы сказали.