2011-05-05 133 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