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->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->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 解决方法?
symfony2 中的 MySQL (PDO) 出错:驱动程序中发生异常:SQLSTATE [HY000] [1049]