/** * find: * Locates records in this table meeting the criteria supplied in the * first argument (an associative array of column names and their expected values). */ static function find($criteria = array(), $sort = false, $limitStart = false, $limitEnd = false, $cacheSingleRowOnLoad = false) { $q = "SELECT * FROM `" . static::$_tableName . "`"; $whereBits = array(); foreach ($criteria as $column => $value) { $operand = '='; if (preg_match('/^(.+):(.+)$/', $column, $bits)) { $column = addslashes($bits[1]); $operandWord = $bits[2]; switch ($operandWord) { case 'ne': $operand = '!='; break; case 'gt': $operand = '>'; break; case 'gte': $operand = '>='; break; case 'lt': $operand = '<'; break; case 'lte': $operand = '<='; break; case 'like': $operand = 'LIKE'; break; } } $value = addslashes($value); $whereBits[] = "`{$column}` {$operand} '{$value}'"; } if (!empty($whereBits)) { $q .= " WHERE " . implode(' AND ', $whereBits); } if ($sort && !is_array($sort)) { $sort = array($sort); } if ($sort) { $sortBits = array(); foreach ($sort as $field) { if (preg_match('/^(.*):(.*)$/', $field, $bits)) { $order = strtoupper($bits[2]); if ($order != 'DESC' && $order != 'ASC') { $order = ''; } $field = "`{$bits[1]}` {$order}"; } else { $field = "`{$field}`"; } $sortBits[] = $field; } $q .= ' ORDER BY ' . implode(', ', $sortBits); } if ($limitStart !== false && is_numeric($limitStart)) { $q .= " LIMIT {$limitStart}"; if ($limitEnd !== false && is_numeric($limitEnd) && $limitEnd > 0) { $q .= ", {$limitEnd}"; } } $set = Database::query($q); if (!$set) { return false; } $className = get_called_class(); $results = array(); $lastRow = false; while ($row = Database::fetchMap($set)) { $results[] = new $className($row); $lastRow = $row; } if (count($results) == 0) { $results = false; } elseif (count($results) == 1) { $results = $results[0]; if ($cacheSingleRowOnLoad && !empty(static::$_cachePrefix)) { Cache::set(static::$_cachePrefix . $results->getId(), $lastRow); } } return $results; }