在foreach循环中,getRepository失败,Symfony2 Doctrine

时间:2015-11-05 14:39:13

标签: php symfony doctrine

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

$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->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;
}

我读到你需要关闭&#34; stream_get_contents&#34;每次通话后,我该怎么做? fclose无法工作,因为$ string是数据库中的blob值。

2 个答案:

答案 0 :(得分:2)

请考虑按预期使用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个表中的位置和相关记录。

答案 1 :(得分:-1)

好的,我让它上班了。

更改

  $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;