我有一个数据库,它以这种方式使用3种语言:
id name de_de al_sq
1 title titel titulli
2 points punkte pike
现在在php中将$ lang设置为'al_sq':
$lang = 'al_sq';
在这种情况下,我正在尝试使用该语言的名称生成变量:
$langtitle = 'titulli';
$langpoints = 'pike';
尝试类似的事情:
$sql = "SELECT * FROM `langs`";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$lang{$row["lang"]} = $row[$lang];
}
}
但是有些不好,如何生成这些变量?
答案 0 :(得分:1)
似乎您将数据库用作具有多个值字段的键值存储,具体取决于语言,您可以使用PDO::FETCH_KEY_PAIR
,以便它返回名称为键的数组。这样,您还可以避免加载可能根本不需要的其他语言的数据:
$query = "SELECT `name`, :column as value FROM `langs`";
$statement = $pdo->prepare($query);
$statement->execute(["column" => $lang]);
$data = $statement->fetchAll(\PDO::FETCH_KEY_PAIR);
// $data becomes an array with the name as the key:
$langtitle = $data['title'];
$langpoints = $data['points'];
如果用户提供了$lang
的值,请确保它是有效的列值。
答案 1 :(得分:1)
根据数据库的显示方式,这应该接近您想要的内容。如果存储更多的标题和点,则按比例放大将很麻烦。
$lang = 'al_sq';
$sql = "SELECT $lang FROM 'langs'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$langtitle = $row[1];
$langpoints = $row[2];
}
}
答案 2 :(得分:1)
您的代码中有一个较小的语法错误,这会导致错误。您需要在这里执行以下操作:
从数据库表中获取name
和al_sq
列。这可以通过选择$lang
的值(基于您的代码)来完成。出于安全原因,$lang
的值可防止SQL注入,因为您没有指定值的来源。
然后,您必须检查是否有任何结果,并且在没有结果的情况下,它只会以错误终止脚本。
最后,您必须遍历返回结果的每一行,并进行变量变量分配。这将使$langpoints
等(以及将来可能添加的其他任何参数)正常工作。
代码:
$sql = 'SELECT `name`, `' . $conn->real_escape_string($lang) . '` FROM `langs`';
$result = $conn->query($sql);
if (!$result || !$result->num_rows) {
echo 'Invalid language selected';
exit;
}
while ($phrase = $result->fetch_assoc()) {
${'lang' . $phrase['name']} = $phrase[$lang];
}
// $langtitle
// $langpoints