Php PDO不能将新记录插入Access数据库,但可以在同一连接中读取和删除

Php PDO不能将新记录插入Access数据库,但可以在同一连接中读取和删除,php,ms-access,pdo,odbc,Php,Ms Access,Pdo,Odbc,我有个问题。我有一个ms Access数据库文件,我必须读取和修改删除和插入记录。我使用PDO odbc。我有一个奇怪的情况,我可以读取和删除,但我不能用相同的连接在数据库中插入新记录。我已经在ms Access中检查了插入字符串,它工作得非常好。 这里是php代码: <?php $path = getcwd() . "\\tempFolder\\MSDB.mdb"; $con = "odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$

我有个问题。我有一个ms Access数据库文件,我必须读取和修改删除和插入记录。我使用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();
}
这有什么问题? p、 s:我在几台计算机上测试了这个脚本,其中一些很好地显示了所有结果,但另一个-在insert命令中出错。 编辑:添加字段类型:

编辑: 我创建了mdb文件和带有读取、删除和插入功能的简单脚本,并将其放入。这个代码对我不起作用。如果你可以运行它没有问题,请写下你的驱动程序版本。我认为问题出在司机身上。在我的例子中,我已经尝试将ODBC快捷方式从system32更改为sysWOW64,但没有任何更改

据此,var是MS-Access中的保留字

其中一个变量称为var,因此出现语法错误。将名称用方括号括起来

编辑:


该错误表明其中一列与您提供的值之间存在类型冲突。在任何情况下,超越的想法都是一样的。连接良好。SQL有语法错误。

显示字段的类型是什么。您似乎要将它插入数据库,但打印输出显示它是一个二维数组

如何在php中通过oleDB连接到DB

要通过OLEDB执行插入,您可以使用如下内容


如果要对值进行harcode,则无需准备

另一方面,这是一种风险,因为您可能会犯错误,并且数据类型不匹配

看起来您正在插入坐标,例如,空白字符串将不会转换为float

请尝试正确准备此查询:

$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";
}

我只为这个地方做了短绳子。在原始版本中。。。wordI在上面添加了不同类型的字段,我无法重新创建您的问题。我用所需的表创建了一个test.mdb,将PDO代码复制并粘贴到一个.php文件中,它在PHP5.4.17下运行良好。不管示例代码怎么说,您都不会试图将Unicode字符插入数据库,是吗?是的,我有Unicode文本。这个数据库是从另一个软件,我想顶部修改我的解决方案。我尝试了另一个DB,所有东西都可以使用PDO,但是对于这种文件,我遇到了这些问题。我在下面的回答中测试OLEDB代码时使用的.mdb文件可以下载。试试它,而不是你的MSDB.mdb,看看它是否对你更有效。问题是,我从另一个程序中获取的此类文件,我必须对其进行一些修改。我知道这些mdb-s有点奇怪,但我必须使用它们。当然,今天早上我创建了我自己的mdb文件,并执行了select、delete、update和insert命令,所有这些命令都执行得很好。你能复制一个奇怪的.mdb文件,删除所有表中的所有记录,然后将空的shell数据库上传到一个类似这样的站点,以便我们可以尝试重新创建你的问题吗?
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/>
variant Object 
DELETE OK
Source: Microsoft JET Database Engine
Description: type Mismatch
$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";
}