PHP PDO查询到MS Access无法正常工作

时间:2011-12-07 02:18:42

标签: php ms-access pdo odbc

所以我使用PDO(ODBC)访问MSAccess数据库。我试图获取本周的所有记录而不是过去七天。这是我的疑问:

SELECT * 
FROM tblBilling 
WHERE ((
      Year(DateOfService) = Year(Date()) 
  And DatePart("ww", DateOfService, 0) = DatePart("ww", Date(), 0)
))
ORDER BY DateOfService, TimeOfService

显然这适用于MSAccess,但是当从Web应用程序使用它时,我收到以下错误:

SQLSTATE[07002]: COUNT field incorrect: 
    -3010 [Microsoft][ODBC Microsoft Access Driver] 
    Too few parameters. Expected 1. 
    (SQLExecute[-3010] at ext\pdo_odbc\odbc_stmt.c:254)

我似乎无法弄清楚这一点。我必须忽略一些东西,我的大脑现在变得糊里糊涂。我知道如果我删除DataPart它将运行查询并且不返回错误,但是它将不会执行我需要它做的事情。

感谢您的帮助!

根据要求提供额外代码:

try
{
    $pdo = new PDO('odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq='.DB_NAME.';Uid=');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $myPDO = $pdo->prepare($query);
    $myPDO->execute(); 

    $result = $myPDO->fetchAll();
} catch(PDOException $e)
{
    echo $e->getMessage();
}

2 个答案:

答案 0 :(得分:1)

对于任何想要了解的人。如果您正在对MSAccess数据库运行查询,则查询语法将与您使用的语法不同。这就是我开始工作的方式。我将ww周围的双引号更改为单引号。

SELECT * 
FROM tblBilling 
WHERE ((Year(DateOfService) = Year(Date()) 
AND DatePart(\'ww\', DateOfService, 0) = DatePart(\'ww\', Date(), 0)))
ORDER BY DateOfService, TimeOfService

答案 1 :(得分:0)

您的ADODB连接似乎没有将查询的Datepart部分识别为函数(它认为它是一个参数)。

这对您的确切问题没有帮助....但是这里有另一种方法可以让您到达目的地。

我过去通过创建一个日历表来解决这种性质的问题(对于从逻辑角度来看有点无关紧要的金融日历)。这是我从Data Analysis Using SQL and Excel

得到的一个想法

表格看起来像这样。

Calendar table sample

您可以轻松放置50年的日历日,而不会导致任何类型的性能问题。然后,您可以根据需要通过加入日历表来获取日期存储桶。