Получение массива (0) { }, когда я должен получить результаты

#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 пожалуйста, смотрите обновленный ответ для более подробного объяснения