在ODBC数据库表中,我有一个名为pSDateTime的列,它具有smalldatetime格式。
我在基于PHP的网站上运行搜索表单,该网站有一个下拉列表,您可以选择2015年,2014年,2013年等。
我提交搜索时收到此错误:
警告:odbc_exec():SQL错误:[Microsoft] [ODBC SQL Server 驱动程序] [SQL Server]转换varchar值时转换失败 '%2014%'到数据类型int。,SQLExecDirect中的SQL状态22005
这是我运行的查询:
$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%'格式/转换成功。
答案 0 :(得分:1)
YEAR()
返回一个整数。这导致了相等的问题,因为然后转换了另一个参数。而且,这会产生错误。
两种选择:
Year(pSDateTime) = $yearq
或:
datename(year, psDateTime) = '$yearq'
您可能不希望%
使用通配符=
。这些仅适用于LIKE
。
您还应该弄清楚如何参数化进入查询的值。这使得它更安全(防止SQL注入)并且通常更快(通过在每次执行代码时消除重新编译)。