Я постараюсь объяснить это как можно лучше:
У меня есть страница загрузки. Пользователь вставляет или перетаскивает файл кода и загружает его в свой каталог пользователя. Прежде чем загружать, они должны выбрать какой это язык через выпадающее меню. Это значение выбора добавляется к файлу и добавляется случайная строка. Итак, если они вставят немного Java и нажмут кнопку «загрузить», файл будет
java-iVW827pVjEEo.txt
Эта часть прекрасно работает.
У меня есть другая страница, show_file.php, которая отображает содержимое этого файла в том же красиво отформатированном и выделенном синтаксисе виде. НО если работает, только если я вручную ввожу имя файла. Проблема возникает на странице профиля пользователя. Файлы отображаются в профиле пользователя следующим образом (я перехожу к заголовкам позже. Просто нужно, чтобы эта часть работала):
Это делается через цикл foreach:
foreach($files as $file) {
echo '<a href="'.$link.'">'.basename($file).'</a><br/>';
}
Вот как это отображается на странице show_file.php:
Подсветка синтаксиса определяется по первой части имени файла. Какой бы язык ни был в строке, он будет добавлен к имени класса Prism.js:
$user_file = "java-NGEw5X8s0W2Q.txt"; //<-- Have to enter it manually right now
$file = fopen("users/$username/code_uploads/$user_file", "r");
switch(true) {
case strpos((string)$file, 'markup'):
$language = 'markup';
break;
case strpos((string)$file, 'java'):
$language = 'java';
break;
//18 other cases follow
И, наконец, вот код для отображения div. Он получает содержимое файла, затем добавляет переменную $ language к классу, как показано здесь:
<div class="container">
<div class="show-code">
<script src="lib/prism.js"></script> <!-- Load prism.js library -->
<pre><code class="language-<?php echo $language?>"><?php while(! feof($file)) {echo fgets($file);}?></code></pre>
</div>
</div>
Честно говоря, я не знаю, как связать путь к файлу на странице профиля пользователя с путем к файлу, который используется в show_file.php. Я попытался присвоить переменную $ file переменной $ _SESSION [‘file’], а затем использовать ее на странице show_file, но получаю ошибку «Undefined Index».
Я попытался отредактировать цикл for и привязку тега так
foreach($files as $file) {
//echo '<a href="'.$link.'">'.basename($file).'</a><br/>';
echo '<a href="show_file.php?id=<?php echo $file->id;?>">'.basename($file).'</a><br/>';
}
и присвоение моей переменной $ user_file с помощью
$user_file = $_GET['id'],
но теперь я получаю
Warning: fopen(users/testUser/code_uploads/<?php echo $file->id;?>): failed to open stream: No such file or directory
Что я могу сделать, чтобы связать свои теги привязки с соответствующими файлами?
Благодарю.
Посмотрите, работает ли это 🙂
foreach ($files as $file) {
//echo '<a href="'.$link.'">'.basename($file).'</a><br/>';
echo '<a href="show_file.php?id=' . $file->id . '">' . basename($file) . '</a><br/>';
}
Похоже, что добавление тегов php в оператор echo приводит к проблеме. Дай мне знать!
ОБНОВИТЬ:
Итак, первоначальная ошибка исчезла, но есть проблема в другом месте. Трудно понять, что здесь происходит, просто по фрагментам. Но если вы используете $ _GET для прохождения имени файла (‘id’), это должно поднять его на странице, на которую оно отправлено:
$user_file = $_GET['id']; // There was a comma here previously for some reason instead of semi-colon. Assuming this is an array. If not you can just echo the contents.
print_r($user_file); // This will show you if you have actually received the data. If you have:
foreach ($user_file as $file) {
echo '<a href="show_file.php?id=' . $file . '">' . basename($file) . '</a><br/>';
}
Других решений пока нет …