自从迁移到PHP7.1以来,“$ record”不再写入db。
它仍在向索引添加+1记录,但它不会将实际信息写入文件namefile.dat。
namefile.dat权限设置为644,但文件仍然返回空,没有数据。
if (!$db->open("../namefile")) {
$schema = array(
array("key", FFDB_INT, "key"),
array("nname", FFDB_STRING),
array("desc", FFDB_STRING),
array("daya", FFDB_INT),
array("yeara", FFDB_INT)
);
// Try and create it...
if (!$db->create("namefile", $schema)) {
echo "Error creating database\n";
return;
}
}
$record["key"] = $data;
$record["nname"] = ucwords($datana);
$record["desc"] = $desc;
list($record["daya"]) = sscanf($daya, "%d"); // string -> int
list($record["yeara"]) = sscanf($yeara, "%d"); // string -> int
有任何想法吗?因为我尝试更改为$ _POST强制它....
$record["key"] = $_POST[$data];
$record["nname"] = ucwords($_POST["$datana"]);
$record["desc"] = $_POST["$desc"];
list($record["daya"]) = sscanf($_POST["$daya", "%d"]);
list($record["yeara"]) = sscanf($_POST["$yeara", "%d"]);
....但仍未能将值写入文件。
有什么建议?
谢谢
编辑
错误日志指向这两个函数 -
function read_byte($fp) {
return $this->bin2dec(fread($fp, 1), 1);
}
function read_str($fp) {
$strlen = $this->bin2dec(fread($fp, 4), 4);
return fread($fp, $strlen);
}
注意:bin2dec就像bindec一样工作,没有错误
bin2dec
方法定义为:
function bin2dec(&$str, $len)
因此,第一个参数被声明为引用变量。这意味着当您调用它时,相应的参数必须是可以更新的变量。但它被称为这样:
return $this->bin2dec(fread($fp, 4), 4);
当函数参数是引用变量时,不能使用函数调用作为参数,因为它没有可供引用的变量。
实际上没有理由为什么bin2dec()
的第一个参数需要作为参考,因为函数永远不会修改它。将函数定义更改为:
function bin2dec($str, $len)
FFDB似乎有很多不必要的引用变量和函数参数。它是相当古老的代码(超过16年),也许在早期版本的PHP中,这对于防止不必要的复制很有用。 PHP多年来一直使用copy-on-write,因此不再需要为此目的使用引用。
我编辑了ffdb.inc.php
并用&$
替换了所有$
,除了:
function add(&$record)
这似乎需要FFDB_INT_AUTOINC
列,在存储时在$record
中进行了修改。
这样做后,我没有得到任何Only variables should be passed by reference
错误。