所以我在这里试图学习更多的PHP和...试图通过move_uploaded_file添加用户将上传的图像(一个头像)到服务器...哦,我现在在WAMP上即可。
这本书正在阅读...长话短说,显示的例子不起作用。我用谷歌搜索并逐字复制粘贴了一些相关的例子我发现仍然....好清楚,无论是我写它还是从网上,我可以上传图像名称(以及其他值)到表格上我已经设置了db,但图像本身并没有移动到我为它设置的目录。
我已将我的所有应用程序代码删除到一个简单的表格和简单的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);
?>
现在我没有收到错误...我实际上得到回声“图像上传完成”部分... 就像我说的,使用应用程序代码,我得到多个值和图像名称通过并保存到数据库,但图像本身从临时移动到我的位置是不行。
任何提示链接等我很高兴欣赏。 提前谢谢。
答案 0 :(得分:4)
如果这是您书中的代码,那么请将书扔出去并尽快刻录。
a)你对SQL injection attacks持开放态度。任何体面的PHP教程都展示了如何处理数据库应该以sql注入攻击缓解策略开始。
b)您的连接失败错误使用mysqli_error
,这是一个未定义的常量。您可能需要mysqli_error()
,这是一个函数调用
c)代码假定上传成功完成。上传可以/将会失败,所以不检查错误是快速通向拔毛的道路。至少脚本应该有类似
的东西if ($_FILES['screenshot']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES['screenshot']['error']);
}
定义了这些错误代码here。
d)您的代码使用用户提供的文件名将文件存储到服务器上。没有任何东西说恶意用户不能破解文件名以包含路径信息,所以你的代码实际上允许那个讨厌的用户在服务器上的任何文件上乱写,webserver进程具有写入权限。这是 BAD
e)您的代码还假定文件移动成功,而不检查错误。它应该在最小值
$status = move_uploaded_file(...);
if (!$status) {
die("Move failed!");
}
或类似的东西。
f)您的代码假定所有数据库查询都成功。即使您的查询字符串是100%完美形成的(您的查询字符串不是,请参见上面的(a)),查询可能会因任何其他原因而失败。在最低限度你应该:
$result = mysql_query(...) or die(mysqli_error());
答案 1 :(得分:3)
首先,您可以添加
if(!move_uploaded_file(...))
die('error');
答案 2 :(得分:2)
如果你更换
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';
}
如果成功,你会得到回声
答案 3 :(得分:0)
尝试提供绝对路径:
move_uploaded_file ($_FILES['screenshot']['tmp_name'],"/path/to/images/user_avatars/{$screenshot}");