0

ファイルをアップロードし、フォーム データをデータベースに挿入する PHP スクリプトで、DB 挿入を行う関数が呼び出されていません。以下のコードを見てください。ご覧のとおり、何が起こっているかを追跡するために、コード全体にログ ステートメントがあります。行がログ ファイルに書き込まれていることがわかりますが$log->lwrite('Successfully moved the file to the destination folder.');、その後、行を含め、ログ ファイルには何も書き込まれていません$log->lwrite('$inserted: ' . $inserted);

これを呼び出す jQuery Form プラグインでは、アップロードの進行状況が適切に表示され、100% になり、ファイルがアップロードされますが、コールバックの完全な部分のコードは実行されません。

ご覧ください。ここで何が欠けているのかわかりません。

以下を更新

これが私のPHPスクリプトです:

require ('logging.php');
$log = new Logging();

$fileName = basename($_FILES['uploadedFile']['name']);
$targetPath = '../media/' . $fileName;
$title = $_POST['sermonTitle'];
$speaker = $_POST['speakerName'];
$date = $_POST['sermonDate'];

$log->lwrite('file name: ' . $fileName . ', title: ' . $title . ', speaker: ' . $speaker . ', date: ' . $date);

if ($_FILES['uploadedFile']['type'] === 'audio/mp3') {
    $log->lwrite('Correct file type.');
    if (file_exists($targetPath)) {
        $log->lwrite('File already exists.');
        // File with the selected name already exists on the server
        exit ('exists');
    } else {
        if (move_uploaded_file($_FILES['uploadedFile']['tmp_name'],$targetPath)) {
            $log->lwrite('Successfully moved the file to the destination folder.');

            $inserted = AddSermonToDb();

            $log->lwrite('$inserted: ' . $inserted);

            if ($inserted == true) {
                $log->lwrite('Added the sermon to the DB.');
                exit ('success');
            } else {
                $log->lwrite('Failed to add the sermon to the DB.');
                exit ('insertFail');
            }

        } else {
            $log->lwrite('Couldn\'t upload the file.');
            // Problem uploading the file or moving it to the destination folder
            exit ('uploadFail');
        }
    }
} else {
    $log->lwrite('Invalid file type.');
    exit ('invalidType');
}

function AddSermonToDb() {

    $log->lwrite('In AddSermonToDb function');

    // Connect to the database
    //require_once([path to connection script]);

    $query = "INSERT INTO sermons (sermonMp3FileName, sermonTitle, sermonSpeaker, sermonDate)
            VALUES ('$fileName', '$title', '$speaker', '$date')";

    $log->lwrite('$query: ' . $query);

    $result = @mysqli_query($dbc, $query);

    $log->lwrite('$result: ' . $result);

    mysqli_close($dbc);

    if ($result) {
        return true;
    } else {
        return false;
    }
}

jQuery Form プラグイン スクリプトは次のとおりです。

// Reset validation and progress elements
var percentVal = '0%';
$('.statusBar').width(percentVal);
$('.percent').html(percentVal);

$('#frmSermonUpload').ajaxForm({
    beforeSubmit: function() {
        var formValid;

        if (!ValidateUploadForm()) {
            formValid = false;
        } else {
            formValid = true;
        }

        if (!formValid) {
            return false;
        }

    },
    uploadProgress: function(event, position, total, percentComplete) {
        var percentVal = percentComplete + '%';

        $('.statusBar').width(percentVal)
        $('.percent').html(percentVal);    
    },
    complete: function(xhr) {

        if (xhr.responseText === 'success') {
            $('.statusBar').width('100%');
            $('.percent').html('100%');
            $('#status').html('Successfully uploaded the sermon.<br>Successfully added the sermon to the database.').addClass('successUpload');

            ClearForm();

        } else if (xhr.responseText === 'uploadFail') {
            $('#status').html('There was a problem uploading the file. Try again.<br>If the problem persists, contact the system administrator.').addClass('errorUpload');
        } else if (xhr.responseText === 'exists') {
            $('#status').html('A file with that name already exists on the server.').addClass('errorUpload');
        } else if (xhr.responseText === 'insertFail') {
            $('#status').html('The file was uploaded, but there was a problem inserting the information into the database.').addClass('errorUpload');
        } else if (xhr.responseText === 'invalidType') {
            $('#status').html('Invalid file type. Only audio files with the extention "mp3" are allowed.').addClass('errorUpload');
        }
    }
}); // End Upload Status Bar

誰の助けにも感謝します。

アップデート

関数に変数を渡していないことを指摘した何人かの指摘が正しかったことを認めるのは恥ずかしいことです。

さらに、いいえ、私は PHP エラー ログをチェックしませんでした (これほど明白であるべきことをすべて認めているとは信じられません!)。

そのため、変数を関数呼び出しに追加し、PHP エラー ログを確認したところCall to a member function lwrite() on a non-object in /home3/fbcglenw/public_html/scripts/sermonUpload.php on line 44、関数で $log を呼び出している最初の行である行が見つかりました。

関数は $log オブジェクトを「見る」ことができると思ったので、関数呼び出しと関数定義の変数に $log を追加しようとしましたが、エラーは変わりませんでした。

更新 #2 わかりません (それが私がここで助けを求めている理由です) が、これはスコープの問題であることが判明したようですが、$log オブジェクトが php スクリプトの先頭にある場合、私はそのスクリプトのどの関数も、その $log オブジェクトを「見る」ことができるはずだと考えていたでしょう...

4

3 に答える 3

1

$fileName $title $speaker $date は null

AddSermonToDb($fileName, $title,$speaker,$date) のような値を渡す必要があります

function AddSermonToDb() {

$log->lwrite('In AddSermonToDb function');

// Connect to the database
//require_once([path to connection script]);

$query = "INSERT INTO sermons (sermonMp3FileName, sermonTitle, sermonSpeaker, sermonDate)
        VALUES ('$fileName', '$title', '$speaker', '$date')";
.....

//if you use jquery add 
$(function(){     
 //jquery code

})
于 2013-04-26T09:24:45.990 に答える
0

SQL クエリの変数 $fileName、$title $speaker、および $date

INSERT INTO sermons (sermonMp3FileName, sermonTitle, sermonSpeaker, sermonDate)
        VALUES ('$fileName', '$title', '$speaker', '$date')

関数のスコープ外で定義されています。それらは関数に存在しないため、警告がオンの場合はエラーになり、オフの場合は null になります。

これにより、クエリで予期しない結果が発生し、致命的なエラーが発生してコードの実行が停止し、それ以上のログが記録されなくなる可能性があります

于 2013-04-26T09:24:47.987 に答える
0

あなたの説明から、ここでエラーが発生しているように聞こえます:

$inserted = AddSermonToDb();

確かに、単純な try/catch を記述して、予測可能な方法でエラーを処理してください。

于 2013-04-26T09:20:59.350 に答える