【问题标题】:PHP Creating variables list from Mysql databasePHP从Mysql数据库创建变量列表
【发布时间】:2019-03-14 16:32:01
【问题描述】:

我有一个以这种方式使用 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];
  }
}

但是有些东西不好,这些变量如何生成?

【问题讨论】:

  • 您在第 5 行的 $lang 之后有一个不匹配的大括号。
  • 当您使用您发布的代码时会发生什么?
  • 如果您尝试像这样推出自己的本地化系统,您将度过一段非常糟糕的时光。使用Gettext 之类的东西,为自己省去很多未来的麻烦。
  • @Sammitch - 不过 Gettext 有一定的限制;您无法处理非常排序的字符串上的语言细微差别,例如 "save" 您的意思是 "enregistrer" (表单上的按钮)还是 " économisez"(节省 10%)...而且每次更改 .po 文件时都必须重新启动 Apache - 如果您在 Windows 机器上开发,您甚至可以让它工作。
  • 您可以尝试将{} 匹配

标签: php mysqli


【解决方案1】:

您的代码中有一个小的语法错误,这会导致错误。你需要做的是:

  1. 从数据库表中获取 nameal_sq 列。这是通过选择$lang 的值来完成的(基于您的代码)。出于安全原因,$lang 的值受到 SQL 注入保护,因为您没有指定值的来源。

  2. 然后你必须检查是否有任何结果,如果没有任何结果,它将简单地终止脚本并报错。

  3. 最后,您必须遍历返回结果的每一行,并进行变量变量赋值。这将使$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

【讨论】:

  • 是的,你明白我想要什么,但如果你能再次检查它会显示此错误:致命错误:未捕获错误:调用 /srv/users/serverpilot/ 中未定义的方法 mysqli_result::fetchAssoc() apps/testapp/public/lang.php:24 堆栈跟踪:#0 {main} 在第 24 行的 /srv/users/serverpilot/apps/testapp/public/lang.php 中抛出
  • 根据您的代码,我已将代码更改为: ${'lang' 。 $row['name']} = $row[$lang];现在正在工作,谢谢。
  • @AlbaStar 我有一个小错字(fetchAssoc() 应该是 fetch_assoc()),很高兴你让它工作了 \o/
【解决方案2】:

您似乎将数据库用作具有多个值字段的键值存储,具体取决于语言,您可以使用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 的值,请确保检查它是否是有效的列值。

【讨论】:

  • 通过使用此代码,作者必须将$conn 更改为PDO 的实例,而不是mysqli(如他的sn-p 中)
【解决方案3】:

根据您的数据库的呈现方式,这应该接近您想要的。如果存储的标题和积分更多,按比例放大会很笨重。

$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];
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2017-05-21
    • 2015-06-20
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多