Хорошая альтернатива eregi () в PHP

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        
    };

Обновление

Страница просмотра администратора должна иметь только первый вход в систему и последний выход для определенного электронного письма на текущую дату.

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 разных адреса электронной почты. Если они обращались к моему заявлению, там регистрировалось время входа и выхода из системы.

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

В представлении администратора у меня должно быть это

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
    };

Это код Работа? Если нет - что именно происходит?

12
задан NikiC 2 June 2012 в 17:41
поделиться

6 ответов

stristr достигает точно такого же результата, что и eregi (по крайней мере, когда вы не используете регулярные выражения):

if (!stristr($fileName, '.php'))
    $filename.='.php';

Вы также можете сделать «поддельные» eregi следующим образом:

if (!function_exists('eregi')) {
    function eregi($find, $str) {
        return stristr($str, $find);
    }
}

Обновление : обратите внимание, что stristr не принимает регулярные выражения, как eregi , и для В этом конкретном случае (проверяя расширение) лучше использовать решение vartec.

24
ответ дан 2 December 2019 в 03:00
поделиться

Я обычно создаю и заканчиваю функцией; или другие простые функции для работы со строками для такого рода вещей.

function endsWith($string, $end){
    return substr($string, -strlen($end)) == $end;
}
1
ответ дан 2 December 2019 в 03:00
поделиться

Если вы выбираете «поддельный» eregi, вы должны вызвать уведомление внутри функции поддельного: trigger_error ('Некоторый код все еще использует eregi', E_USER_NOTICE); Таким образом, вы легко поймаете забытые вызовы eregi и сможете заменить их.

2
ответ дан 2 December 2019 в 03:00
поделиться

Возможно, вам следует рассмотреть возможность рефакторинга вашего кода, чтобы сделать это вместо этого:

if (substr($fileName, -4, 4) !== '.php')
    $fileName .= '.php';

Как указано в других ответах на этот вопрос, eregi ('. Php') будет Ищите что-нибудь, за которым следует 'php' ВСЕГДА в файле (не только в конце).

2
ответ дан 2 December 2019 в 03:00
поделиться

НЕ

Просто не надо.

Неважно, что вы делаете, вы можете • запретить пользователям полный доступ ко всем данным на вашем сайте. Любой код Javascript, который вы кодируете, можно сделать спорным, просто отключив Javascript в браузере (или используя плагин, такой как NoScript). Кроме того, нет никакого способа отключить возможность любого пользователя просто «просматривать источник» или «просматривать информацию о странице» (или использовать wget) для вашего сайта.

Это не стоит усилий. Это на самом деле не сработает. Это сделает ваш сайт активно враждебным к пользователям. Они заметят это и прекратят посещать. Там нет никакой выгоды делать это, только впустую усилия и потерянное движение

не

Обновление:.. Похоже, эта небольшая тема оказалась весьма спорной в течение долгого времени. Тем не менее, я поддерживаю этот ответ на этот вопрос. Иногда правильный ответ - совет, а не буквальный ответ. В регулярном выражении "." означает любой символ, поэтому eregi ('. php', $ fileName) означает имя файла с любым символом, за которым следует 'php'. Так, например, «blabla2PHP.txt» будет соответствовать вашему регулярному выражению.

Теперь, что вы хотите сделать, это:

$file_ext = pathinfo($filename, PATHINFO_EXTENSION);
if(strtolower($file_ext) != 'php') 
   $filename .= '.php';
19
ответ дан 2 December 2019 в 03:00
поделиться

Попробуйте это, я использую это довольно часто, так как недавно обновился до PHP 5.

Ранее:

if(eregi('-', $_GET['id'])
{
   return true;
}

Сейчас пользуюсь этим - работает ничуть не хуже.

if(preg_match('/(.+)-(.+)/', $_GET['id'])) {
{
   return true;
}

Просто замените свой код следующим, и у вас не должно быть никаких различий в вашем коде. Если вам интересно, почему PHP удаляет eregi (), это из-за проблем с производительностью, которые он имеет при частом использовании, поэтому лучше использовать preg_match (), поскольку он более конкретен при поиске, поэтому он имеет лучшую производительность и время рендеринга.

Сообщите мне, как это работает для вас.

4
ответ дан 2 December 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: