#php #mysql #pdo
#php #mysql #pdo
Вопрос:
Я пытаюсь последние несколько дней, но просто не могу разобраться в этом. У меня есть страница фильтра, где пользователь может выбрать start_date, end_date, client и paying_status. Client и paying_status ссылаются на основную таблицу обслуживания.
Я даже повторяю все $ _POST и получаю правильные входные данные, но мой SQL-запрос не выдает никаких результатов. Когда я запускаю тот же запрос в своей базе данных, я получаю правильные результаты. Я не вижу никаких ошибок или я ослеп из-за своих собственных ошибок после всех этих дней.
<?php
include "../controller/session.php";
include "../controller/pdo.php";
$submit = isset($_POST["filter-submit"]) ? $_POST["filter-submit"] : "";
$date_start = isset($_POST["date_start"]) ? $_POST["date_start"] : "";
$date_end = isset($_POST["date_end"]) ? $_POST["date_end"] : "";
$client = isset($_POST["client"]) ? $_POST["client"] : "";
$payed = isset($_POST["payed"]) ? $_POST["payed"] : "";
echo $date_start . "<br>" . $date_end . "<br>" . $client . "<br>" . $payed . "<br>";
if ($submit == "Filter") {
$query = $db->prepare("SELECT * from service where(date BETWEEN ':date_start'AND ':date_end') AND clientId=:client AND paying_status=:payed;");
$query->bindParam(':date_start', $date_start);
$query->bindParam(':date_end', $date_end);
$query->bindParam(':client', $client);
$query->bindParam(':payed', $payed);
$results = $query->fetchAll(PDO::FETCH_OBJ);
var_dump($results);
}
2019-01-01
2019-07-03
1
1
массив (0) {}
Выше приведены входные данные $ _POST и пустой массив. Я больше не знаю, где смотреть.
Редактировать: ВЫБЕРИТЕ * из service where (дата между ‘2019-01-01’ И ‘2019-07-03’) И ClientID=1 И paying_status = 1; Это отлично работает в моей базе данных.
ПРАВКА 2: Обновленный код. По-прежнему не работает.
if ($submit == "Filter") {
$query = $db->prepare("SELECT * from service where(date BETWEEN ':date_start'AND ':date_end') AND clientId=:client AND paying_status=:payed;");
$query->bindParam(':date_start', $date_start);
$query->bindParam(':date_end', $date_end);
$query->bindParam(':client', $client, PDO::PARAM_INT);
$query->bindParam(':payed', $payed, PDO::PARAM_INT);
$query->execute();
$results = $query->fetchAll(PDO::FETCH_OBJ);
var_dump($results);
}
ПРАВКА 3:
if ($submit == "Filter") {
$query = $db->prepare("SELECT * from service where(date BETWEEN :date_start AND :date_end) AND clientId=:client AND paying_status=:payed;");
$query->bindParam(':date_start', $date_start);
$query->bindParam(':date_end', $date_end);
$query->bindParam(':client', $client, PDO::PARAM_INT);
$query->bindParam(':payed', $payed, PDO::PARAM_INT);
$query->execute();
$results = $query->fetchAll(PDO::FETCH_OBJ);
var_dump($results);
}
Это работает! Может кто-нибудь объяснить, почему мне иногда нужно выполнить запрос, а иногда я просто могу получить данные с помощью fetchAll или просто fetch? Когда мне нужно выполнить, а когда я могу просто извлечь? Спасибо
Комментарии:
1. Можете ли вы показать запрос, который вы выполнили к базе данных? (который показал результаты)
2. не отсутствует ли $query->execute() ?
3. Что сказал @FatFreddy ^ и вы должны добавить
PDO::PARAM_INT
к$client
и$payed
в качестве третьего параметра к->bindParam
. Вам, вероятно, не нужны''
кавычки вокруг:date_start
и:date_end
, PDO автоматически заключит их в кавычки, поскольку они имеют типPDO::PARAM_STR
.4. Когда я добавляю PDO::PARAM_INT — происходит то же самое. Когда я добавляю ниже $query-execute(); — Я получаю эту ошибку: Неустранимая ошибка: Неперехваченное исключение PDOException: SQLSTATE[HY093]: Недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов в…
5. @svrdoljak Можете ли вы показать свой обновленный код? (В лучшем случае со всеми изменениями, упомянутыми выше)
Ответ №1:
Вы получаете ошибку ‘..количество связанных переменных …’, потому что, как говорит @Xatenev, вам не нужно заключать маркеры места в кавычки. То, что вы просите PDO подготовить, — это строка '...BETWEEN :date_start AND ...
, т. Е. он ищет дату со СТРОКОВЫМ ЗНАЧЕНИЕМ ‘:date_start’, которое предположительно не существует, вместо того, чтобы искать значение даты со значением :date_start
. If должно выглядеть следующим образом:
from service where(date BETWEEN :date_start .....
чтобы немного расширить, фактическая ошибка возникает из-за того, что вы пытаетесь связать значения для каждого из указанных заполнителей, но PDO вообще не может видеть эти заполнители, поскольку все, что он может интерпретировать, — это несколько добавленных вами строк и два заполнителя
Если вы удалите свои кавычки, то он больше не будет видеть это как строку и будет рассматривать как маркер места, как и предполагалось
Обновить —
Повторите комментарии о не совсем понимании, представьте, что у вас есть переменная $values
$values[] содержит ‘джем’, ‘хлеб’ или ‘арахисовое масло’ в зависимости от входных данных. Итак, вы хотите вставить в таблицу с именем sandwich_parts и создаете запрос на основе входных данных (или выбора, или цикла для чего угодно)
foreach($values as $value){
$q1->prepare("INSERT INTO sandwich_parts (part) values (':value'));
$q2->prepare("INSERT INTO sandwich_parts (part) values (:value));
$q->bindValue(':value',$value,PDO::PARAM_STR);
}
это будет отправлено в mysql при выполнении () как
INSERT INTO sandwich_parts (part) values (':value')
INSERT INTO sandwich_parts (part) values ('jam')
INSERT INTO sandwich_parts (part) values (':value')
INSERT INTO sandwich_parts (part) values ('bread')
INSERT INTO sandwich_parts (part) values (':value')
INSERT INTO sandwich_parts (part) values ('peanut butter')
поскольку первая вставка всегда считывает строку ‘:value’, тогда как вторая видит маркер места и привязывает параметр, таким образом, вы каждый раз будете получать ошибки для первого запроса, потому что он не может видеть заполнитель для привязки значения
Я надеюсь, что это немного поможет вашему пониманию, в принципе, вам не нужно заключать заполнители в кавычки, для чего и предназначен процесс привязки
Комментарии:
1. Спасибо! Теперь работает нормально. Я поместил ответ в ПРАВКУ 3. Может быть, вы можете объяснить вопрос о выполнении, который я задал в ПРАВКЕ 3? Большое спасибо!
2. не без некоторого примера кода, вам, вероятно, лучше всего выполнить поиск по этому вопросу или опубликовать новый вопрос. Я бы рискнул предположить (но очень поверхностно), что вы делаете, когда думаете, что не выполняете используемый вами запрос -> query(«выбрать … и т.д.») вместо подготовки запроса и привязки значений
3. в любом случае спасибо! Я проведу свое исследование 🙂 Но это все еще немного сбивает с толку, зачем мне нужно удалять кавычки.
4. @svrdoljak пожалуйста, смотрите обновленный ответ для более подробного объяснения