2010-09-21 7 views
1

Database Tableau company_infovaleur d'économie comme nom de variable dans la base de données

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

Database Tableau invoice_template

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

fichier PHP common_include.php

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

fichier PHP de 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 

SORTIE de invoice.php lorsque la compagnie est connecté pour eg.Company un

Header is $company 
Company is Company One 

Question: Comment puis-je obtenir la compagnie $ en la sortie à afficher en tant que société un? i.e Comment faire pour que la sortie de MySQL DB soit traitée comme une variable?

+1

Quel est le problème avec la ligne '$ header = FROM db ...' parce que cela devrait être invalide PHP ... – DisgruntledGoat

+0

@DisgruntledGoat. $ header = FROM DB .. n'est pas valide php, cela signifie simplement que je tire des données de DB. – abel

Répondre

2

La solution serait eval("echo $header"), bien que vous ne devriez jamais JAMAIS avoir recours à de telles solutions. Vous devriez, à mon avis, déplacer toutes les données relatives à l'entreprise dans la base de données.

Mettre à jour Vous ne devriez pas mettre $company dans votre base de données. Les bases de données relationnelles doivent être relationnelles. Cela signifie, les clés primaires et les clés étrangères. Les données devraient ensuite être recherchées par sa relation. Voir aussi comment un ORM fonctionnerait dans cette situation:

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

Merci pour la réponse. Je n'ai pas compris pourquoi je ne devrais pas faire ça? Les données de l'entreprise sont dans le db. le fichier ne le remplit que dans des variables, de sorte que l'application peut y accéder avec un include. Est-ce risqué? S'il vous plaît, expliquez. – abel

+0

et echo eval ($ header) peut fonctionner mais ne fonctionne pas dans ma configuration. parce que cette variable et d'autres sont dans une variable, utilisée pour afficher la facture en pdf. par exemple.La vraie chaîne est comme $ pdfcontent = <<< EOF html ...

$ header

... plus html EOF; . et j'utilise TCPDF. La sortie que j'ai maintenant est eval ($ comapny) – abel

+1

Comme je vous décourage toujours d'aller dans ce chemin, ce serait quelque chose comme '$ company = 'My Company'; $ which = '$ compagnie'; eval ("\ $ which = $ qui;"); echo $ qui; ' – bouke

1

Vous ne voulez pas faire cela. Vous ouvrez juste trop de vulnérabilités potentielles en mélangeant du code et des données comme ça - imaginez ce qui se passe lorsqu'un attaquant accède à votre base de données (directement ou par injection SQL) et met toutes sortes de code PHP dans cette colonne? En utilisant une seule vulnérabilité comme celle-ci, un attaquant pourrait être en mesure de prendre en charge l'ensemble du serveur. Ce que vous voulez est probablement une combinaison d'une structure de base de données appropriée, en utilisant des jointures pour rechercher des informations connexes en une seule fois, et peut-être un simple texte de recherche et remplacement (str_replace ou preg_replace) pour remplir des modèles de texte avec des données réelles .

+0

Merci. Je pourrais remplacer $ company par une pseudo-variable comme #company et ensuite preg_replace #company avec le nom actuel de l'entreprise. – abel

+0

Vous pouvez également utiliser '$ company', mais ne le donnez pas à' eval() 'ou à d'autres constructions maléfiques. De plus, 'str_replace()' fait le travail plus vite que 'preg_replace()', tant que vous n'avez besoin de rien de plus sophistiqué. – tdammers

1

Si $header est réglé sur la valeur de chaîne littérale $company et la $company variable est définie sur la chaîne Company One alors cela devrait fonctionner:

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

Cependant, comme d'autres l'ont dit, ce n'est pas une bonne idée, en particulier pour la sécurité.

+1

Comme je suis d'accord cette idée est aussi une idée laide, il ne serait pas comme ça. L'en-tête $ doit alors être défini sur la valeur de chaîne littérale 'company'. Sinon, php lance un avis: 'Undefined variable $ company'. Cela devrait fonctionner: '$ header = substr ($ header, 1); $ header = $$ header; echo $ header; '. Pourtant, c'est aussi laid que 'eval()'. – bouke

Questions connexes