2011-05-05 128 views
0

我有以下代码注册新用户,他们的照片上传改名并移动到一个文件夹,但我不断收到错误,说照片是不确定的,我认为这一定是一个(愚蠢的)问题与我形式,即时通讯失踪,但我已经步进尽管我的代码可重复,并不能解决这个问题。PHP文件上传问题

<?php 
include 'includes/config.inc.php'; 
//error_reporting(0); 

$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
mysql_select_db($dbname); 

echo '<center> 
    <form name="login" action="register.php" method="post"> 
     Username: <input type="text" name="username"/><br> 
     Password: <input type="password" name="password"/><br> 
     Email: <input type="text" name="email"/><br> 
     First Name: <input type="text" name="firstname"/><br> 
     Last Name: <input type="text" name="lastname"/><br> 
     Photo: <input type="file" name="photo" id="photo"/><br> 
     <small>Files must be; PNG, JPEG, JPG</small> 
     <input type="submit" value="Register"/> 
     <input type="hidden" name="submitted" value="1"> 
     </form> 
     <br> 
     <br> 

     '; 
if (isset($_POST['submitted'])){ 
if ($_POST['submitted']==1) { 
    if (is_string($_POST['username'])) { 
     $username = $_POST['username']; 
     $username = mysql_real_escape_string($username); 
     } 
    else 
    { 
     echo 'Please enter a valid username<br>'; 
    } 
    if ($_POST['password']) { 
     $password = md5($_POST['password']); 
    } 
    else 
    { 
     echo 'Please enter a valid password<br>'; 
    } 
    if (is_string($_POST['firstname'])) { 
     $firstname = $_POST['firstname']; 
     $firstname = mysql_real_escape_string($firstname); 
    } 
    else 
    { 
     echo 'Please enter a valid realname<br>'; 
    } 
     if (is_string($_POST['lastname'])) { 
     $lastname = $_POST['lastname']; 
     $lastname = mysql_real_escape_string($lastname); 
    } 
    else 
    { 
     echo 'Please enter a valid realname<br>'; 
    } 

    if (filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)){ 
    $email = $_POST['email']; 
    $email = mysql_real_escape_string($email); 
    } 
    else 
    { 
     echo 'Please enter a valid email address.<br>'; 
    } 


    //INSERT TO DB 

    $users = mysql_query("SELECT username FROM tbl_users WHERE username='$username'")or die(mysql_error()); 
    $numrows = mysql_num_rows($users); 

    if($numrows == 1){ 
     echo 'Username taken, please choose another.<br>'; 
    } 
    elseif ($username && $password && $firstname && $lastname && $email && $_GET['photo'] != ''){ 

    //UPLOAD FILE 
    $filename = $_FILES["photo"]["name"]; 
    echo $filename; 
    $file_ext = substr($filename, strripos($filename, '.')); 
    $filesize = $_FILES["photo"]["size"]; 

    if (($file_ext == ".png" || $file_ext == ".jpg" || $file_ext == ".jpeg") && ($filesize < 500000)) { 
     $photo_ID = md5($filename); 
     $rand = rand(); 
     $newfilename = $photo_ID . $rand . $file_ext; 
     move_uploaded_file($_FILES["photo"]["tmp_name"], "images/profile_pics/" . $newfilename) or die("error uploading photo"); 
    } 
    else 
    { 
     echo 'Wrong file type<br>'; 
    } 

     $query = "INSERT INTO tbl_users (username, password, firstname, lastname, Email_address, photo_url) 
     VALUES ('$username' , '$password' , '$firstname', '$lastname', '$email', '$newfilename');"; 
     mysql_query($query) or die(mysql_error()); 
     echo 'Thank you for registering '. $firstname .'. Your username is '. $username .'.<br>'; 
     echo 'Click here to <a href="./index.php?">login</a>.<br></center>'; 
     mysql_close(); 

    } 
    } 
    else 
    { 
     echo 'Please fill the form out.'; 
    } 

} 
?> 
+1

添加一些代码,pl缓解。 – fl00r 2011-05-05 18:37:38

+0

那是整个代码本页 – Andrew 2011-05-05 18:38:44

+1

那是一种讽刺 – fl00r 2011-05-05 18:40:16

回答

2

必须设置形式标签的ENCTYPE到ENCTYPE =“多部分/格式数据”

参见例如http://www.15seconds.com/issue/001003.htm

+0

我已经添加了这一点,我仍然会得到相同的“通知:未定义指数:用C照片:\ XAMPP \ htdocs中\ Graded_Unit \注册。PHP的76线“错误 – Andrew 2011-05-05 18:54:29

+0

但是,这是$ _GET ['照片'] ...你没有那 – Erik 2011-05-05 19:05:58

0

你的形式应该是这样的:

<form name="login" action="register.php" method="post" enctype="multipart/form-data"> 

的事情是,如果你不设置加密类型,它会发送图像作为POST数据。

您可以阅读more about enctype here.

0

你的表格需要设置 '加密类型' 属性是 '多/表单数据'

<form name="login" action="register.php" method="post" enctype="multipart/form-data"> 
+0

我已经添加了这个,我仍然得到相同的”注意:未定义的索引:照片在C:\ xampp \ htdocs \ Graded_Unit \ register.php在第76行“错误 – Andrew 2011-05-05 18:47:09

1

又来了....

a)不要验证文件上传以查看其用户提供的文件名是否存在。上传没有名字的文件是完全可能的。检查上传成功的正确方法是:

if ($_FILES['name_of_file_field']['error'] === UPLOAD_ERR_OK) { 
    ... worked ok ... 
} else { 
    die("Upload failed with errno #" > $_FILES['name_of_file_field']['error']); 
}` 

b)不要通过检查文件扩展名来验证上传的文件类型。没有什么说恶意用户不能上传“cute puppy.jpg”,但真的会发送“讨厌virus.exe”。始终通过备用方法确定服务器上的文件类型,例如使用file_info

c)您似乎在数据库中注册上载,无论其是否有效。 “嘿,你送我们一堆垃圾而不是鲜花,哦,我只是接受送货,谢谢!”此外,您不检查move_uploaded_file()是否成功,所以还有另一个失败点。您的文件的最终目标可能会用尽磁盘空间,但您仍然记录上载成功。

加分点:实际上,你正在做的做查询之前转义您的数据,并检查是否查询suceeded。不要经常在这个网站上看到。

+0

我知道安全问题,感谢您的反馈,我的代码真正凌乱我正在尝试清理它并改进我的代码,但首先我想得到它实际运作 – Andrew 2011-05-05 19:05:18

0

你真的要同时访问$ _ POST和$ _GET?

$ _ POST

if (isset($_POST['submitted'])){ 

$ _GET

elseif ($username && $password && $firstname && $lastname && $email && $_GET['photo'] != ''){ 

注意 “$ _GET [ '照片']”

我的猜测是你的意思是$ _ POST,你有$ _GET

+0

阿格,这是问题,谢谢! – Andrew 2011-05-05 19:07:50

+0

没问题,乐于帮助。 – jedwards 2011-05-05 19:17:43