PHP未定义的索引(由jquery文件上传引起)


PHP Undefined index (caused by jquery file upload)

我一直在尝试为我正在开发的网站上传文件。我是在表单之外完成这项工作的,经过几天的搜索,我终于从这个问题的答案中找到了适合我的方法:

问题是,当我将代码应用到自己的脚本时,我就出现了"未定义索引"错误,当我删除它时,一切都很好。

这是我的代码:

HTML

<div class='error-msg'></div>
<input type='text' id='newsitem-message' />
<input type='file' id='newsitem-thumbnail' />
<div class='submit' onclick='newsItem('"insert'");'>Post news</div>

jQuery

function newsItem(action){
    var thumbnail = $('#newsitem-thumbnail')[0].files[0];
    var fileReader = new FileReader();
    fileReader.readAsText(thumbnail, 'UTF-8');
    fileReader.onload = shipOff;
    function shipOff(e){
        var r = e.target.result;
        if(action == "insert"){
            $.post("requestPages/newsitems.php", {message:$("#newsitem-message").val(),
                                              thumbnail:thumbnail.name,
                                              action:action,
                                              data:r},
            function(result){
                console.log(result);
                console.log(r); //This freezes my console/inspector window, forcing me to restart the browser-tab
                if(result == "succes"){
                    window.location.reload();
                }else{
                    $(".error-msg").html(result);
                }
            });
        }else if(action == "delete"){
            //To be implemented when I get the submit working D:
        }
    }
}

PHP(请原谅混乱-需要认真清理)

<?php
    include("../assets/libs/SQLLib.php");
    DB_Connect("test");
    echo print_r($_POST);
    echo var_dump($_POST);
    $message = $_POST['message'];
    $action = $_POST['action'];
    $thumbnail = $_POST['thumbnail'];
    $data = $_POST['data'];
    $serverFile = time().$thumbnail;
    $fp = fopen('../assets/images/thumbnails/'.$serverFile, 'w');
    fwrite($fp, $data);
    fclose($fp);
    $returnData = array("serverFile" => $serverFile);
    echo json_encode($returnData);
    if($_POST['message'] != ""){
        $canPost = true;
    }else{
        echo "The message can not be empty.";
    }
    if($action == "insert" && $canPost){
        $sql = "insert into newsitems
                (date, message, thumbnail)
                values
                (NOW(),'".$message."', '".$thumbnail."')";
        $result = mysql_query($sql);
        if(!$result){
            echo "Uh-oh! Something went wrong while posting the news! ".mysql_error();
        }else{
            echo "succes";
        }
    }else if($action == "delete"){
        $sql = "";
    }
?>

有人看到这里出了什么问题吗?或者有人有其他选择吗?

我希望有人能帮我解决这个问题。

这样更改:

include("../assets/libs/SQLLib.php");
DB_Connect("test");
print_r($_POST); //Dont echo, what is already echoed
var_dump($_POST); //Dont echo, what is already echoed
$message = !empty($_POST['message'])?$_POST['message']:'';
$action = !empty($_POST['action'])?$_POST['action']:'';
$thumbnail = !empty($_POST['thumbnail'])?$_POST['thumbnail']:'';
$data = !empty($_POST['data'])?$_POST['data']:'';
if(!empty($thumbnail) && !empty($data)){
$serverFile = time().$thumbnail;
    $fp = fopen('../assets/images/thumbnails/'.$serverFile, 'w');
    fwrite($fp, $data);
    fclose($fp);
    $returnData = array("serverFile" => $serverFile);
    echo json_encode($returnData);
} else {
echo json_encode(array('error'=>'No data and thumbnail assigned'));
}
if($message != ""){
    $canPost = true;
}else{
    echo "The message can not be empty.";
}
if($action == "insert" && $canPost){
    $sql = "insert into newsitems
            (date, message, thumbnail)
            values
            (NOW(),'".$message."', '".$thumbnail."')";
    $result = mysql_query($sql);
    if(!$result){
        echo "Uh-oh! Something went wrong while posting the news! ".mysql_error();
    }else{
        echo "success";
    }
}else if($action == "delete"){
    $sql = "";
}

同样,您只需要更改.htaccess或php中的错误报告级别,就可以防止显示警告消息。In.htaccess:

php_flag error_reporting E_ERROR

如果在.php文件中,则

<?php error_reporting(E_RROR); //This displays only Errors, no warning and notices.

希望您已经尝试过使用isset($_POST)isset($_POST['message']),如果您得到"注意:未定义的索引:消息"。

所以最后我选择了不进行完整的jQuery上传,转而进行其他操作。我现在纯粹通过PHP调用上传文件,而不是通过jQuery post事件,在它旁边进行一个小的JavaScript检查,看看表单是否可以提交。

代码:

HTML

<div class='error-msg'></div>
<form method='post' action='requestPages/newsitems.php' enctype='multipart/form-data'>
    News message
    <textarea id='newsitem-message' name='newsitem-message' onchange='checkFormSubmit()'/>
    <input type='file' name='newsitem-thumbnail' id='newsitem-thumbnail' />
    <input hidden type='text' value='insert' name='newsitem-action'/>
    <input class='submit' id='newsitem-submit' type='submit' value='Post news' disabled/>
</form>

PHP

<?php
include("../assets/libs/SQLLib.php");
    DB_Connect("test");
    var_dump($_FILES);
var_dump($_POST);
$message = $_POST['newsitem-message'];
$action = $_POST['newsitem-action'];
$errors= array();
$hasFile = false;
if($action == "insert"){
    echo ($_FILES['newsitem-thumbnail'][0] == UPLOAD_ERR_NO_FILE);
    if(isset($_FILES['newsitem-thumbnail']) && $_FILES['newsitem-thumbnail']['error'] != UPLOAD_ERR_NO_FILE){
        $file_name = $_FILES['newsitem-thumbnail']['name'];
        $file_size =$_FILES['newsitem-thumbnail']['size'];
        $file_tmp =$_FILES['newsitem-thumbnail']['tmp_name'];
        $file_type=$_FILES['newsitem-thumbnail']['type'];
        $file_ext=strtolower(end(explode('.',$_FILES['newsitem-thumbnail']['name'])));
        $extensions= array("jpeg","jpg","png");
        if(!in_array($file_ext,$extensions)){
            $errors[]="extension not allowed, please choose a JPEG or PNG file.";
        }
        $hasFile = true;
    }
    if(empty($errors)){
        $sql = "insert into newsitems
                (date, message, thumbnail)
                values
                (NOW(),'".$message."', '".$file_name."')";
        $result = mysql_query($sql);
        if(!$result){
            echo "Uh-oh! Something went wrong while posting the news! ".mysql_error();
        }else{
            if($hasFile){
                if(!move_uploaded_file($file_tmp,"../assets/images/thumbnails/".$file_name)){
                    echo "Moving the file failed!";
                }
            }
        }
    }else{
        print_r($errors);
    }
}else if($action == "delete"){
    $sql = "";
}
?>

JavaScript

function checkFormSubmit(){
    if($.trim($('#newsitem-message').val()) != ""){
        $('#newsitem-submit').prop('disabled', false);
    }else{
        $('#newsitem-submit').prop('disabled', true);
    }
}