【问题标题】:getRepository fails in foreach loop, Symfony2 DoctrinegetRepository 在 foreach 循环中失败,Symfony2 Doctrine
【发布时间】:2015-11-06 16:20:22
【问题描述】:

我的位置表中有两个条目,这是我得到的:

$em = $this->getDoctrine()->getManager($this->getUser()->getDbuser());
$locations = $em->getRepository('AppBundle:Location')->findAll();

现在我用 foreach 遍历所有内容:

$i = 1;
foreach ($locations as $location){

        $clientId = $location->getClient()->getId();
        $supplierId = $location->getSupplier()->getId();
        $companyId = $location->getCompany()->getId();

         echo $i.". Supplier<br />";
        $suppliers = $em->getRepository('AppBundle:Supplier')->find($supplierId);
        echo $this->get('global_functions')->decrypt($suppliers->getSupplierName())."<br /><br />";

        echo $i.". Company<br />";
        $companies = $em->getRepository('AppBundle:Company')->find($companyId);
        echo $this->get('global_functions')->decrypt($companies->getCompanyName())."<br /><br />";

        echo $i.". Client<br />";
        $clients = $em->getRepository('AppBundle:Client')->find($clientId);
        echo $this->get('global_functions')->decrypt($clients->getClientName())."<br /><br />";

       $i++;

    }

预期结果:

1. Supplier
SupplierX

1. Company
CompanyX

1. Client
ClientX

2. Supplier
SupplierY

2. Company
CompanyZ

2. Client
ClientA

实际结果:

1. Supplier
SupplierX

1. Company
CompanyX

1. Client
ClientX

2. Supplier
Warning: mdecrypt_generic(): An empty string was passed 

在这种情况下,$suppliers-&gt;getSupplierName() 是空的吗?

为什么会这样,为什么它适用于第一个循环?但是位置表中只有 2 个条目。

PS:我知道不建议将加密用作安全功能,但这是特别希望的!

感谢任何提示!

编辑:

我可能发现了导致这种情况的原因。解密其实就是这个函数:

public function decrypt($string) {
    $decrypter = new TripleDES(CRYPT_DES_MODE_ECB);
    $decrypter->setKey($this->container->getParameter('secure_token'));
    $decrytped_string = $decrypter->decrypt(stream_get_contents($string));

    return $decrytped_string;
}

我读到您需要在每次通话后关闭“stream_get_contents”,我该怎么做? fclose 不能工作,因为 $string 是数据库中的 blob 值。

【问题讨论】:

  • 我假设您仔细检查了数据库以确认第二个供应商有名称?
  • 嗯,是的,它实际上是同一个。所以它又是供应商X。其他人也一样。可能是这个问题吗?
  • 我看不出有同一个供应商会有什么问题。您所做的只是发布的代码正确吗?没有其他可能以某种方式改变供应商名称的事情吗?
  • 您明白所有这些存储库调用都是不必要的吗? $location->getSupplier()->getSupplierName() 将工作得很好,这要归功于延迟加载,假设您已经设置了关系。或者,也许您在 Repository::find() 中进行了一些额外的处理?
  • 我试过了,结果相同(它们与数据库相关)。但是,我似乎对另一个使用 crypt 库的项目也有同样的问题,我会更新我的帖子

标签: php symfony doctrine


【解决方案1】:

请考虑按预期使用 Doctrine:

$i = 1;
foreach ($locations as $location){

    $client = $location->getClient();
    $supplier = $location->getSupplier();
    $company = $location->getCompany();

    echo $i.". Supplier<br />";
    echo $this->get('global_functions')->decrypt($supplier->getName())."<br /><br />";

    echo $i.". Company<br />";
    echo $this->get('global_functions')->decrypt($company->getName())."<br /><br />";

    echo $i.". Client<br />";
    echo $this->get('global_functions')->decrypt($client->getName())."<br /><br />";

   $i++;

}

并使用数据库中的摘录更新问题,其中包含其他 3 个表中的位置和相关记录。

【讨论】:

  • 谢谢,看起来更流畅了,我改了,结果还是一样。请参阅更新的问题
  • 非常有趣的更新。我假设您的 get*Name 函数返回蒸汽,而不是字符串。用fclose($string);关闭它
  • 是的。 Doctrine 2 将 blob 转换为资源 (doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/…),因此我们正在处理资源。不确定 fclose 是否正确,我认为倒带可能是更好的选择。但是处理资源充其量是痛苦的。考虑为您的实体添加一个 getNameAsString 方法。
【解决方案2】:

好的,我开始工作了。

改变了

  $decrypted_string = $decrypter->decrypt(stream_get_contents($string));

  $decrypted_string = $decrypter->decrypt(stream_get_contents($string,-1,0));

来自 php.net 的更多信息:

string stream_get_contents ( resource $handle [, int $maxlength = -1 [, int $offset = -1 ]] )
偏移量(整数) 在读取之前寻找指定的偏移量。如果此数字为负数,则不会发生搜索,将从当前位置开始读取。

所以我只是从头开始阅读流。不确定这是否是它的工作原理,所以如果有更好的方法,我会留待进一步讨论。

我也试过了,但由于 $string 是资源,它不起作用:

 $stream = fopen('php://temp','r+');

    $decrypter = new AES(CRYPT_DES_MODE_ECB);
    $decrypter->setKey($this->container->getParameter('secure_token'));

    fwrite($stream, stream_get_contents($string));
    rewind($stream);
    $decrypted_string = $decrypter->decrypt(stream_get_contents($stream));
    fclose($stream);

    return $decrypted_string;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多