自移植到PHP7.1以来,“ $ record”不再写入数据库。
它仍在向索引添加+1记录,但没有将实际信息写入文件名file.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,没有错误
答案 0 :(得分:0)
bin2dec
方法定义为:
function bin2dec(&$str, $len)
因此,第一个参数声明为参考变量。这意味着在调用它时,相应的参数必须是可以更新的变量。却被这样称呼:
return $this->bin2dec(fread($fp, 4), 4);
当函数参数是引用变量时,不能使用函数调用作为参数,因为没有变量可供引用。
实际上没有理由为什么bin2dec()
的第一个参数需要引用,因为该函数从不修改它。将函数定义更改为:
function bin2dec($str, $len)
FFDB似乎有很多不必要的参考变量和函数参数。这是很旧的代码(已有16年的历史了),也许在PHP的早期版本中,这对于防止不必要的复制很有用。 PHP已经使用写时复制已有很多年了,因此不再需要为此目的使用引用。
我编辑了ffdb.inc.php
,并用&$
替换了所有$
,除了:
function add(&$record)
FFDB_INT_AUTOINC
列似乎需要这样做,在存储时会在$record
中对其进行修改。
这样做之后,我没有遇到任何Only variables should be passed by reference
错误。