【问题标题】:$record not passing the value$record 没有传递值
【发布时间】:2019-02-27 22:48:15
【问题描述】:

自从迁移到 PHP7.1 后,“$record”不再写入数据库。

它仍在向索引中添加 +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 类似,没有错误

【问题讨论】:

  • 你之前用的是哪个版本?
  • $db的类是什么?
  • 这是Flat File Database吗?
  • PHP5.6,一切都很好。但是为了对这种情况造成更大的破坏,我还迁移到了新服务器。 Phpcodechecker.com 没有指责原始脚本有任何错误
  • 是的,平面文件 db....它非常适合我的场景

标签: php return-value upgrade deprecated


【解决方案1】:

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

【讨论】:

  • 它没有这样做,它使错误数量增加了两倍。但后来我注意到错误实际上是在 read_byte 和 read_str 而不是 write_byte 或 wirte_str 的函数上 - 所以它在技术上只是没有写入文件。并且错误又回来了,我猜这里,因为它试图读取文件并且索引显示 1 但数据库是空的......我有什么意义吗?好吧,我得走了,我去接我爸要迟到了。谢谢巴尔玛。如果你明天回来,我不介意....我会尽量减少;)
  • 如果只是打印通知,代码应该仍然可以工作。当我使用带有引用参数的函数调用时,我会收到通知,但如果我使用文字,则会出现致命错误。 FFDB 不使用任何会导致致命错误的文字。
  • 嗨,Barmar,我做了更改,谢谢。可惜还是一无所获。实际上,将 &$ 替换为 $ 后没有输出错误,但值仍然没有通过。我做了最小的,1个单场,最基本的一个,但仍然没有通过。所以我只是打开了一张故障单来检查服务器,也许某处不允许写入文件并绕过我的 644 权限。我什至尝试更改为 666 但仍然没有,我会用我打开的故障单通知你。再次感谢巴尔玛!
  • 在更新$record 后,您是否在呼叫$db->add()?当您只修改变量时,不会自动写入数据库。
  • 使用这款平板 4 4ever,工作时它都在同一个地方。但话虽如此,在最小测试期间,我放置了 2 个回声 - 之前和之后 - 它完美地在屏幕上回显,只是没有写入文件。此外,脚本有一个 echo if (!$db->add($record)) echo("failed!\n");如果记录不是默认写入,则通知错误,并且 echo 根本不回显。同样,它验证了我的理论,即脚本的行为就像它正在添加一样,因为它正在向索引添加 +1,但实际上并没有写入,因为某些东西阻止了写入该文件。
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2013-02-06
相关资源
最近更新 更多