PHP 写入 odbc 数据源失败

PHP writing to odbc datasource fails


今天我需要一些关于 php 脚本的帮助,但它不再起作用了。

我必须设置一个备份服务器,其中一个简单的时间表与一个网络界面一起工作,连接到一个 odbc 数据源(Access 2007 数据库) 在原来的服务器上一切正常,但现在要更换硬件了。
在两台服务器上,出于兼容性原因,PHP 版本 5.4.9 为 运行。 (本地网络,所以旧 php 版本没有风险)

从数据源读取工作正常,但我无法写入数据源。在数据源环境中是否有任何我没有找到的只读标志? 我不知道如何解决这个问题。
我可以毫无错误地按照代码执行“INSERT INTO”命令。

$result = odbc_exec($con,"INSERT INTO Zeitkarten (BeginnTätigkeit,EndeTätigkeit,Mitarbeiter,Projekt,ArbeitscodeNr,datum,Pause,AnzahlUeber,FZhin,FZrueck,Anmerkung) 
          VALUES (#".$_POST['kommen']."#,#".$_POST['gehen']."#,$benutzer,".$_POST['projekt'].",".$_POST['adt'].",#".$_POST['heute']."#,".str_Replace(",",".",$_POST['pause']).",".str_Replace(",",".",$_POST['ama']).",".str_Replace(",",".",$_POST['fzhin']).",".str_Replace(",",".",$_POST['fzrueck']).",'".$_POST['anmerkung']."')");
                    echo $result;
                    }

这通常会回显任何结果(例如,在我得到的原始服务器上:资源 ID #136)。在这里我一无所获。

谁能帮我查一下问题吗?

好吧,这很简单...
存储数据库的文件夹仅对标准用户可读。 现在用户对该文件夹拥有 wright 权限,并且 odbc 连接可以写入数据库。

感谢克里斯·哈斯

虽然您的问题涉及对数据源文件的只读权限,但请考虑以下两个最佳做法:

  • 参数化以促进代码安全,尤其是 $POST 变量以及可读性和可维护性,无需混乱的变量连接或引号标点符号。 使用 odbc_prepare.

    odbc 库中支持参数
  • 使用 try/catch 进行错误处理以获得更多信息性错误或异常 answer

下面使用 MS Access 的 CDate() 并避免包含 # 的需要,并使用 PHP 的 floatval 转换数字类型的参数。根据需要调整未经测试的代码。

// ENSURE ERRORS RAISE AS EXCEPTIONS
set_error_handler(
    function($errno, $errstr, $errfile, $errline ) { 
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
);

// PREPARED STATEMENT WITH ? PLACEHOLDERS
$sql = "INSERT INTO Zeitkarten
          (BeginnTätigkeit, EndeTätigkeit, Mitarbeiter, Projekt, ArbeitscodeNr,
           datum, [Pause], AnzahlUeber, FZhin, FZrueck, Anmerkung) 
        VALUES (CDate(?), CDate(?), ?, ?, ?, CDate(?), ?, ?, ?, ?, ?)";

try { 
    // BIND PARAMS AND EXECUTE
    $stmt = odbc_prepare($con, $sql);
    $result = odbc_execute(
         $stmt, 
         array( 
             $_POST['kommen'],
             $_POST['gehen'], 
             $benutzer, 
             $_POST['projekt'], 
             $_POST['adt'], 
             $_POST['heute'],
             floatval(str_replace(",", ".", $_POST['pause'])),
             floatval(str_replace(",", ".", $_POST['ama'])),
             floatval(str_replace(",", ".", $_POST['fzhin'])),
             floatval(str_replace(",", ".", $_POST['fzrueck'])),
             $_POST['anmerkung']
         )
    ); 

    echo $result; 
} catch (Exception $e) { 
    // ECHO EXCEPTION MESSAGE
    echo $e->getMessage(); 
}