我的位置表中有两个条目,我得到了这个:
$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值。
答案 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;