function db_select($table, $fields, $sql_where, $order, $limit, $vars = array(), $optional = array()) { $fields = (array) $fields; $sql_where = (array) $sql_where; if (!is_array($limit)) { if ($limit != "") { $limit = array($limit); } else { $limit = array(); } } $rows = array(); if (!empty($optional["handler"])) { $handler = "lib_" . $optional["handler"]; $folder = $vars["folder"]; $vars = sys_remove_handler($vars); $rows = call_user_func(array($handler, "select"), $vars["folder"], $fields, $sql_where, $order, $limit, $vars, $vars["mfolder"]); if (count($rows) > 0 and in_array("id", $fields)) { foreach (array_keys($rows) as $key) { $rows[$key]["folder"] = $folder; $rows[$key]["id"] = $handler . ":" . $vars["mfolder"] . "/" . $rows[$key]["id"]; } } return $rows; } $groupby = ""; $where = ""; if (count($sql_where) > 0) { $where = str_replace("and 1=1", "", " where " . implode(" and ", $sql_where)); } if ($order != "") { $order = " order by " . $order; } if (!empty($optional["groupby"])) { $groupby = " group by " . $optional["groupby"]; } if (!empty($optional["custom_name"])) { $table = sql_translate(sql_concat($optional["custom_name"])); } $sql = "select " . implode(",", $fields) . " from " . $table . $where . sql_fieldname($order . $groupby, true); if (!empty($optional["default_sql"]) and $optional["default_sql"] != "no_select") { $sql = str_replace("@table@", $table, sql_translate($optional["default_sql"])); } if (is_array($vars) and count($vars) > 0) { foreach (array_keys($vars) as $key) { $sql = str_replace("@" . $key . "@", sys_correct_quote($vars[$key]), $sql); } } if (!empty($optional["sqlvarsnoquote"]) and count($optional["sqlvarsnoquote"]) > 0) { foreach ($optional["sqlvarsnoquote"] as $key => $val) { $sql = str_replace("@" . $key . "@", $val, $sql); } } $sql = str_replace("1=1 and ", "", $sql); if (count($limit) > 0) { $sql = sql_limit($sql, isset($limit[1]) ? $limit[0] : 0, isset($limit[1]) ? $limit[1] : $limit[0]); } if ($sql != "none") { $time_start = sys_get_microtime(); if (($rows = sql_fetch($sql)) === false) { $msg = sql_error(); if (DEBUG) { debug_sql("ERROR " . $sql, $msg); } sys_log_message_log("db-fail", $sql . " " . $msg, sys_backtrace()); return "error"; } $time = number_format(sys_get_microtime() - $time_start, 4); if ($time > DB_SLOW) { $slow_log = var_export(sql_explain($sql), true); sys_log_message_log("db-slow", sprintf("{t}%s secs{/t}", $time) . " " . $sql, sys_backtrace() . " " . $slow_log); } sys::$db_queries[] = array($sql, $time); if (in_array("pid", $fields) and count($rows) > 0) { $rows = modify::threadsort($rows); } } if (!empty($optional["default_sql"]) and $optional["default_sql"] != "no_select") { foreach ($rows as $key => $row) { if (!sys_select_where($row, $sql_where, $vars)) { unset($rows[$key]); } } return sys_select($rows, substr($order, 10), $limit, $fields); } if ($limit == array("1") and count($rows) > 1) { $rows = array(array("count" => count($rows))); } if (count($limit) > 0) { if (count($limit) == 2 and count($rows) > $limit[1]) { $rows = array_slice($rows, $limit[0], $limit[1]); } if (count($limit) == 1 and count($rows) > $limit[0]) { $rows = array_slice($rows, 0, $limit[0]); } } return $rows; }