SQL where 子句中的转换错误
Conversion error in SQL where clause
在 ODBC 数据库中 table 我有一个名为 pSDateTime 的列,它具有 smalldatetime 格式。
我正在 运行 在基于 PHP 的网站上设置一个搜索表单,该网站有一个下拉列表,您可以在其中 select 2015、2014、2013 等
提交搜索时出现此错误:
Warning: odbc_exec(): SQL error: [Microsoft][ODBC SQL Server
Driver][SQL Server]Conversion failed when converting the varchar value
'%2014%' to data type int., SQL state 22005 in SQLExecDirect
这是我的查询 运行:
$query = "SELECT *
FROM tbspeakers s join tbpresentations p on
s.spkrId = p.spkrId
join tbsessions ss on
p.courseSessionid = ss.courseSessionId
join tbcourses c on
ss.courseId = c.courseId
WHERE
(fname LIKE '%$searchq%' OR lname LIKE '%$searchq%' OR pTitle LIKE '%$searchq%' AND Year(pSDateTime) = '%$yearq%')
ORDER BY pSDateTime DESC";
我尝试了不同类型的转换,但总是出现同样的错误。当我 运行 Microsoft SQL Server Management Studio 上的查询时,它工作正常。我似乎无法计算出“%$yearq%”format/conversion。
YEAR()
returns 一个整数。这会导致相等性问题,因为另一个参数随后被转换。而且,这会产生错误。
两个选择:
Year(pSDateTime) = $yearq
或:
datename(year, psDateTime) = '$yearq'
您可能不想要 =
的通配符 %
。这些仅适用于 LIKE
.
您还应该了解如何参数化进入查询的值。这使它更安全(防止 SQL 注入)并且通常更快(通过消除每次执行代码时的重新编译)。
在 ODBC 数据库中 table 我有一个名为 pSDateTime 的列,它具有 smalldatetime 格式。
我正在 运行 在基于 PHP 的网站上设置一个搜索表单,该网站有一个下拉列表,您可以在其中 select 2015、2014、2013 等
提交搜索时出现此错误:
Warning: odbc_exec(): SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the varchar value '%2014%' to data type int., SQL state 22005 in SQLExecDirect
这是我的查询 运行:
$query = "SELECT *
FROM tbspeakers s join tbpresentations p on
s.spkrId = p.spkrId
join tbsessions ss on
p.courseSessionid = ss.courseSessionId
join tbcourses c on
ss.courseId = c.courseId
WHERE
(fname LIKE '%$searchq%' OR lname LIKE '%$searchq%' OR pTitle LIKE '%$searchq%' AND Year(pSDateTime) = '%$yearq%')
ORDER BY pSDateTime DESC";
我尝试了不同类型的转换,但总是出现同样的错误。当我 运行 Microsoft SQL Server Management Studio 上的查询时,它工作正常。我似乎无法计算出“%$yearq%”format/conversion。
YEAR()
returns 一个整数。这会导致相等性问题,因为另一个参数随后被转换。而且,这会产生错误。
两个选择:
Year(pSDateTime) = $yearq
或:
datename(year, psDateTime) = '$yearq'
您可能不想要 =
的通配符 %
。这些仅适用于 LIKE
.
您还应该了解如何参数化进入查询的值。这使它更安全(防止 SQL 注入)并且通常更快(通过消除每次执行代码时的重新编译)。