string date = DateTime.Today.Date.ToShortDateString();
var grouped = from a in db.Logs.ToList()
where a.date == date
group a by a.email
into g
let ordered = g.OrderBy(x => x.date).ToList()
let firstLogin = ordered.First()
let lastLogin = ordered.Last()
select new
{
first_login_time = firstLogin.login_time,
first_login = firstLogin.login,
last_login_time = lastLogin.login_time,
last_login = lastLogin.login
};
Страница просмотра администратора должна иметь только первый вход в систему и последний выход для определенного электронного письма на текущую дату.
blockquote>string date = DateTime.Today.Date.ToShortDateString(); var grouped = from a in db.Logs.ToList() where a.login.Date == date group a by a.email into g let firstLogin = g.OrderBy(x => x.login).First() // order by login time and get first let lastLogout = g.OrderBy(x => x.logout).Last() // order by lotgout time and get last select new { email: g.Key, first_login = firstLogin.login, // first login last_logout = lastLogin.logout // last logout };
Я надеюсь, что ваши поля
login
иlogout
имеют типdatetime
. Вы все еще не поняли вопрос. Когда я просил вас получить схему таблицы, я предполагал, что вы меня за что-то наподобие:CREATE TABLE [dbo].[Logs]( [username] [nvarchar](4000) NOT NULL, [email] [nvarchar](4000) NOT NULL, [login] [datetime] NULL, [logout] [datetime] NULL )
Или, возможно, объявление класса
public class Log { public string email {get; set; } public string username {get; set; } public DateTime login {get; set; } public DateTime logout {get; set; } }
Вы можете научиться задавать вопросы
Обновление 2
Предположим, у меня 3 разных адреса электронной почты. Если они обращались к моему заявлению, там регистрировалось время входа и выхода из системы.
blockquote>Table[Login_details] id employee date login logout email 1 ShobaBTM 2019-03-18 16:12 16:12 shobabtm@gmail.com 2 neymarjr 2019-03-18 16:22 16:22 neymar@gmail.com 3 Cristiano 2019-03-18 16:23 16:23 cr7@gmail.com 4 neymarjr 2019-03-18 16:25 16:25 neymar@gmail.com 5 neymarjr 2019-03-18 16:30 16:32 neymar@gmail.com 6 neymarjr 2019-03-18 16:42 16:45 neymar@gmail.com
В представлении администратора у меня должно быть это
blockquote>1 ShobaBTM 2019-03-18 16:12 16:12 2 Cristiano 2019-03-18 16:23 16:23 3 neymarjr 2019-03-18 16:25 16:45
Хорошо, попробуйте это:
string date = DateTime.Today.Date.ToShortDateString(); var grouped = from a in db.Logs.ToList() where a.date == date group a by new { a.employee, a.date } into g let firstLogin = g.OrderBy(x => TimeSpan.ParseExact(x.login, "hh\\:mm")).First() // order by login time and get first let lastLogout = g.OrderBy(x => TimeSpan.ParseExact(x.logout, "hh\\:mm")).Last() // order by logout time and get last select new { employee = g.Key.employee, date = g.Key.date, first_login = firstLogin.login, // first login last_logout = lastLogin.logout // last logout };
Это код Работа? Если нет - что именно происходит?
stristr достигает точно такого же результата, что и eregi (по крайней мере, когда вы не используете регулярные выражения):
if (!stristr($fileName, '.php'))
$filename.='.php';
Вы также можете сделать «поддельные» eregi следующим образом:
if (!function_exists('eregi')) {
function eregi($find, $str) {
return stristr($str, $find);
}
}
Обновление : обратите внимание, что stristr
не принимает регулярные выражения, как eregi
, и для В этом конкретном случае (проверяя расширение) лучше использовать решение vartec.
Я обычно создаю и заканчиваю функцией; или другие простые функции для работы со строками для такого рода вещей.
function endsWith($string, $end){
return substr($string, -strlen($end)) == $end;
}
Если вы выбираете «поддельный» eregi, вы должны вызвать уведомление внутри функции поддельного: trigger_error ('Некоторый код все еще использует eregi', E_USER_NOTICE); Таким образом, вы легко поймаете забытые вызовы eregi и сможете заменить их.
Возможно, вам следует рассмотреть возможность рефакторинга вашего кода, чтобы сделать это вместо этого:
if (substr($fileName, -4, 4) !== '.php')
$fileName .= '.php';
Как указано в других ответах на этот вопрос, eregi ('. Php')
будет Ищите что-нибудь, за которым следует 'php' ВСЕГДА в файле (не только в конце).
НЕ
Просто не надо.
Неважно, что вы делаете, вы можете • запретить пользователям полный доступ ко всем данным на вашем сайте. Любой код Javascript, который вы кодируете, можно сделать спорным, просто отключив Javascript в браузере (или используя плагин, такой как NoScript). Кроме того, нет никакого способа отключить возможность любого пользователя просто «просматривать источник» или «просматривать информацию о странице» (или использовать wget) для вашего сайта.
Это не стоит усилий. Это на самом деле не сработает. Это сделает ваш сайт активно враждебным к пользователям. Они заметят это и прекратят посещать. Там нет никакой выгоды делать это, только впустую усилия и потерянное движение
не
Обновление:.. Похоже, эта небольшая тема оказалась весьма спорной в течение долгого времени. Тем не менее, я поддерживаю этот ответ на этот вопрос. Иногда правильный ответ - совет, а не буквальный ответ.
В регулярном выражении "." означает любой символ, поэтому eregi ('. php', $ fileName)
означает имя файла с любым символом, за которым следует 'php'. Так, например, «blabla2PHP.txt» будет соответствовать вашему регулярному выражению.
Теперь, что вы хотите сделать, это:
$file_ext = pathinfo($filename, PATHINFO_EXTENSION);
if(strtolower($file_ext) != 'php')
$filename .= '.php';
Попробуйте это, я использую это довольно часто, так как недавно обновился до PHP 5.
Ранее:
if(eregi('-', $_GET['id'])
{
return true;
}
Сейчас пользуюсь этим - работает ничуть не хуже.
if(preg_match('/(.+)-(.+)/', $_GET['id'])) {
{
return true;
}
Просто замените свой код следующим, и у вас не должно быть никаких различий в вашем коде. Если вам интересно, почему PHP удаляет eregi (), это из-за проблем с производительностью, которые он имеет при частом использовании, поэтому лучше использовать preg_match (), поскольку он более конкретен при поиске, поэтому он имеет лучшую производительность и время рендеринга.
Сообщите мне, как это работает для вас.