Merge pull request #3438 from annando/1705-dba-select
New function "dba::select" to fetch table rows
This commit is contained in:
commit
b3faf3867d
1 changed files with 85 additions and 5 deletions
|
@ -498,18 +498,28 @@ class dba {
|
|||
unset($args[0]);
|
||||
|
||||
// When the second function parameter is an array then use this as the parameter array
|
||||
if ((count($args) == 1) AND (is_array($args[1]))) {
|
||||
if ((count($args) > 0) AND (is_array($args[1]))) {
|
||||
$params = $args[1];
|
||||
} else {
|
||||
$params = $args;
|
||||
}
|
||||
|
||||
// Renumber the array keys to be sure that they fit
|
||||
$i = 0;
|
||||
$args = array();
|
||||
foreach ($params AS $param) {
|
||||
$args[++$i] = $param;
|
||||
}
|
||||
}
|
||||
|
||||
if (!self::$dbo OR !self::$dbo->connected) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (substr_count($sql, '?') != count($args)) {
|
||||
// Question: Should we continue or stop the query here?
|
||||
logger('Parameter mismatch. Query "'.$sql.'" - Parameters '.print_r($args, true), LOGGER_DEBUG);
|
||||
}
|
||||
|
||||
$sql = self::$dbo->any_value_fallback($sql);
|
||||
|
||||
if (x($a->config,'system') && x($a->config['system'], 'db_callstack')) {
|
||||
|
@ -1006,6 +1016,76 @@ class dba {
|
|||
return self::e($sql, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Select rows from a table
|
||||
*
|
||||
* @param string $table Table name
|
||||
* @param array $fields array of selected fields
|
||||
* @param array $condition array of fields for condition
|
||||
* @param array $params array of several parameters
|
||||
*
|
||||
* @return boolean|object If "limit" is equal "1" only a single row is returned, else a query object is returned
|
||||
*
|
||||
* Example:
|
||||
* $table = "item";
|
||||
* $fields = array("id", "uri", "uid", "network");
|
||||
* $condition = array("uid" => 1, "network" => 'dspr');
|
||||
* $params = array("order" => array("id", "received" => true), "limit" => 1);
|
||||
*
|
||||
* $data = dba::select($table, $fields, $condition, $params);
|
||||
*/
|
||||
static public function select($table, $fields = array(), $condition = array(), $params = array()) {
|
||||
if ($table == '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (count($fields) > 0) {
|
||||
$select_fields = "`".implode("`, `", array_values($fields))."`";
|
||||
} else {
|
||||
$select_fields = "*";
|
||||
}
|
||||
|
||||
if (count($condition) > 0) {
|
||||
$condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?";
|
||||
} else {
|
||||
$condition_string = "";
|
||||
}
|
||||
|
||||
$param_string = '';
|
||||
$single_row = false;
|
||||
|
||||
if (isset($params['order'])) {
|
||||
$param_string .= " ORDER BY ";
|
||||
foreach ($params['order'] AS $fields => $order) {
|
||||
if (!is_int($fields)) {
|
||||
$param_string .= "`".$fields."` ".($order ? "DESC" : "ASC").", ";
|
||||
} else {
|
||||
$param_string .= "`".$order."`, ";
|
||||
}
|
||||
}
|
||||
$param_string = substr($param_string, 0, -2);
|
||||
}
|
||||
|
||||
if (isset($params['limit'])) {
|
||||
if (is_int($params['limit'])) {
|
||||
$param_string .= " LIMIT ".$params['limit'];
|
||||
$single_row =($params['limit'] == 1);
|
||||
}
|
||||
}
|
||||
|
||||
$sql = "SELECT ".$select_fields." FROM `".$table."`".$condition_string.$param_string;
|
||||
|
||||
$result = self::p($sql, $condition);
|
||||
|
||||
if (is_bool($result) OR !$single_row) {
|
||||
return $result;
|
||||
} else {
|
||||
$row = self::fetch($result);
|
||||
self::close($result);
|
||||
return $row;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Closes the current statement
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue