$记录未传递值

时间:2019-02-27 22:48:16

标签: php return-value upgrade deprecated

自移植到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,没有错误

1 个答案:

答案 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错误。