Когда Вы обрабатываете различные состояния перечисления (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:
, ужасные остановки катастрофического отказа..., пока я не добавляю еще один тип учетной записи и забываю обновлять случаи здесь.
(Да, полиморфизм, вероятно, лучше здесь, но это - просто пример первое, что пришло на ум.)
Ознакомьтесь с реализацией 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 .. Она в значительной степени делает то, что вы хотите: http://docs.kohanaphp.com/libraries/database
Предполагая, что вы действительно хотите написать свою собственную версию (в отличие от использования одной из существующих библиотек, предложенных другими ответами - и это тоже хорошие варианты) ...
Вот пара функций, которые вам может быть полезно изучить. Первый позволяет вам привязать результаты запроса к ассоциативному массиву, а второй позволяет вам передавать два массива, один - упорядоченный массив ключей, а другой - ассоциативный массив данных для этих ключей, и связывать эти данные с подготовленный оператор:
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);
}
Ознакомьтесь с Zend Framework и его абсолютно модульным классом Zend_Db , особенно с адаптером mysqli .
Для этого я написал класс-оболочку - он предоставляет идентичный интерфейс для параметризованных запросов с MySQLi или PDO. Интерфейс позволяет вам выполнять параметризованный SQL в одной строке кода, что значительно упрощает ваш собственный код.