Я пытаюсь получить videos в соответствии с некоторыми атрибутами (age, year, countries). По какой-то причине, хотя я правильно связываю параметры с запросом и правильно его указал (u.country NOT IN ($countries_count)), я все равно получаю результаты для country = U.S.A. Есть что-то, что работает с моим bindParam. Пожалуйста помоги.

<?php
    $parameters = json_decode(file_get_contents('php://input'), true);
    $age = $parameters["age"];
    $year = $parameters["year"];
    $countries = sizeof($parameters["countries"]) == 0 ? array("0") : $parameters["countries"];
    $countries_count = implode(",", array_fill(0, sizeof($countries), "?"));

    $sql = "SELECT
                v.title, u.name 
            FROM 
                video AS v JOIN user AS u ON v.id_user = u.id 
            WHERE 
                u.age <= ? AND YEAR(v.upload_date) >= ? AND 
                u.country NOT IN ($countries_count);";

    $connection = new PDO("mysql:host=localhost;dbname=data_base", "root", "");
    $statement = $connection->prepare($sql);
    $statement->bindParam(1, $age, PDO::PARAM_INT);
    $statement->bindParam(2, $year, PDO::PARAM_INT);
    foreach ($countries as $k => $x) {
        $statement->bindParam($k+3, $x, PDO::PARAM_STR);
    }
    $statement->execute();
    echo json_encode($statement->fetchAll());
?>
php
0
Aman 28 Май 2019 в 04:51

2 ответа

Лучший ответ

Ваша проблема заключается в том, что вы связываете все параметры IN с одной и той же переменной ($x), так что все они имеют одинаковое значение. Вы можете обойти это, либо изменив bindValue, либо связавшись с фактическим значением массива I.e.

$statement->bindParam($k+3, $countries[$k], PDO::PARAM_STR);
1
Nick 28 Май 2019 в 03:06

Измените bindParam на bindValue

Если вы хотите использовать bindParam, измените ваш sql на

u.age <= :age and
YEAR(v.upload_date) >= :year
...

Затем свяжите параметр:

->bindParam(':age', $age)
->bindParam(':year', $year)
1
Pheara 28 Май 2019 в 02:38