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

Когда Вы обрабатываете различные состояния перечисления (C#):

enum AccountType
{
    Savings,
    Checking,
    MoneyMarket
}

Затем в некоторой стандартной программе...

switch (accountType)
{
    case AccountType.Checking:
        // do something

    case AccountType.Savings:
        // do something else

    case AccountType.MoneyMarket:
        // do some other thing

    default:
-->     Debug.Fail("Invalid account type.");
}

В какой-то момент я добавлю другой тип учетной записи к этому перечислению. И когда я делаю, я забуду фиксировать этот оператор переключения. Так Debug.Fail катастрофические отказы ужасно (в Режиме отладки) для привлечения моего внимания к этому факту. Когда я добавляю эти case AccountType.MyNewAccountType:, ужасные остановки катастрофического отказа..., пока я не добавляю еще один тип учетной записи и забываю обновлять случаи здесь.

(Да, полиморфизм, вероятно, лучше здесь, но это - просто пример первое, что пришло на ум.)

5
задан Mark Biek 5 September 2009 в 20:25
поделиться

5 ответов

Ознакомьтесь с реализацией 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');    
5
ответ дан 14 December 2019 в 19:20
поделиться

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

0
ответ дан 14 December 2019 в 19:20
поделиться

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

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

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);
}
0
ответ дан 14 December 2019 в 19:20
поделиться

Ознакомьтесь с Zend Framework и его абсолютно модульным классом Zend_Db , особенно с адаптером mysqli .

0
ответ дан 14 December 2019 в 19:20
поделиться

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

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

0
ответ дан 14 December 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: