Как создать правильный класс расширения mysqli с подготовленными операторами?

Я пробовал Интернет для хорошего примера, но ничего не могу найти.

Я пытаюсь расширить класс mysqli, чтобы создать вспомогательный класс, который абстрагирует некоторые сложности. Одна из основных вещей, которые я хочу выполнить, – это использовать подготовленные заявления.

Я не знаю, с чего начать, или как правильно обрабатывать ввод и вывод в одном классе. Другая проблема заключается в том, что я не могу выводить данные в виде массива при использовании подготовленных операторов.

Я мог бы использовать простой пример, чтобы указать мне в правильном направлении.

Благодаря!

Проверьте реализацию Zend_Db и, в частности, Zend_Db_Select . Фактически, вы можете просто использовать это вместо того, чтобы разрабатывать свои собственные. Примеры:

  //connect to a database using the mysqli adapter //for list of other supported adapters see //http://framework.zend.com/manual/en/zend.db.html#zend.db.adapter.adapter-notes $parameters = array( 'host' => 'xx.xxx.xxx.xxx', 'username' => 'test', 'password' => 'test', 'dbname' => 'test' ); try { $db = Zend_Db::factory('mysqli', $parameters); $db->getConnection(); } catch (Zend_Db_Adapter_Exception $e) { echo $e->getMessage(); die('Could not connect to database.'); } catch (Zend_Exception $e) { echo $e->getMessage(); die('Could not connect to database.'); } //a prepared statement $sql = 'SELECT * FROM blah WHERE id = ?'; $result = $db->fetchAll($sql, 2); //example using Zend_Db_Select $select = $db->select() ->from('blah') ->where('id = ?',5); print_r($select->__toString()); $result = $db->fetchAll($select); //inserting a record $row = array('name' => 'foo', 'created' => time() ); $db->insert('blah',$row); $lastInsertId = $db->lastInsertId(); //updating a row $data = array( 'name' => 'bar', 'updated' => time() ); $rowsAffected = $db->update('blah', $data, 'id = 2'); 

проверьте также Kohana Database Lib .. Это в значительной степени делает то, что вы хотите: http://docs.kohanaphp.com/libraries/database

Проверьте Zend Framework и это абсолютно модульный класс Zend_Db , особенно адаптер mysqli .

Предполагая, что вы на самом деле хотите написать свою собственную версию (в отличие от использования одной из существующих библиотек, которые предложили другие ответы – и это тоже хорошие варианты) …

Вот несколько функций, которые вы можете счесть полезными для изучения. Первый позволяет связать результаты запроса с ассоциативным массивом, а второй позволяет передать в два массива, один – упорядоченный массив ключей, а другой – ассоциативный массив данных для этих ключей и привязать эти данные к подготовленное заявление:

 function stmt_bind_assoc (&$stmt, &$out) { $data = mysqli_stmt_result_metadata($stmt); $fields = array(); $out = array(); $fields[0] = $stmt; $count = 1; while($field = mysqli_fetch_field($data)) { $fields[$count] = &$out[$field->name]; $count++; } call_user_func_array(mysqli_stmt_bind_result, $fields); } function stmt_bind_params($stmt, $fields, $data) { // Dynamically build up the arguments for bind_param $paramstr = ''; $params = array(); foreach($fields as $key) { if(is_float($data[$key])) $paramstr .= 'd'; elseif(is_int($data[$key])) $paramstr .= 'i'; else $paramstr .= 's'; $params[] = $data[$key]; } array_unshift($params, $stmt, $paramstr); // and then call bind_param with the proper arguments call_user_func_array('mysqli_stmt_bind_param', $params); } 

Я написал класс оболочки для этого – он предоставляет идентичный интерфейс для параметризованных запросов с MySQLi или PDO. Интерфейс позволяет выполнять параметризованный SQL в одной строке кода, что значительно упрощает ваш собственный код.

http://www.robpoyntz.com/blog/?p=191