SQL where子句中的转换错误

时间:2015-10-19 21:48:53

标签: php sql odbc

在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%'格式/转换成功。

1 个答案:

答案 0 :(得分:1)

YEAR()返回一个整数。这导致了相等的问题,因为然后转换了另一个参数。而且,这会产生错误。

两种选择:

Year(pSDateTime) = $yearq

或:

datename(year, psDateTime) = '$yearq'

您可能不希望%使用通配符=。这些仅适用于LIKE

您还应该弄清楚如何参数化进入查询的值。这使得它更安全(防止SQL注入)并且通常更快(通过在每次执行代码时消除重新编译)。