Intereting Posts
Разница между композитором предпочитает-dist и предпочитают-источник? Количество Не настраивается Как я могу сократить этот оператор PHP if? PHP – преобразование специальных символов в объекты HTML Драйвер CodeIgniter PDO использует запрос вместо подготовки? Разве это не менее безопасно? php проверяет, содержит ли массив только значения элемента другого массива GMail fsockopen (): Ошибка SSL-операции с ошибкой Codeigniter и XAMPP получение json_encode для исключения элементов html Почему PDO_MySQL не возвращает целое число? Сравнение массивов PHP с использованием ссылок на память Тестирование страницы с помощью маршрутизации AngularJS Что может вызвать прерывистый SQLSTATE Нет таких ошибок файла или каталога из php PDO mysql в Debian Lenny? Как отобразить два массива в одном цикле foreach? WooCommerce: добавьте пользовательскую ссылку Metabox на страницу администрирования Как динамически задавать ключи массива в php

mysqli_prepare против PDO

ЗАДНИЙ ПЛАН

Я пытаюсь написать запрос функции

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: Надеюсь, вы не храните пароли в открытом виде .