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

Я пытаюсь последние несколько дней, но я просто не могу понять это.У меня есть страница фильтра, где пользователь может выбрать start_date, end_date, client и payment_status.Client и payment_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
array (0) {}

Выше указаны входные данные $ _POST и пустой массив.Я не знаю, где смотреть больше.

РЕДАКТИРОВАТЬ: ВЫБРАТЬ * из службы, где (дата между '2019-01-01' и '2019-07-03') И clientId = 1 Иpayment_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 или просто получить?Когда мне нужно выполнить и когда я могу просто получить?Спасибо

1 Ответ

1 голос
/ 14 марта 2019

Вы получаете ошибку «..number связанных переменных ...», потому что, как говорит @Xatenev, вам не нужно заключать в кавычки знаки места.PDO готовит строку '...BETWEEN :date_start AND ..., т. Е. Она ищет дату с STRING VALUE OF ': date_start', которая предположительно не существует, вместо того, чтобы искать значение даты со значением :date_start.Если это должно выглядеть следующим образом:

from service where(date BETWEEN :date_start ..... 

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

Если вы удалите кавычки, он больше не будет воспринимать это как строку и будет рассматривать его как маркер места, как и предполагалось

ОБНОВЛЕНИЕ -

Re комментарии ОП о не совсем понимании, представьте, что у вас есть переменная $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 при execute () как

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')

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

Надеюсь, это немного поможет вашему пониманию, по сути, вам не нужно указывать заполнители, это то, что процесс связывания для

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