Правильный синтаксис оператора SQL BETWEEN с предложениями AND

Я использую следующий SQL-запрос в своем PHP-скрипте:

$lng = some lng;
$lat = some lat;
$usertable = $my_db_table;
$interval = 30;
$name = "John Doe";
$query = "SELECT *, POW(69.1*(lat-$lat),2)+POW(69.1*($lng-lng)*COS(lat/57.3),2) AS distance FROM $usertable WHERE obsDt BETWEEN DATE_SUB(NOW(), INTERVAL $interval DAY) AND name = '$name' HAVING distance < SQRT(5)";

Этот код работает, как и ожидалось, за исключением предложения AND name = '$name', где он часто возвращает строки со значениями столбца name, отличными от тех, которые равны только $comname. Что-то не так в моем синтаксисе?

Есть ли другой способ, которым я должен заявлять или упорядочивать эти пункты?

Научитесь использовать параметры! Не путайте строки запроса со значениями параметров.

Gordon Linoff 10.04.2019 13:00

Спасибо, звучит как хорошая практика. Как бы я сделал это в моем случае на PHP?

zdebruine 10.04.2019 13:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В вашем запросе возникла серьезная проблема

obsDt BETWEEN DATE_SUB(NOW(), INTERVAL $interval DAY) AND name = '$name' HAVING distance < SQRT(5)";

В этой части вы взяли предложение between, поэтому между двумя вариантами, например между какими двумя значениями, вы пропустили это и написали name = '$ name'

Ответ принят как подходящий

Вам просто нужно закончить предложение BETWEEN, указав дату окончания:

например.

BETWEEN '2019-01-01 00:00:00' AND '2019-01-02 00:00:00'

Понятно, как говорит @RahulMeshram, но это именно моя проблема.

zdebruine 10.04.2019 13:07

Это сработало для меня: WHERE name = '$name' AND obsDt BETWEEN DATE_SUB(NOW(), INTERVAL $interval DAY) AND NOW()

zdebruine 10.04.2019 13:13
$lng = some lng;
$lat = some lat;
$usertable = $my_db_table;
$interval = 30;
$name = "John Doe";

$dbh = new PDO("mysql:host=localhost;dbname=database;","root","");
$sql = "SELECT *,POW(69.1*(lat-:lat),2)+POW(69.1*(:lng-lng)*COS(lat/57.3),2) AS distance";
$sql . = " FROM ".$usertable;
$sql . = " WHERE obsDt < DATE_SUB(NOW(), INTERVAL :interval DAY)"
$sql . = " AND name = :name HAVING distance < SQRT(5)";

$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':lat' => $lat, ':lng' => $lng,':name' => $name, ':interval' => $interval));
$res = $sth->fetchAll();

Другие вопросы по теме