首页 > 解决方案 > 如何解决需要单引号进行日期时间转换的 PHP odbc_execute 参数?

问题描述

我正在尝试将一些代码转换为使用 PHP 的 odbc_prepare 和 odbc_execute 使用参数将数据插入到 SQL Server 表中以确保安全,但由于 PHP 处理参数中单引号的方式以及 SQL Server 需要要转换为日期时间的文本周围的单引号。

我有一个网络表单,它接受来自用户的日期时间以及其他数据。
日期时间输入框(下面的missdt)的输出格式为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 错误“Invalid character value for cast specification”</p>

我在 $params 数组中为 $missdt 尝试了以下变体,并收到了指示的错误:

“'”。$missdt 。"'", // (加引号) PHP 错误无法打开文件

“'”。$missdt 。" '", // (添加引号和空格) PHP 错误无法打开文件

“'”。$missdt 。"' ", // (后面有空格) SQL 错误 转换规范的字符值无效

'"' . $missdt . '"', // (双引号与 setquoted_identifier off 一起使用)导致“参数编号无效”和“odbc_execute() 期望参数 1 是资源”</p>

sql 查询的这种变体可以正常工作,但可能会被滥用:

$sql = "插入 my_table(分支,提交,miss_date,名称)值(?,getdate(),'$missdt',?)";

根据 PHP 文档,在参数前后使用单引号会导致参数被视为文件名,解决方法是在参数的开头或结尾添加空格。您可以从我上面尝试过的变体中看到在这种情况下不起作用。我认为这是因为 SQL Server 需要引号才能将字符数据转换为日期时间。

关于如何解决这个问题的任何想法?

我在 Windows 2012 上使用 PHP 7.1、SQL Server 2014 和 Apache

标签: phpsql-server

解决方案


所以事实证明不是单引号引起了问题。它是日期时间输入中的“T”。如果我使用 str_replace 并将 T 替换为空格,则使用不带引号的参数的 sql 可以正常工作。

例如: $missdt = str_replace('T', ' ',$_POST["missdt"] );

然后

$sql = "插入 my_table(分支,提交,miss_date,名称)值(?,getdate(),?,?)“;

工作得很好。


推荐阅读