Я пытаюсь запустить два оператора на основе фильтра электронной почты, когда нажимаю кнопку - PullRequest
2 голосов
/ 06 июня 2019

Это ошибка, которую я получаю

SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с anish123@gmail.com.Электронная почта GROUP BY, дата 'в строке 2 (SQL: ВЫБЕРИТЕ электронную почту, дату, мин. (Время) AS проверено, макс. (Время) AS проверено, ((TIME_TO_SEC (TIMEDIFF (макс. (Время), мин. (Время)))) / 60) / 60) разница↵ ИЗ профиля WHERE '. 1 = 1 и электронная почта, например' anish123@gmail.com '.' GROUP BY email, дата) "

Я пытаюсь отфильтровать данные на основепредоставленное письмо и по нажатию кнопки. Первый запрос работает нормально, но я получаю ошибку, когда пытаюсь использовать то же условие where во втором запросе.

$post = $request->all();
$email = $request->input('email');
$cond = ' 1=1 ';
if(!empty($post['email'])){
    $cond .= " and email like '".$post['email']."'";
}
$qry = 'SELECT User_id, email, status, date, time FROM profile WHERE '.$cond.' ';
$data = DB::select($qry);

$sql=" SELECT email, date, min(time) AS checkedin, max(time) AS checkedout,( (TIME_TO_SEC(TIMEDIFF(max(time), min(time))) / 60) / 60) difference
    FROM profile WHERE '.$cond.' GROUP BY email, date";
    $previousdata = DB::select($sql);

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Я отредактировал приведенный выше код справа.ошибка произошла из-за конкатенации строк

$sql="SELECT email, date, min(time) AS checkedin, max(time) AS checkedout,( (TIME_TO_SEC(TIMEDIFF(max(time), min(time))) / 60) / 60) difference
    FROM profile WHERE".$cond. "GROUP BY email, date";
1 голос
/ 06 июня 2019

Вы использовали неправильную конкатенацию строк для $sql:

$sql=" SELECT email, date, min(time) AS checkedin, max(time) AS checkedout,( (TIME_TO_SEC(TIMEDIFF(max(time), min(time))) / 60) / 60) difference
    FROM profile WHERE " . $cond . " GROUP BY email, date";

При использовании необработанного SQL ваш запрос будет уязвим для SQL-инъекций. Подробнее об этой проблеме .


Технически, вы могли бы использовать построитель запросов Laravels для обоих операторов.

$conditions = [];

if ($email) {
    $conditions[] = ['email', 'like', $email];
}

$profile = DB::table('profile')
    ->select('user_id', 'email', 'status', 'date', 'time')
    ->where($conditions)
    ->get();

$previousData = DB::table('profile')
    ->select('email', 'date', DB:raw('min(time) checkedin'), DB:raw('max(time) checkedout'), DB::raw('((TIME_TO_SEC(TIMEDIFF(max(time), min(time))) / 60) / 60) difference'))
    ->where($conditions)
    ->groupBy('email', 'date')
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...