【问题标题】:PHP Undefined index (caused by jquery file upload)PHP未定义索引(由jquery文件上传引起)
【发布时间】:2016-04-04 09:32:26
【问题描述】:

我一直在尝试为我正在开发的网站上传文件。我在表单之外执行此操作,经过几天的搜索,我终于从this question: 的答案中找到了适合我方法的东西@

问题是,当我将代码应用到自己的脚本时,我得到了“未定义索引”错误,当我删除它时,一切正常。

这是我的代码:

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 = "";
    }
?>

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

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

【问题讨论】:

  • console.log(result); 先检查值,然后检查print_r($_POST); 的结果是什么
  • 感谢@devpro 的快速回答在将 console.log() 添加到我的代码时,我注意到我有一个双重声明的变量,但甚至重命名了这两个变量之一没有解决任何问题。我已经更新了上面的代码,使用 console.log() 调用 - 一个转储我的错误消息,另一个冻结我的检查器视图。
  • 您到底得到了哪些“未定义索引”错误?我无法重现任何此类错误。
  • @ImClarky PHP 错误如 Notice: Undefined index: message 之类的。仅当我未注释文件上传代码时才会发生这种情况。当我对这些文章发表评论时(基本上是后期操作,但没有缩略图),一切正常,新闻项目被放入数据库中。
  • @ImClarky 这是全屏图片:dropbox.com/s/pz3sy21jfq2cioq/PHP_Errors.png?dl=0

标签: javascript php jquery jquery-file-upload


【解决方案1】:

改成这样:

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 中的错误报告级别即可防止显示警告消息。在 .htaccess 中:

php_flag error_reporting E_ERROR

如果在 .php 文件中则

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

【讨论】:

  • 感谢您的回答和清理。这确实摆脱了我的“未定义索引”错误,但遗憾的是,它仍然没有将新的新闻站点发布到数据库中。
  • 禁用警告而不是修复它们? NO。像这样糟糕的答案是 PHP 名声不好的原因。
【解决方案2】:

希望您尝试过使用 isset($_POST)isset($_POST['message']) 如果您收到“通知:未定义索引:消息”。

【讨论】:

    【解决方案3】:

    所以最后我选择退出完整的 jQuery 上传,而是选择了其他东西。 我现在纯粹通过 PHP 调用而不是 jQuery 发布事件来上传文件,并在其旁边使用一个小的 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);
        }
    }
    

    【讨论】:

    • 那么...此代码是否有效,在这种情况下您应该将其标记为答案吗?还是它仍然不起作用,在这种情况下,您应该编辑您的问题以包含代码,并删除此“答案”。
    • @IanKemp 这是工作代码。我发布时无法将其标记为答案(不得不等待两个小时),直到现在我完全忘记了。
    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 2013-08-23
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多