ЗАДНИЙ ПЛАН
Я пытаюсь написать запрос функции
query('type', 'parameters', 'bind_types')
который я могу вызвать, чтобы делать простые запросы. Все запросы mySQL находятся в функции
grab_sql()
Вся привязка имеет место в функции bind()
call_user_func_array
нуждается в ссылках на правильную работу, поэтому я написал ref_arr
для размещения.
Проблема в том, что я не получаю обратно результаты, которые мне нужны – они публикуются ниже по результатам. Я думаю, что проблема заключается в привязке повторов, как я догадываюсь с этой стороны.
ИССЛЕДОВАНИЕ
call_user_func_array
здесь call_user_func_array
здесь ВОПРОС : Как я могу изменить этот код, чтобы правильно получить правильные результаты?
КОД
function ref_arr(&$arr) { $refs = array(); foreach($arr as $key => $value) { $refs[$key] = &$arr[$key]; } return $refs;} public function bind($query, $input_param, $btypes) { $a="test_var1";$b="test_var2"; $output_arr=array($a,$b); $input_ref = $this->ref_arr($input_param); $output_ref = $this->ref_arr($output_arr); if($statement=mysqli_prepare(one::$db, $query)) { array_unshift($input_ref, $statement, $btypes); call_user_func_array("mysqli_stmt_bind_param", $input_ref); mysqli_stmt_execute($statement); array_unshift($output_ref, $statement); call_user_func_array("mysqli_stmt_bind_result", $output_ref); mysqli_stmt_fetch($statement); var_dump($output_ref); mysqli_stmt_close($statement); } } public function grab($type) { switch($type) { case "validate_user": $query="SELECT email,pass FROM cr WHERE email=? AND pass=?"; break; case "another_query_type": break; } return $query; } public function query($qtype, $arg_arr, $btypes) { return self::bind(self::grab_sql($qtype), $arg_arr, $btypes); } }
ПРЕЦЕДЕНТ
<?php require_once 'p0.php'; $db_ = new database(); $db_->query('validate_user',array('joe@gmail.com','Password'), 'ss'); ?>
РЕЗУЛЬТАТЫ
Результат значений, как представляется, (последние два значения) и NULL и & NULL.
array(3) { [0]=> object(mysqli_stmt)#2 (9) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(2) ["field_count"]=> int(2) ["errno"]=> int(0) ["error"]=> string(0) "" ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) } [1]=> &NULL [2]=> &NULL }
Да, запись обобщенного bind-this-array-in-a-query в Mysqli – это королевская PITA. В конце концов, я получил его на работу, когда я кодировал адаптер mysqli Zend Framework, но это заняло много работы. Вы можете взглянуть на код. Я вижу одно главное отличие, вот как я сделал ссылки:
$stmtParams = array(); foreach ($params as $k => &$value) { $stmtParams[$k] = &$value; } call_user_func_array( array($this->_stmt, 'bind_param'), // mysqli OO callback $stmtParams );
Это немного отличается от вашего. Интересно, что в вашем коде оператор ref &
binds более плотно, чем оператор index []
.
Примечание. Мне также пришлось использовать оператор ref как в foreach
и в задании. Я никогда не понимал, почему, но это был единственный способ, которым это могло бы работать. PHP refs довольно загадочны и трудно понять.
Это не может быть жизнеспособным предложением, если вы застряли в среде с включенным Mysqli, но не с PDO, но вам стоит подумать об использовании PDO. PDO заботится о многом для вас; вы можете просто передать массив значений в PDOStatement::execute()
для подготовленного запроса с параметрами. Для меня было гораздо проще использовать PDO для этого конкретного использования, чем mysqli.
$pdoStmt->execute( array('joe@gmail.com','Password') ); // it's that easy
PS: Надеюсь, вы не храните пароли в открытом виде .