我有一个问题。我有一个ms访问DB文件,我必须阅读和修改(删除和插入记录)。我用PDO odbc。我有奇怪的情况,我可以读取和删除,但我不能在数据库中插入新的记录与相同的连接。我已经检查了ms Access中的插入字符串,它可以完美地工作。
这里的php代码:
<?php
$path = getcwd() . "''tempFolder''MSDB.mdb";
$con = "odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$path; Uid=; Pwd=;";
try
{
$db = new PDO($con);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//READ
$cmd = "SELECT * FROM temp_HEADER WHERE [LINE-ID]='101'";
$result = $db->prepare($cmd);
$result->execute();
$result = $result->fetch(PDO::FETCH_ASSOC);
print_r($result); echo "<br/>";
//DELETE
$cmd = "DELETE FROM temp_HEADER WHERE [LINE-ID]='101'";
$result = $db->prepare($cmd);
$result->execute();
echo "DELETE OK<br/>";
//INSERT
$cmd = "INSERT INTO temp_HEADER ([LINE-ID], PLANE, DISPLAY, X, Y, Z, LENGTH, SURF, ROCK, VARIA, LTYPE, NAME) "
. "VALUES('101', '100', '', 100, 100, 100, 0, 0, '', 1, 'LINE', 'TEMP')";
$result = $db->prepare($cmd);
$result->execute();
echo "INSERT OK";
} catch (Exception $ex) {
echo $ex->getMessage();
}
这段代码得到我以下结果:
Array ( [LINE-ID] => 101 [PLANE] => 100 [DISPLAY] => [X] => 100.0 [Y] => 100.0 [Z] => 100.0 [LENGTH] => 0.0 [SURF] => 0.0 [ROCK] => [VAR] => 1 [LTYPE] => LINE [NAME] => TEMP [Ind] => 1041 )
DELETE OK
SQLSTATE[22018]: Invalid character value for cast specification: 39 [Microsoft][Driver ODBC Microsoft Access]Invalid character value for cast specification (null) (SQLExecute[39] at ext'pdo_odbc'odbc_stmt.c:254)
这有什么不对吗?
注:我在几台计算机上测试了这个脚本,其中一些显示了所有结果,但另一个在插入命令中出现了错误。
编辑:添加字段类型:
LINE-ID - Text<br/>
PLANE - Text<br/>
DISPLAY - Text<br/>
X - Number(Double)<br/>
Y - Number(Double)<br/>
Z - Number(Double)<br/>
LENGTH - Number(Double)<br/>
SURF - Number(Double)<br/>
ROCK - Text<br/>
VARIA - Number(Long Integer)<br/>
LTYPE - Text<br/>
NAME - Text<br/>
Ind - AutoNumber(Long Integer)<br/>
编辑:我刚刚在c#中编写了相同的代码,一切都很好(我可以阅读,删除和插入)。我使用了与这里相同的sql查询,但我使用了oleDB。在这种情况下,我认为在php中使用pdo的odbc有问题。不能有人告诉我如何通过oleDB在php连接到DB,因为快速搜索没有得到任何结果?
编辑:我试图使用代码与COM (OleDB)。我对读取、删除和插入重复了同样的任务。我得到的是:
variant Object
DELETE OK
Source: Microsoft JET Database Engine
Description: type Mismatch
编辑:我创建mdb文件和简单的脚本读取,删除和插入功能,并把它放在这里。这个代码对我不起作用。如果你可以运行它没有问题,请写下你的驱动程序的版本。我认为问题出在司机身上。在我的例子中,我已经尝试将ODBC快捷方式从system32更改为sysWOW64,但没有任何更改。
如果要硬编码该值,那么准备是没有意义的。
另一方面,这是一种风险,因为你可能会犯错误,数据类型不匹配。
看起来像是在插入坐标,例如一个空字符串(")不会转换为浮点数。
尝试正确地准备这个查询:
$cmd = "INSERT INTO
temp_HEADER (`[LINE-ID]`, `PLANE`, `DISPLAY`,
`X`, `Y`, `Z`, `LENGTH`, `SURF`,
`ROCK`, `VARIA`, `LTYPE`, `NAME`) "
. "VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$result = $db->prepare($cmd);
$success = $result->execute(array('101', '100', '',
100, 100, 100, 0, 0,
'', 1, 'LINE', 'TEMP'));
if($success){
echo "INSERT OK";
}else{
echo "INSERT FAIL";
}
根据这个列表,var
是MS Access中的保留字。
其中一个变量名为var
,因此会出现语法错误。将名称用方括号括起来
该错误表明其中一列与您提供的值之间存在类型冲突。在任何情况下,最重要的想法都是一样的。连接很好。SQL有语法错误
"显示"字段是什么类型?您似乎要将它插入数据库,但打印结果显示它是一个二维数组
如何在php中通过oleDB连接数据库
要通过OLEDB执行INSERT,您可以使用如下命令
<?php
// this code requires the following php.ini directive:
//
// extension=php_com_dotnet.dll
$path = getcwd() . "''tempFolder''MSDB.mdb";
$con = new COM("ADODB.Connection");
$con->Open(
"Provider=Microsoft.Jet.OLEDB.4.0;" .
"Data Source=$path");
$cmd = "INSERT INTO temp_HEADER ([LINE-ID], PLANE, DISPLAY, X, Y, Z, LENGTH, SURF, ROCK, VARIA, LTYPE, NAME) "
. "VALUES('101', '100', '', 100, 100, 100, 0, 0, '', 1, 'LINE', 'TEMP')";
$con->Execute($cmd);
$con->Close();
如果您正在处理Unicode文本(正如您在问题的评论中提到的那样),那么我强烈建议您放弃PDO_ODBC方法,因为它注定要失败。当涉及Unicode字符时,PHP和Access ODBC不一起很好地发挥作用。