используя переменную mysql в предложении where с PDO - PullRequest
1 голос
/ 11 июля 2019

Я все еще пытаюсь найти наилучшее из возможных решений для привязки одной даты в качестве переменной в SQL с помощью PDO. До сих пор я запрограммировал функцию в PHP, которая приближает время к определенной дате. У меня есть только одно свидание, но самое грязное решение, которое я нашел, это связать его дважды, и я бы не рискнул сохранить свой код в чистоте. Так что я подумал установить переменную, которая будет использоваться тогда в предложении Where. Это мой код:

<?php
function approximateAppo($date){
    $link = OpenDB();
    try {
        $query = "SET @v1 = :date;
                  SELECT from, till
                  FROM termin
                  WHERE from >= CONVERT('@v1 08:00:00', DATETIME) 
                  AND till <= CONVERT('@v1 20:00:00', DATETIME) 
                  AND comp_id=:comp";
        $statement = $link->prepare($query);
        $statement->bindValue(':comp', $_SESSION['comp'],PDO::PARAM_INT);
        $statement->bindValue(':date', $date, PDO::PARAM_STR);
        $statement->execute();
        $row = $statement->fetchAll();
    } catch (PDOException $e){
        p($e);
    }
    CloseDB($link);
    return $row;
}

Но на самом деле это не работает, в чем может быть проблема? Или как лучше всего решить проблему? Я до сих пор не нашел ничего похожего для решения моего дела.

1 Ответ

2 голосов
/ 11 июля 2019

Вы не можете выполнить несколько запросов за один вызов.

Вы можете инициализировать переменную в подзапросе.

Кроме того, переменные не заменяются внутри строк, вам необходимо использоватьCONCAT().

$query = "SELECT from, till
          FROM termin
          CROSS JOIN (SELECT @v1 := :date) AS x
          WHERE from >= CONVERT(CONCAT(@v1, ' 08:00:00'), DATETIME) 
          AND till <= CONVERT(CONCAT(@v1, ' 20:00:00'), DATETIME) 
          AND comp_id=:comp";

Но на самом деле переменная не нужна, вы можете использовать заполнитель :date дважды.

$query = "SELECT from, till
          FROM termin
          WHERE from >= CONVERT(CONCAT(:date, ' 08:00:00'), DATETIME) 
          AND till <= CONVERT(CONCAT(:date, ' 20:00:00'), DATETIME) 
          AND comp_id=:comp";
...