Как запросить первые и последние даты - PullRequest
0 голосов
/ 24 апреля 2019

Я запрашиваю базу данных наблюдений за дикой природой, чтобы отобразить первое обнаружение Dingy_Skipper на основе строки запроса 'yr' AS Dingy_Skipper_FDate. Я также хотел бы отобразить последние / последние наблюдения из той же строки запроса 'yr' AS Dingy_Skipper_LDate

Полагаю, мне нужно использовать UNION, но я пробовал несколько раз и не могу заставить его работать. Я никогда не использовал UNION раньше, поэтому любая помощь приветствуется. Большое спасибо заранее!

Я пробовал следующий запрос, но он выдает ошибку в строке $ Dingy_Skipper1 = $ sp1-> query ($ Dingy_Skipper);.

<?php
// connect
$sp1 = dbConnect('read', 'pdo');
// prepare query
$theyear = $_GET['yr'];
$Dingy_Skipper = "
SELECT rDate AS Dingy_Skipper_FDate, Dingy_Skipper
FROM wbcrecords
WHERE YEAR(rDate) = '$theyear' AND Dingy_Skipper >='1' ORDER BY rDate ASC Limit 1
UNION
SELECT rDate AS Dingy_Skipper_LDate, Dingy_Skipper
FROM wbcrecords
WHERE YEAR(rDate) = '$theyear' AND Dingy_Skipper >='1' ORDER BY rDate DESC Limit 1";
// submit query capture result
$Dingy_Skipper1 = $sp1->query($Dingy_Skipper);
// free database
$Dingy_Skipper1->closeCursor();
?>

Я обновил запрос (см. Ниже), который теперь работает правильно, и я предполагаю, что он защитит от внедрения SQL? Тем не менее, что было бы наиболее эффективным способом выбора первой и последней даты из второго столбца в той же таблице, называемой Grizzled_Skipper, поэтому у меня есть первая и последняя даты как $ Grizzled_Skipper_FDate и $ Grizzled_Skipper_LDate для столбца Grizzled_Skipper, а также $ Dingy_Skipper_FDate и $ Dingy_Skipper_LDate для столбца Dingy_Skipper?

<?php
if (isset($_GET['yr'])) {
require_once('inc/connection.php');
$conn = dbConnect('read', 'pdo');
$sql = 'SELECT MIN(rDate) AS Dingy_Skipper_FDate, MAX(rDate) AS Dingy_Skipper_LDate, Dingy_Skipper
FROM wbcrecords
WHERE YEAR(rDate) = :yr AND Dingy_Skipper >="1"';
$searchterm = $_GET['yr'];
$Species = $conn->prepare($sql);
$Species->bindParam(':yr', $searchterm, PDO::PARAM_STR);
$Species->bindColumn(1, $Dingy_Skipper_FDate);
$Species->bindColumn(2, $Dingy_Skipper_LDate);
$Species->bindColumn(3, $Dingy_Skipper);
$Species->execute();
$numRows = $Species->rowCount();
}
?>

1 Ответ

0 голосов
/ 24 апреля 2019

Скорее всего, вы можете получить это, используя MIN () и MAX (), например:

  SELECT MIN(rDate) AS Dingy_Skipper_FDate,
         MAX(rDate) AS Dingy_Skipper_LDate, 
         Dingy_Skipper
    FROM wbcrecords
   WHERE YEAR(rDate) = '$theyear' 
     AND Dingy_Skipper >='1'
GROUP BY Dingy_Skipper

Обязательно экранируйте переменные, которые вы используете в этом запросе.В противном случае вы широко открыты для атак с использованием SQL-инъекций.

РЕДАКТИРОВАТЬ: Вместо экранирования было бы лучше использовать подготовленные операторы и использовать переменную $theyear в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...