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();
}
今天我需要一些关于 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();
}