如何将数据库获取的name变量传入Facebook og:description标签?
咱们一步步拆解问题,先从代码本身的细节入手,再结合Facebook爬虫的特性来解决:
1. 先修复PHP语法错误
你的代码里漏掉了两个关键的闭合大括号——if($result)和if($count==1)的结尾},这会导致PHP解析失败,后续的echo $name根本不会执行。先把语法补全,同时优化代码逻辑:
<?php // 先处理passkey为空的情况,避免"未定义索引"报错 $passkey = $_GET['passkey'] ?? ''; $tbl_name1 = "temp"; // 给name设置默认值,防止找不到对应记录时变量未定义 $name = "Guest"; // 用预处理语句避免SQL注入,这是必须的安全操作! $sql = "SELECT name FROM $tbl_name1 WHERE confirm_code = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $passkey); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if($result){ $count = mysqli_num_rows($result); if($count == 1){ $rows = mysqli_fetch_array($result); $name = $rows['name']; } } // 现在所有代码块都正确闭合了 ?> <meta property="og:description" content="My sample description with variable - <?php echo htmlspecialchars($name, ENT_QUOTES); ?>" />
2. 处理变量未定义与特殊字符转义
如果passkey无效或者数据库里找不到对应记录,$name会处于未定义状态,这会触发PHP警告,虽然浏览器可能不显示,但Facebook爬虫可能会忽略有语法错误的标签内容。提前给$name设默认值就能避免这个问题。
另外,用htmlspecialchars()转义输出内容,防止$name里的引号、&等特殊字符破坏meta标签的语法结构。
3. 先验证页面实际输出
别只依赖Facebook调试器,先直接访问你的链接example.com/confirm?passkey=eb35700460247fe469efd524a6a276e4,查看页面源代码,确认og:description里已经正确输出了$name的值。如果源代码里都没有,那问题出在PHP逻辑上,和Facebook无关。
4. 强制Facebook调试器重新抓取
Facebook调试器会缓存页面内容,哪怕你已经修复了代码,它可能还是显示旧结果。进入调试器页面后,点击Scrape Again按钮,让它重新获取最新的页面内容。
额外提醒:SQL注入风险
你原来的代码直接把$_GET['passkey']拼进SQL语句里,存在严重的SQL注入漏洞,上面的代码已经用预处理语句修复了这个问题,一定要坚持用这种写法保护数据库安全。
按照上面的步骤修改后,$name应该就能正确显示在og:description标签里了。
内容的提问来源于stack exchange,提问作者MMPL1

