รายละเอียดของการตอบ ::
เพราะเวลาคุณทำในเครื่องคุณเอง ส่วนใหญ่จะไม่มีการกำหนดค่าๆ นึงใน php.ini ที่เรียกว่า
open_basedir
ค่าๆ นี้จะบอกให้ php ปฏิเสธที่จะเปิดไฟล์ที่อยู่นอก directory ที่กำหนด
เช่นถ้าคุณกำหนดว่า
open_basedir="D:\My Documents"
ไฟล์อะไรก็ตามที่คุณจะเปิดด้วยคำสั่งที่เกี่ยวกับไฟล์ทั้งหมด (รวมถึง include, require etc.) หากมันอยู่นอก D:\My Documents จะเปิดไม่ได้
ซึ่งใน host ทั่วไปมักจะต้องกำหนด open_basedir ไว้เพื่อไม่ให้ผู้ใช้ไปเปิดไฟล์ของผู้ใช้อื่นด้วย php ได้
มาถึงคำถามว่าทำไมใช้ copy บนเครื่องตัวเองได้ แต่บน host ไม่ได้
โดยปกติแล้วไฟล์ที่อัพโหลดมานั้น php จะเก็บไว้ใน tmp directory ของระบบ ถ้าใน Windows ก็จะเป็น C:\WINDOWS\TEMP
หรือใน Unix ส่วนมากก็จะเป็น /tmp
ซึ่ง directory เหล่านี้จะอยู่นอก home directory ของผู้ใช้อยู่แล้ว และ host ส่วนใหญ่จะกำหนด open_basedir ไว้เป็น home directory ของผู้ใช้นั้นๆ
ดังนั้นการ copy ไฟล์ที่ถูกอัพโหลดมา จะไม่สามารถทำได้ด้วยฟังก์ชั่น copy() ตามกฏของ open_basedir
แต่ move_uploaded_file() สามารถทำได้ (และเป็นฟังก์ชั่นเดียวที่ทำได้)
และใช้เพื่อการนี้โดยเฉพาะเท่านั้น ไม่สามารถ move ไฟล์อื่นๆ ได้ นอกจากไฟล์ที่อัพโหลดมา
เพราะมันจะเช็คว่าไฟล์ที่จะ move อยู่ใน tmp directory หรือเปล่า