我有以下代码注册新用户,他们的照片被上传重命名并移动到一个文件夹,但我不断得到错误说照片是未定义的,我认为这一定是一个(愚蠢的)问题与我的形式,我错过了,但我已经一步,虽然我的代码重复,不能解决这个问题。
<?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.';
}
}
?>
必须将form-tag的enctype设置为enctype="multipart/form-data"
参见http://www.15seconds.com/issue/001003.htm
又来了....
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)不通过检查文件扩展名来验证上传的文件类型。没有人说恶意用户不能上传"可爱的小狗。jpg",但实际上是在发送"讨厌的病毒。exe"。始终通过其他方法确定服务器上的文件类型,例如使用file_info
。
c)你似乎在数据库中注册上传,不管它是否有效。"嘿,你给我们送来一卡车的垃圾,而不是鲜花。哦,好吧,我还是接受送货吧。谢谢!"。同样,您根本没有检查move_uploaded_file()
是否成功,因此存在另一个故障点。文件的最终目的地可能耗尽了磁盘空间,但您仍然将上传记录为成功。
加分点:在执行查询之前,您实际上对数据进行了转义,并检查查询是否成功。
您的表单需要将'enctype'属性设置为'multipart/form-data'
<form name="login" action="register.php" method="post" enctype="multipart/form-data">
您的表单应该是这样的:
<form name="login" action="register.php" method="post" enctype="multipart/form-data">
问题是,如果你没有设置enctype,它会发送图像作为POST数据。
您可以在这里阅读更多关于enctype的信息
你真的想同时访问$_POST和$_GET吗?
$ _POST
if (isset($_POST['submitted'])){
$ _GET
elseif ($username && $password && $firstname && $lastname && $email && $_GET['photo'] != ''){
注意"$_GET['photo']"
我猜你的意思是$_POST,你有$_GET