php - 如何解决需要单引号进行日期时间转换的 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
解决方案
所以事实证明不是单引号引起了问题。它是日期时间输入中的“T”。如果我使用 str_replace 并将 T 替换为空格,则使用不带引号的参数的 sql 可以正常工作。
例如: $missdt = str_replace('T', ' ',$_POST["missdt"] );
然后
$sql = "插入 my_table(分支,提交,miss_date,名称)值(?,getdate(),?,?)“;
工作得很好。
推荐阅读
- tensorflow - 如何训练 CNN 从标记的图像中学习边界框?
- vue.js - nuxt.config.js 在哪里构建模块仅在开发模式下构建?
- r - 如何将使用 with(plot()) 绘制的绘图保存到 R 中的变量中?
- r - 使用 full_join 合并两个以上数据帧时的后缀
- python - Beautifulsoup 无法在表中获得“tr”
- python - 对数据框进行行迭代以计算值并将它们添加到新列
- http - 我在 Qualtrics 中为“网络服务”使用什么服务?
- python - 当 keras 变量发生变化时执行预计算
- javascript - 我在服务器中安全地使用 eval() 吗?
- c# - 从 .NET WebBrowser 打印到多台打印机 - 除非使用 MessageBox,否则程序会挂起