Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL where子句中的转换错误_Php_Sql_Odbc - Fatal编程技术网

Php SQL where子句中的转换错误

Php SQL where子句中的转换错误,php,sql,odbc,Php,Sql,Odbc,在ODBC数据库表中,我有一个名为pSDateTime的列,它的格式为smalldatetime 我正在一个基于PHP的网站上运行一个搜索表单,该网站有一个下拉列表,您可以在其中选择2015、2014、2013等 我在提交搜索时遇到此错误: 警告:odbc_exec():SQL错误:[Microsoft][odbc SQL Server 转换varchar值时驱动程序][SQL Server]转换失败 “%2014%”转换为数据类型int,SQLExecDirect中的SQL状态为22005 这

在ODBC数据库表中,我有一个名为pSDateTime的列,它的格式为smalldatetime

我正在一个基于PHP的网站上运行一个搜索表单,该网站有一个下拉列表,您可以在其中选择2015、2014、2013等

我在提交搜索时遇到此错误:

警告:odbc_exec():SQL错误:[Microsoft][odbc SQL Server 转换varchar值时驱动程序][SQL Server]转换失败 “%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";
我尝试了不同类型的转换,并不断得到相同的错误。当我在MicrosoftSQLServerManagementStudio上运行查询时,它工作正常。我似乎无法实现“%$yearq%”格式/转换。

YEAR()
返回一个整数。这会导致等式出现问题,因为随后会转换另一个参数。这就产生了一个错误

两种选择:

Year(pSDateTime) = $yearq
或:

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


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

这很有效,谢谢!是的,我运行
$\u POST['search']=htmlspecialchars($\u POST['search']);$_POST['year']=htmlspecialchars($_POST['year'])如果将“%$yearq%”的顺序切换为Year(pSDateTime),会发生什么情况?我相信引擎会将Year转换为string,而不是string转换为varchar。虽然我不确定access是否支持这种类型的转换。
datename(year, psDateTime) = '$yearq'