0

我有这个有效的链接。

echo '<a href="?country=Estonia&from_language=Russian&into_language=Latvian&submitted=true&
page='.$x. '">'.$x.'</a> ';

但我需要将名词 Estonia、Russian 和 Latvian 替换为 $country、$from_language、$into_language 等标量变量。

我已经尝试了所有可能的点以及单引号和双引号的组合。我总是遇到语法错误。我不知道如何在那里嵌入变量。

有人知道吗?

谢谢你

4

6 回答 6

8

帮自己一个忙并使用http_build_queryDocs

<a href="?<?php echo http_build_query(array(
    'country' => $country,
    'fromLanguage' => $fromLanguage,
    'somethingElse' => $somethingElse,
    '...' => '...'
), '', '&amp;'); ?>">Link</a>
于 2012-06-05T08:15:56.557 回答
3

使用一些简单的东西,比如sprintfor printf

例如:

printf('<a href="?country=%s&from_language=%s&into_language=%s&submitted=true&
page=%s">%s</a>', $country, $fromLanguage, $toLanguage, $pageID, $dispText);

您还可以使用带双引号的编码之类的东西,例如:

echo "<a href=\"?country={$country}&from_language={$fromLanguage}&into_language={$toLanguage}&submitted=true&
    page={$pageID}\">{$dispText}</a>"
于 2012-06-05T08:14:07.790 回答
1

避免在不是非常简单的情况下将变量直接放入字符串中。改为使用连接,如果你想做出好的事情,请转义字符串:

echo '<a href="?country=' . htmlentities($country) . 
     '&from_language=' . htmlentities($from_language) . 
     '&into_language=' . htmlentities($into_language) . 
     '&submitted=true&page=' . intval($x) . '">' . htmlentities($x) . '</a> ';

无论如何,如果你真的想要复杂的方式,你必须考虑你需要双引号来表示 HTML 属性,但是需要双引号来包装 PHP 字符串,因为你想在其中放入变量。因此,您必须转义 HTML 双引号。尝试:

echo "<a href=\"?country={$country}&from_language={$from_language}&into_language={$into_language}&submitted=true&page=" . $x . '">' . $x . '</a> ';
于 2012-06-05T08:13:59.867 回答
1

结合 Corbin 和 KoolKabin 的答案为您提供了这个易于阅读的片段:

printf('<a href="%s">%s</a>',
       htmlspecialchars(
           http_build_query(array(
                                  'country' => $country,
                                  'from_language' => $from_language,
                                  'into_language' => $into_language,
                                  'submitted' => 'true',
                                  'page' => $x
                                  ))
                        ),
       htmlspecialchars($x));

参数化

printfsprintf对于向字符串添加参数非常有用。它们使添加转义值或复杂值变得容易,而不会使字符串本身不可读。通过第一个参数,您总是可以一目了然地看到它是什么字符串。

http_build_query也是一种参数化的方式,但是是针对查询字符串的。主要用途是您根本不需要关注查询字符串的语法。

逃跑

htmlspecialchars确保数据适合插入 HTML 代码。这类似于在 SQL 查询中转义以避免 SQL 注入,只是这里我们要避免 HTML 注入(也称为 XSS 或跨站脚本)。

http_build_query 将自动确保所有值都被转义以作为 URL插入浏览器的地址字段中。这并不能保证适合插入HTML 代码。因此查询字符串也需要 htmlspecialchars !

于 2012-06-05T08:23:07.310 回答
1

如果您编写脚本输出 HTML,请考虑配置参数分隔符的输出设置arg_separator.output

ini_set('arg_separator.output', '&amp;');

然后,您可以使用以下方法简单地创建 URI 查询信息路径http_build_query

$country = 'de';
$fromLanguage = 'en_EN';

?>

<a href="?<?php echo http_build_query(compact('country', 'fromLanguage')); ?>">Link</a>

这将为您提供一个完全有效编码的输出,它不受注入的影响:

<a href="?country=de&amp;fromLanguage=en_EN">Link</a>

完整演示

于 2012-06-06T11:10:07.130 回答
-1
$country = 'Estonia';
$from_language = 'Russian';
$into_language = 'Latvian';
echo '<a href="?country='.$country.'from_language='.$from_language.'&into_language='.$into_language.'&submitted=true&page='.$x. '">'.$x.'</a> ';

或者

echo "<a href=\"?country=$country&from_language=$from_language&into_language=$into_language&submitted=true&page=$x\">$x</a>";

或者

echo "<a href=\"?country={$country}&from_language={$from_language}&into_language={$into_language}&submitted=true&page={$x}\">{$x}</a>";
于 2012-06-05T08:14:46.590 回答