Как обойти параметры PHP odbc_execute, требующие одинарных кавычек для преобразования даты и времени? - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь преобразовать некоторый код, чтобы использовать PHP odbc_prepare и odbc_execute для вставки данных в таблицу SQL Server, используя параметры для безопасности, но я не могу получить прошлые ошибки из-за способа, которым PHP обрабатывает одинарные кавычки в параметрах и SQLПотребность сервера в одинарных кавычках вокруг текста для приведения к дате и времени.

У меня есть веб-форма, которая принимает дату и время от пользователя среди других данных.
Вывод из поля ввода даты и времени (ниже)в формате YY-MM-DDTHH: MM: SS (например, 2019-10-09T10: 14: 00)

Вот мой код (сокращен для этого поста, да, я очищаю данные поста в своем реальном коде):

$missdt = $_POST["missdt"];  // results in 2019-10-09T10:14:00  stored as datetime in SQL Server
$branch = intval($_POST["branch"]);  // stored as integer in SQL Server
$name = $_POST["name"];              // stored as varchar in SQL Server

$params = array($branch, 
        $missdt,               // results in SQL error “Invalid character value for cast specification”
        $name, );
$sql = "insert into my_table (branch, submitted, miss_date, name) 
            values (?, getdate(), ?, ?) ";

$res = odbc_prepare($conn, $sql);
$stmt = odbc_execute($res, $params);

Проблема в том, что параметр $ missdt приводит к ошибке SQL «Недопустимое значение символа для спецификации приведения»

Я пробовал следующие варианты для $ missdt вмассив $ params и получил указанные ошибки:

"'". $ missdt. "'", // (добавлены кавычки) Ошибка PHP не может открыть файл

"'". $ missdt. "'", // (добавлены кавычки и пробелы) Ошибка PHP не может открыть файл

"'". $ missdt. "'", // (пробел после) Ошибка SQL Недопустимое символьное значение для спецификации приведения

' "'. $ missdt.'" ', // (двойные кавычки используются с отключенным параметром quoted_identifier) ​​приводит к «недопустимому»номер параметра »&« odbc_execute () ожидает, что параметр 1 будет ресурсом »

Этот вариант запроса SQL работает нормально, но его можно использовать неправильно:

$ sql =" вставить в my_table (branch,submit, miss_date, name) значения (?, getdate (), '$ missdt',?) ";

Согласно документации PHP, использование одинарных кавычек до и после параметра приводит к тому, что параметр обрабатывается какимя файла и обходной путь - добавить пробел в начало или конец параметра. Из вариантов, которые я пробовал выше, видно, что в данном случае это не работает. Я думаю, это потому, что SQL Server нужны кавычки, чтобы привести символьные данные к дате.

Любые идеи о том, как обойти это?

Я использую PHP 7.1, SQL Server2014 и Apache в Windows 2012

1 Ответ

0 голосов
/ 10 октября 2019

Таким образом, оказывается, что проблема заключалась не в одинарных кавычках. Это была буква «Т» во вводе даты и времени. Если я использую str_replace и заменяю T пробелом, sql, использующий параметр без кавычек, работает правильно.

, например: $ missdt = str_replace ('T', '', $ _ POST ["missdt"]);

затем

$ sql = "вставить в my_table (branch, submit, miss_date, name) значения (?, Getdate (),?,?)";

отлично работает.

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