我正在为一个委员会拼凑一个网站,我已经采用了一个iso框模板,现在我想从json文件中生成个人资料卡片。但是当我加载页面时,php无法生成卡片,但据我所知,它没有明显的错误。
<?php
$json = json_decode(file_get_contents("data/committee.json"), true);
if ($json !== false) {
foreach ($json as $officer => $content) {
$role = $content["role"];
$name = $content["name"];
$tags = $content["tags"];
echo "<div class='iso-box $tags col-md-3 col-sm-3'>";
echo "<div class='portfolio-thumb'>";
echo "<img src=\"files/committee_pictures/$role.jpg\" class='img-responsive' alt='Portfolio'>";
echo "<div class='portfolio-overlay'>";
echo "<div class='portfolio-item'>";
echo "<a href=mailto:$role.@website.co.uk><i class='fa fa-envelope'></i></a>";
echo "<h2>$officer</h2>";
echo "<p> $name </p>";
echo "</div>";
echo "</div>";
echo "</div>";
echo "</div>";
}
}
?>
答案 0 :(得分:0)
but there are no obvious errors
- 是的,因为您的代码会主动尝试隐藏/忽略错误。尝试而不是隐藏错误,每当发生错误时抛出异常,这样的代码更容易调试,错误不会无声地传播(正如当前代码所发生的那样),并且错误会尽早被捕获,如下所示:
<?php
$json = json_decode ( file_get_contents ( "data/committee.json" ), true );
if (empty ( $json )) {
throw new \RuntimeException ( 'failed to parse the json!: ' . json_last_error () . ': ' . json_last_error_msg () );
}
foreach ( $json as $officer => $content ) {
foreach ( array (
'role',
'name',
'tags'
) as $required ) {
if (! array_key_exists ( $required, $content )) {
throw new \Exception ( 'invalid data! officer missing ' . $required );
}
${$required} = $content [$required];
}
echo "<div class='iso-box $tags col-md-3 col-sm-3'>";
echo "<div class='portfolio-thumb'>";
echo "<img src=\"files/committee_pictures/$role.jpg\" class='img-responsive' alt='Portfolio'>";
echo "<div class='portfolio-overlay'>";
echo "<div class='portfolio-item'>";
echo "<a href=mailto:$role.@website.co.uk><i class='fa fa-envelope'></i></a>";
echo "<h2>$officer</h2>";
echo "<p> $name </p>";
echo "</div>";
echo "</div>";
echo "</div>";
echo "</div>";
}
编辑:你明显在这里构建HTML,除非角色,名称和标签已经在json中进行了html编码,你应该在将它们放入html之前对它们进行html编码,这样可以防止黑客试图通过$ name(或任何其他变量)注入代码,并防止标记意外包含HTML中具有特殊含义的字符,例如:
function tohtml(string $str): string {
return htmlentities ( $str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true );
}
...
${$required}=tohtml($content[$required]);
答案 1 :(得分:-1)
除非你故意让他们这样做,否则Javascript和PHP很难进行交互。
PHP始终将在服务器端执行,并且在PHP完成后,通常会在客户端处理Javascript。
如果你在这里没有看到PHP的任何结果,那么你的PHP代码肯定是错误的。
我建议您将$json
和$json !== false
作为文字进行排查。这个变量肯定是空的,假的,或者没有按你认为的那样格式化,当你试图循环它时会导致错误。
你还应该弄清楚你的PHP /服务器日志的保存位置,因为那里会输出任何错误。