2010-09-21 72 views
1

數據庫表company_info保存的值作爲數據庫

----------------------------- 
| companyname | companytype | 
----------------------------- 
| Company One | Blah  | 
----------------------------- 
| Company Two | Blah2  | 
----------------------------- 

數據庫表invoice_template

----------------------------- 
| Header  | bgcolor  | 
----------------------------- 
| $company | Red   | 
----------------------------- 
| $company | Biege  | 
----------------------------- 

PHP文件common_include.php變量名

$company = ... //FROM db table company_info field companyname 

PHP文件invoice.php invoice.php

include('common_include.php'); 
$header = ... //FROM db table invoice_template field header 
echo "Header is ". $header; 
echo "<br/>Company is ". $company; //$company is defined in common_include.php 

輸出,當公司登陸是eg.Company一個

Header is $company 
Company is Company One 

問:我如何獲得$公司輸出顯示爲公司之一?即如何將MySQL DB的輸出視爲變量?

+1

什麼是行'$ header = FROM db ...',因爲這應該是無效的PHP ... – DisgruntledGoat 2010-09-21 09:38:39

+0

@DisgruntledGoat。 $ header = FROM db ..不是有效的PHP,它只是意味着我從數據庫中提取數據。 – abel 2010-09-21 10:52:54

回答

2

解決辦法是eval("echo $header"),但你永遠也不會希望訴諸這樣的解決方案。您應該 - 在我看來 - 將所有與公司相關的數據移入數據庫。

更新 您不應該把$company放到您的數據庫中。關係數據庫應該是關係。這意味着主鍵和外鍵。數據應該通過它的關係來查找。還看到一個ORM會在這種情況下工作:

echo $invoice_template->getCompany()->getName(); 
+0

感謝您的回答。我不明白爲什麼我不應該這樣做?公司數據在數據庫中。該文件只會將其填充到變量中,以便應用程序可以使用include來訪問它。那有風險嗎?請解釋。 – abel 2010-09-21 09:25:02

+0

和echo eval($ header)可能會正常工作,但在我的設置中不起作用。因爲該變量和其他變量位於一個變量中,用於將發票顯示爲pdf。例如。真正的字符串就像$ pdfcontent = <<< EOF html ...

$ header

... more html EOF; 。我正在使用TCPDF。我現在得到的結果是eval($ comapny) – abel 2010-09-21 09:29:56

+1

因爲我仍然不鼓勵你走這條路,它會像'$ company ='我的公司'; $ which ='$ company'; eval(「\ $ which = $ which;」); echo $ which;' – bouke 2010-09-21 09:37:55

1

你不想這樣做。你只是開放了太多的混合代碼和數據的潛在漏洞 - 想象一下當攻擊者訪問數據庫(直接或通過SQL注入)並將各種瘋狂的PHP代碼放入該列時會發生什麼?僅使用這樣的單個漏洞,攻擊者可能能夠接管整個服務器。 你想要的可能是一個正確的數據庫結構,使用連接一次查詢相關信息,也許簡單的文本搜索和替換(使用str_replace或甚至preg_replace)來填充文本模板與實際數據。

+0

謝謝。我可以使用像#company這樣的僞變量替換$ company,然後用當前公司名稱替換​​preg_replace #company。 – abel 2010-09-21 09:35:09

+0

你也可以使用'$ company',只是不要把它提供給'eval()'或類似的邪惡的結構。另外,只要你不需要任何東西,'str_replace()'比'preg_replace()'做得更快。 – tdammers 2010-09-22 10:55:05

1

如果$header設置爲字符串值$company和可變$company被設置爲字符串Company One那麼這應該工作:

echo "Header is ". $$header; // outputs 'Header is Company One' 

然而,正如其他人所說,這不是一個好主意,特別是爲了安全。

+1

正如我同意這個想法也是一個醜陋的想法,它不會喜歡這個。 $ header應該被設置爲文本字符串值'company'。否則,PHP會發出通知:'Undefined variable $ company'。這應該工作:'$ header = substr($ header,1); $頭= $$報頭; echo $ header;'。儘管如此,這與eval()一樣醜陋。 – bouke 2010-09-21 09:46:41