Ampersand вызывает обрезание возвращаемого текста в URL
Я унаследовал несколько PHP-скриптов от человека, который занимался разработкой кода раньше. У него не было опыта программирования, и он в основном собирал все, что мог. сегодня мне пришлось переписать файл плагина для WordPress, и теперь я не могу понять, что происходит не так.
Проблема, с которой я сталкиваюсь, заключается в том, что при воспроизведении возвращенных имен файлов в операторе else, который является частью таблицы (<?php echo $result->display_name; ?>
) Я получаю неожиданные результаты. Допустим, в нашей базе данных есть файл 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&file_id=<?php echo $result->id; ?>&filename=<?php echo $display_name; ?>&assn_id=<?php echo $assn_id; ?>"><?php echo $display_name_fake; ?></a>
<?php
} else {
?>
<a href="renamefiles.php?action=rename&file_id=<?php echo $result->id; ?>&filename=<?php echo $display_name; ?>&assn_id=<?php echo $assn_id; ?>"><?php echo $result->display_name; ?></a>
<?php
}
?>
</td>
</tr>
<?php
}
echo "</table>";
}
}
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&file_id=<?php echo $result->id; ?>&filename=<?php echo $display_name; ?>&assn_id=<?php echo $assn_id; ?>"><?php echo $result->display_name; ?></a>
Должно быть так:
<a href="renamefiles.php?action=rename&file_id=<?php echo $result->id; ?>&filename=<?php echo urlencode($display_name;) ?>&assn_id=<?php echo $assn_id; ?>"><?php echo $result->display_name; ?></a>
Вам тогда нужно будет urldecode
$_GET['filename']
когда вы обрабатываете запрос.
Я бы посоветовал вам не иметь пробелов и специальных символов, таких как &
в вашем имени файла вообще (если вы на самом деле используете это имя в качестве имени файла файловой системы). Вы просите неприятностей.