PHP在mysql表中存储$ obj->键以便在页面中使用

时间:2014-09-06 12:41:48

标签: php mysql loops pdo

我正在尝试使用preg_replace作为字母模板来生成带有动态内容的字母。我的概念是将模式存储在数据库中的任何对象引用中,这样我就可以构建我的模式并在运行时替换数组,而无需编写#34;硬编码"他们在页面中。以下是我正在使用的表格和代码:

**Table people
id || first || last**
1 || john || smith
2 || mark || stone

**Table address
Id || people_id || mailing1**
1 || 1 || 123 fake street
2 || 2 || 34 melrose place

**Table macros
id || pattern || replace**
1 || first || $people->first
2 || last || $people->last
3 || mailing1 || $address->mailing1

//Set variables
$thePerson = $_POST['people_id'];
$theString = '<p>Dear {first} {last},</p><p>I am writing regarding your home at {mailing1}</p>';
$replacements = array();
$patterns = array();
$counter = 0;
//Get people information
$peopleSQL = $conn_read->prepare('SELECT * FROM people WHERE people.id=:people_id;');
$peopleSQL->execute(array(':people_id' => $thePerson));
$people = $peopleSQL->fetch(PDO::FETCH_OBJ);
//Get address information
$addressSQL = $conn_read->prepare('SELECT * FROM address WHERE address.people_id=:people_id;');
$peopleSQL->execute(array(':people_id' => $thePerson));
$people = $peopleSQL->fetch(PDO::FETCH_OBJ);
//Build macros for preg_replace
$macrosSQL = $conn_read->prepare('SELECT * FROM macros;');
$macrosSQL->execute();
while ($macros = $macrosSQL->fetch(PDO::FETCH_OBJ)) {
    $patterns[$counter] = '/\{'.$macros->pattern.'\}/';
    $replacements[$counter] = $$macros->replace;
    $counter++;
}
echo preg_replace($patterns, $replacements, $theString);

对于输出,假设$ thePerson设置为1.我从此代码获得的输出是:

  

&#34;亲爱的$ people-&gt;第一个$ people-&gt; last,

     

我在$ address-&gt; mailing1&#34;

上写了关于你家的文章

期望的输出是:

  

&#34;亲爱的约翰史密斯,

     

我正在写一篇关于你家的故事,在假街#123;

我知道$ macro-&gt;替换是作为字符串从数据库出来并被视为这样,这就是为什么我看到我看到的结果,但我希望有一种方法可以处理这个,或者一些能给我想要的结果的语法。我所做的研究一直在调整eval()函数,但我根本不熟悉它,每个人都说不使用它。

由于我不知所措,提前感谢任何方向。此外,如果某人有完全不同的方式处理这个问题,我不仅仅是建议。

2 个答案:

答案 0 :(得分:1)

我建议你不要将任何对象引用存储在数据库中,因为你不需要它们:如果你不想做任何硬编码&# 39;为什么你想要存储对象引用,如果他们不会改变? - 我猜你每天都不会在你的对象中存储一个绝对不同的数据集,所以你可以在你的代码中修改它。

首先,你必须在一个数组中收集该人的所有数据,这对你来说应该不会太难。然后创建两个数组,用于搜索一个替换并使用str_replace($search, $replace, $string),因为您知道$theString中的每个键,并且您知道应该插入哪些数据。

$person = new person($_POST["people_id"]);    // I don't know if you know this kind of coding (OOP)... but you could also do your MySQL-queries to create an array storing all data you need
$theString = "<p>Dear {first} {last},</p><p>I am writing regarding your home at {mailing1}</p>";

$search = array(
    "{first}",
    "{last}",
    "{mailing1}",
);
$replace = array(
    $person->first,
    $person->last,
    $person->mailing1,
);

echo str_replace($search, $replace, $theString);

您可以做的是将$theString的值存储在数据库中,这样您就可以快速更改字母内容......

答案 1 :(得分:0)

这是一种更简单的方法。也许你需要更多的复杂性,但是对于这个例子你不需要。

$thePerson = $_POST['people_id'];
$theString = '<p>Dear {first} {last},</p><p>I am writing regarding your home at {mailing1}</p>';

$sql = $conn_read->prepare("
SELECT p.first AS `{first}`, p.last AS `{last}`, a.mailing1 AS `{mailing1}`
FROM people p
LEFT JOIN address a ON a.people_id = p.id
WHERE p.id = :people_id
");
$sql->execute(array(':people_id' => $thePerson));

$results = $sql->fetch(PDO::FETCH_ASSOC);

$output = str_replace(array_keys($results), array_values($results), $theString);

注意我完全避免使用宏表,只需将sql结果集的字段命名为需要替换的$theString值,并且只选择那些字段而不是{{1 }}。此外,由于它只是一个字符串替换而且不需要正则表达式,我将select *切换为更简单,更快preg_replace

在某些情况下,如果您有不相关的表,则可能需要使用两个查询。因此,您可以执行str_replace两次(如果您这样做,请务必使用str_replace作为第三个参数)。