PDO 准备语句中的 SQLSTATE[22018] 错误

Posted

技术标签:

【中文标题】PDO 准备语句中的 SQLSTATE[22018] 错误【英文标题】:SQLSTATE[22018] error in PDO prepare statement 【发布时间】:2020-04-17 11:00:22 【问题描述】:

我只是在使用 MS Access 数据库。我正在尝试使用 php 中的 PDO 准备语句从 MS Access 数据库中显示员工最后一年的数据。

这是代码:

index.php

<?php

    require_once "config.php";
    date_default_timezone_set("Asia/Jakarta");

    echo "<h3>Employee Data</h3><br><br>";
    
    // START PDO SELECT
    try 
        $sql = "SELECT USERINFO.Name, USERINFO.Gender, CHECKINOUT.*, IIf(CHECKINOUT.Update = '', '[[ empty ]]', CHECKINOUT.Update) AS update_costum FROM CHECKINOUT 
                LEFT JOIN USERINFO  ON CHECKINOUT.USERID = USERINFO.USERID
                WHERE CHECKINOUT.CHECKTIME BETWEEN ? AND ?";
        
        $dateFrom1 = "(Date()-360)";
        $dateTo1 = "Date()";
        //$dateFrom2 = date("d/m/Y H:i:s");
        //$dateTo2 =  date("d/m/Y H:i:s", strtotime("-1 years"));
        
        $stmt = $link->prepare($sql);
        $stmt->bindParam(1, $dateFrom1 );
        $stmt->bindParam(2, $dateTo1 );
        $stmt->execute(); // return -1 ?
        echo $stmt->rowCount() . "<br><br>";
        while ($ds_emp = $stmt->fetch(PDO::FETCH_ASSOC)) 
            echo "User ID: " . $ds_emp["USERID"] . " || ";
            echo "Nama : " . $ds_emp["Name"] . " " . $ds_emp["Gender"] . " || ";
            echo "CHECKTIME : " . $ds_emp["CHECKTIME"] . " || ";
            echo "Update : " . $ds_emp["update_costum"];
            echo "<br>";
        
     catch (PDOException $e) 
        echo $e->getMessage();
    

运行代码后,我得到了一些奇怪的东西。

    $stmt-&gt;rowCount(); 返回 -1。

    $ds_emp 只有少量数据,不如预期。如果我直接在 MS Access 中运行查询,查询返回的所有数据都符合我的预期。

    页面的最后一行显示了这个错误。

SQLSTATE[22018]: Invalid character value for cast specification: -3030 [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression. (SQLFetchScroll[-3030] at ext\pdo_odbc\odbc_stmt.c:543)

我是否输入了错误的参数或查询? 我觉得我的查询语法没有错。

为什么$stmt-&gt;rowCount(); 返回 -1?

为什么 $ds_data 变量中只存储了很少的数据?

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

$link 声明变量未在此处显示,但为避免此错误,它应该是这样的

$dbName = "C:\\path\\to\\db.mdb";
$link = new PDO("odbc:DRIVER=Microsoft Access Driver (*.mdb);charset=UTF-8; DBQ=$dbName; Uid=; Pwd=;");

【讨论】:

以上是关于PDO 准备语句中的 SQLSTATE[22018] 错误的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo

SQLSTATE[HY093]:无效的参数号 - PDO Select 语句

如何使用 AES_ENCRYPT 和 PDO 准备语句改进大型加密数据库的 PHP 解决方法?

PDO 准备好的语句 - 参数名称中的冒号用于啥?

symfony2 中的 MySQL (PDO) 出错:驱动程序中发生异常:SQLSTATE [HY000] [1049]

“SQLSTATE[HY000]: 一般错误” - 一条语句中有多个 SQL 查询