#php
#php
Вопрос:
Итак, я здесь пытаюсь больше изучить php и … пытаюсь добавить изображение, которое пользователь будет загружать (аватар) на сервер через move_uploaded_file … о, и я сейчас на WAMP, к вашему сведению.
я читаю книгу…короче говоря, показанный пример не работает. Я погуглил и буквально скопировал несколько подходящих примеров, которые я нашел и до сих пор….ну, чтобы было ясно, независимо от того, написал ли я это или из сети, я могу загрузить имя изображения (вместе с другими значениями) в таблицы в БД, которые я настроил, но само изображение не перемещается в каталог, который я для него настроил.
Я удалил весь код своих приложений в простую таблицу и простой php, чтобы убедиться, что ничего не конфликтует и т.д., И все равно нада.
вот мой html:
<form method="post" action="testUpload.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="32768" >
<table summary="guitarwars lesson" width="500">
<tr>
<td>load picture:</td>
<td><input type="file" name="screenshot" id="screenshot" ></td>
</tr>
<tr>
<td><input type="submit" name="submit" action="submit"></td>
</tr>
</table>
</form>
вот мой php:
<?php
$screenshot = $_FILES['screenshot']['name'];
//$destination = "images/user_avatars/$screenshot";
$insertValues = "INSERT INTO testdb(screenshot) VALUES ('$screenshot')";
//---declare connection.
$connect2db = mysqli_connect('127.0.0.1','root','pass','dbname');
if(!$connect2db){
die("Sorry but theres a connection to database error" . mysqli_error);
} else {
//pg intro mssg
echo ' <span style="font-size:25px; color:green;"> --- Link Established with Database ---.<span/><br/><br/>';
}
// put into db.
if(!empty($screenshot)) {
$insertData = mysqli_query($connect2db, $insertValues);
echo 'data submitted. thank you';
move_uploaded_file ($_FILES['screenshot']['tmp_name'],"images/user_avatars/{$screenshot}");
echo 'IMAGE UPLOAD COMPLETE';
}
mysqli_close($connect2db);
?>
теперь я не получаю ошибку … я на самом деле получаю часть echo «загрузка изображения завершена»…
и, как я уже сказал, с помощью кода приложения я получаю несколько значений И имя изображения, которое проходит и сохраняется в БД, но само изображение, перемещаемое из temp в мое местоположение, не работает.
любые ссылки на советы и т.д., Которые я с радостью ценю. Заранее благодарю вас.
Комментарии:
1. Есть ли каталог, вызываемый
images
в том же каталоге, что и ваш скрипт, и есть ли каталог, вызываемыйuser_avatars
в этом каталоге изображений? PHP не будет создавать каталоги для вас…
Ответ №1:
Если это код из вашей книги, тогда выбросьте книгу и сожгите ее как можно быстрее.
а) Вы широко открыты для атак с использованием SQL-инъекций. Любой приличный учебник по PHP, который показывает, как работать с базами данных, должен начинаться со стратегий смягчения атак с использованием sql-инъекций.
б) В вашей ошибке с ошибкой подключения используется mysqli_error
, которая является неопределенной константой. Вы, вероятно, хотите mysqli_error()
, что является вызовом функции
c) Код предполагает, что загрузка завершена успешно. Загрузка может завершиться ошибкой в любой момент, поэтому отсутствие проверки на наличие ошибок — это быстрый путь к выдергиванию волос. Как минимум скрипт должен иметь что-то вроде
if ($_FILES['screenshot']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES['screenshot']['error']);
}
Эти коды ошибок определены здесь.
d) Ваш код использует предоставленное пользователем имя файла для сохранения файла на сервере. Ничто не говорит о том, что злоумышленник не может взломать имя файла, чтобы включить информацию о пути, поэтому ваш код фактически позволяет этому неприятному пользователю нацарапать ЛЮБОЙ файл на вашем сервере, к которому процесс веб-сервера имеет доступ на запись. Это ПЛОХО
e) Ваш код также предполагает, что перемещение файла прошло успешно, без проверки на наличие ошибок. Это должно быть в mininum
$status = move_uploaded_file(...);
if (!$status) {
die("Move failed!");
}
или что-то подобное.
f) Ваш код предполагает, что все запросы к базе данных выполнены успешно. Даже если ваша строка запроса сформирована на 100% идеально (у вас это не так, см. (a) выше), запросы могут завершаться ошибкой по ряду других причин. В bare mininum у вас должно быть:
$result = mysql_query(...) or die(mysqli_error());
Комментарии:
1. отличный совет. я только начал с этого около месяца назад, пытаясь освоить трудный путь. Спасибо
2. Отличный глаз! Самый достаточный ответ, о котором можно подумать.
Ответ №2:
Для начала вы могли бы добавить
if(!move_uploaded_file(...))
die('error');
Комментарии:
1. Другой распространенной проблемой может быть папка, недоступная для записи. Часто пользователь веб-сервера не является пользователем для загрузки по ftp.
Ответ №3:
если вы замените
move_uploaded_file ($_FILES['screenshot']['tmp_name'],"images/user_avatars/{$screenshot}");
echo 'IMAGE UPLOAD COMPLETE';
с
if (move_uploaded_file ($_FILES['screenshot']['tmp_name'],"images/user_avatars/{$screenshot}")) {
echo 'IMAGE UPLOAD COMPLETE';
}
затем вы получите echo, если оно было успешным
Комментарии:
1. ваш скриншот больше 32 Кб?
Ответ №4:
Попробуйте указать абсолютный путь:
move_uploaded_file ($_FILES['screenshot']['tmp_name'],"/path/to/images/user_avatars/{$screenshot}");
Комментарии:
1. «Сделайте свой код непереносимым, тогда вы сможете решить свою насущную проблему, но создайте больше, чтобы потом развлекать себя».
2. Вы всегда можете настроить абсолютный путь. Даже подключение к MySQL настраивается.
3. Конечно, но если вы сделаете все относительным и ваши пути будут работать должным образом, вам не нужно беспокоиться…