0

我从之前维护代码的人那里继承了几个 php 脚本。他没有编程经验,而且大部分时间都尽可能地把东西放在一起。今天我不得不为wordpress重写一个插件文件,现在我不知道出了什么问题。

我面临的问题是,在作为表 ( <?php echo $result->display_name; ?>) 一部分的 else 语句中显示返回的文件名时,我得到了意想不到的结果。假设我们的数据库有一个名为 Black & White.pdf 的文件。它没有返回 display_name “Black & White.pdf”,而是返回“Black”。我尝试了以下方法:

<?php echo htmlentities($result->display_name); ?>

<?php echo htmlspecialchars($result->display_name); ?>

两者都没有产生预期的结果。出了什么问题?这是我对 PHP 的无知,还是这与 WP 如何返回结果有关(我认为这不会产生影响,因为我不相信 WP 可以改变 php 的解析方式)。以下是代码供参考:

function display_files($assn_id) {
    global $wpdb;
    $second_db = new wpdb("xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx");

    $results = $second_db->get_results("SELECT
        community_files.id,
        community_files.display_name,
        community_files.filename,
        community_files.sort,
        community_files.file_type
        FROM
        community_files
        WHERE
        community_files.comm_id = '".$assn_id."'
        ORDER BY
        community_files.sort ASC");

        if (!$results) {
            echo "<li>The next meeting has not been posted yet.</li>";
        } else {

            echo "<table>";
            // keeps getting the next row until there are no more to get

            foreach ($results as $result) {
                if (!$result->display_name) {
                    $display_name = str_replace("_", " ", $result->filename);
                    $display_name_fake = str_replace(" .", ".", $display_name);
                    $file_array[$x] = $result->id;
                } else {
                    $display_name = $result->display_name;
                    $display_name_fake = str_replace(" .", ".", $display_name);
                    $file_array[$x] = $result->id;
                } ?>
                    <tr>
                        <td>
                        <?php
                        if ($result->display_name == "") {
                        ?>
                            <a href="renamefiles.php?action=rename&amp;file_id=<?php echo $result->id; ?>&amp;filename=<?php echo $display_name; ?>&amp;assn_id=<?php echo $assn_id; ?>"><?php echo $display_name_fake; ?></a>
                        <?php
                        } else {
                        ?>
                            <a href="renamefiles.php?action=rename&amp;file_id=<?php echo $result->id; ?>&amp;filename=<?php echo $display_name; ?>&amp;assn_id=<?php echo $assn_id; ?>"><?php echo $result->display_name; ?></a>
                        <?php
                        }
                        ?>
                        </td>
                    </tr>
                <?php   
            }
            echo "</table>";
        }
}
4

1 回答 1

1

urlencode当您将它插入到您正在构建的 URL 中时,听起来您需要该文件名。根据上面的评论,不这样做会破坏你的GET字符串。

array(5) { 
  ["action"]=> string(6) "rename" 
  ["file_id"]=> string(5) "24086" 
  ["filename"]=> string(8) "Black " 
  ["White_pdf"]=> string(0) "" 
  ["assn_id"]=> string(2) "25" 
}

这导致您得出结论,您发布的代码失败了。它不是。它只是在构建格式错误的 HTML,然后当您单击类似内容时会失败。

这段代码:

<a href="renamefiles.php?action=rename&amp;file_id=<?php echo $result->id; ?>&amp;filename=<?php echo $display_name; ?>&amp;assn_id=<?php echo $assn_id; ?>"><?php echo $result->display_name; ?></a>

应该是这样的:

<a href="renamefiles.php?action=rename&amp;file_id=<?php echo $result->id; ?>&amp;filename=<?php echo urlencode($display_name;) ?>&amp;assn_id=<?php echo $assn_id; ?>"><?php echo $result->display_name; ?></a>

然后,您在处理请求时需要这样做。urldecode $_GET['filename']

我建议您不要&在文件名中使用空格和特殊字符(如果您实际上将此名称用作文件系统文件名)。你是在自找麻烦。

于 2013-01-28T23:49:02.363 回答