【发布时间】: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->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 库的项目也有同样的问题,我会更新我的帖子