Не привязывайте PDOStatement 'NOW()' как временную метку [дубликат]Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Не привязывайте PDOStatement 'NOW()' как временную метку [дубликат]

Сообщение Anonymous »

Я подделал функцию NOW() в своей базе данных postgresql, поэтому она возвращает заданную дату, используя этот ответ, который изменяет путь поиска пользователя. Я использую библиотеку MVC и могу видеть запросы, которые она отправляет, с помощью ALTER DATABASE db SET log_statement = 'all';, мне удалось воссоздать поведение с помощью базового PDO:

Код: Выделить всё

$pdo = new PDO($dsn, $user, $password);
  • Когда я запускаю запрос без связанных переменных, он отправляет ожидаемый запрос в базу данных и сохраняет поддельную дату в таблице:

Код: Выделить всё

$pdo->prepare("INSERT INTO table (ts) VALUES (NOW());")->execute();
// LOG: execute pdo_stmt: INSERT INTO table (ts) VALUES (NOW());
  • Когда я пытаюсь связать значение с помощью bindParam илиbindValue, оно отправляет временную метку в качестве привязанной значение:

Код: Выделить всё

$sql = $pdo->prepare("INSERT INTO table (ts) VALUES (:now);");
$now = 'NOW()';
$sql->bindValue(':now', $now);
$sql->execute();

// LOG: execute pdo_stmt: INSERT INTO table (ts) VALUES ($1);
// DETAIL:  Parameters: $1 = '2024-10-15 16:43:27.437313+00'
  • Благодаря отзывам Айнбера мне удалось воссоздать поведение с помощью строки, что заставляет меня думать, что это может быть связано с SQL:< /li>

Код: Выделить всё

$pdo->prepare("INSERT INTO table (ts) VALUES ('NOW())';")->execute();
// LOG: execute pdo_stmt: INSERT INTO table (ts) VALUES ('NOW()');
// Table stores '2024-10-15 17:47:44.796556+00'
Библиотека MVC привязывает значения перед попыткой записи в базу данных, что пропускает мою поддельную функцию. Я попытался отключить настройку подготовки эмуляции с помощью $pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);, но это не имеет никакого значения, поскольку оно доступно только для драйверов OCI, Firebird и MySQL в соответствии с docs.
Мой вопрос: есть ли способ использовать функцию NOW() в подготовленном операторе, чтобы она работала как случай № 1, а не как в других случаях, когда это привязка текущей метки времени или строки (которая оценивается как текущая метка времени)?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -timestamp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Не привязывайте PDOStatement 'NOW()' как временную метку [дубликат]
    Anonymous » » в форуме Php
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Не привязывайте PDOStatement 'NOW()' как временную метку
    Anonymous » » в форуме Php
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как преобразовать временную метку Integer в формат даты и сравнить с LocalDateTime.now? [дубликат]
    Anonymous » » в форуме JAVA
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Как преобразовать временную метку Integer в формат даты и сравнить с LocalDateTime.now?
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Является ли now() в LocalDate.now() конструктором? [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    79 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Php»