2010-09-21 67 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