Добавьте дополнительные пользовательские переменные в вставку mysql при загрузке blueimp/jquery-file-upload

В настоящее время я вставляю заголовок и описание через mysql внутри сценария blueimp/jquery-file-upload. Я использовал это руководство, чтобы добраться туда, однако мне нужно добавить еще одну переменную. Переменная представляет собой сеанс текущего пользователя с идентификатором $_SESSION["userid"], и я хочу вставить его в столбец, который я добавил под названием uid. Обычно легко внедрить еще один столбец во вставку, однако этот скрипт очень обидчив, и каждый раз, когда я вмешиваюсь в него, даже малейший бит, я получаю «SyntaxError: Unexpected token <». Любая помощь будет принята с благодарностью.

/сервер/php/index.php

$options = array(
    'delete_type' => 'POST',
    'db_host' => 'localhost',
    'db_user' => 'fpform_fanuser',
    'db_pass' => '*****',
    'db_name' => 'fpform_fandata',
    'db_table' => 'files'
);

error_reporting(E_ALL | E_STRICT);
require('UploadHandler.php');

class CustomUploadHandler extends UploadHandler {

    protected function initialize() {
        $this->db = new mysqli(
            $this->options['db_host'],
            $this->options['db_user'],
            $this->options['db_pass'],
            $this->options['db_name']
        );
        parent::initialize();
        $this->db->close();
    }

    protected function handle_form_data($file, $index) {
        $file->title = @$_REQUEST['title'][$index];
        $file->description = @$_REQUEST['description'][$index];
    }

    protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
            $index = null, $content_range = null) {
        $file = parent::handle_file_upload(
            $uploaded_file, $name, $size, $type, $error, $index, $content_range
        );
        if (empty($file->error)) {
            $sql = 'INSERT INTO `'.$this->options['db_table']
                .'` (`name`, `size`, `type`, `title`, `description`)'
                .' VALUES (?, ?, ?, ?, ?)';
            $query = $this->db->prepare($sql);
            $query->bind_param(
                'sisss',
                $file->name,
                $file->size,
                $file->type,
                $file->title,
                $file->description,
            );
            $query->execute();
            $file->id = $this->db->insert_id;
        }
        return $file;
    }

    protected function set_additional_file_properties($file) {
        parent::set_additional_file_properties($file);
        if ($_SERVER['REQUEST_METHOD'] === 'GET') {
            $sql = 'SELECT `id`, `type`, `title`, `description` FROM `'
                .$this->options['db_table'].'` WHERE `name`=?';
            $query = $this->db->prepare($sql);
            $query->bind_param('s', $file->name);
            $query->execute();
            $query->bind_result(
                $id,
                $type,
                $title,
                $description
            );
            while ($query->fetch()) {
                $file->id = $id;
                $file->type = $type;
                $file->title = $title;
                $file->description = $description;
            }
        }
    }

    public function delete($print_response = true) {
        $response = parent::delete(false);
        foreach ($response as $name => $deleted) {
            if ($deleted) {
                $sql = 'DELETE FROM `'
                    .$this->options['db_table'].'` WHERE `name`=?';
                $query = $this->db->prepare($sql);
                $query->bind_param('s', $name);
                $query->execute();
            }
        } 
        return $this->generate_response($response, $print_response);
    }

}


$upload_handler = new CustomUploadHandler($options);

person Alex Sarnowski    schedule 19.03.2014    source источник
comment
какое конкретное сообщение об ошибке вы получаете и в какой строке кода?   -  person Maximus2012    schedule 20.03.2014
comment
какая строка кода? Это сообщение об ошибке само по себе не очень полезно. Это может быть где угодно.   -  person Maximus2012    schedule 20.03.2014
comment
Я получаю его после попытки загрузить изображение (когда я пытаюсь каким-либо образом отредактировать вставку индекса в sql), однако, когда я оставляю его так, как указано в руководстве, ошибки нет.   -  person Alex Sarnowski    schedule 20.03.2014
comment
Я думаю, вы разместили много кода. Возможно, если бы вы могли опубликовать только код, в котором возникают проблемы, вместе с, возможно, номером строки, это было бы полезно. Включены ли для вашего приложения отчеты об ошибках: stackoverflow.com/questions/6575482/   -  person Maximus2012    schedule 20.03.2014
comment
хорошо, мой вопрос прост. Я хотел бы добавить $_SESSION["userid"] в качестве значения в столбец uid в таблице FILES... мне нужно, чтобы код сделал это, просто добавьте еще один столбец во вставку.   -  person Alex Sarnowski    schedule 20.03.2014
comment
у вас уже есть столбец для user_id в вашей таблице $this-›options['db_table']? Это первое, что вам нужно сделать.   -  person Maximus2012    schedule 20.03.2014
comment
посмотрите на ответ, который я разместил. Посмотрите, поможет ли это.   -  person Maximus2012    schedule 20.03.2014


Ответы (4)


Предполагая, что вы хотите изменить свой запрос INSERT (в опубликованном вами коде есть только один запрос INSERT), это то, что вам нужно изменить:

if (empty($file->error)) {
    $sql = 'INSERT INTO `'.$this->options['db_table']
            .'` (`name`, `size`, `type`, `title`, `description`, `uid`)'
            .' VALUES (?, ?, ?, ?, ?, ?)';
    $query = $this->db->prepare($sql);
    $query->bind_param(
            'sisss',
            $file->name,
            $file->size,
            $file->type,
            $file->title,
            $file->description,
            $_SESSION['userid']
        );
    $query->execute();
    $file->id = $this->db->insert_id;
}
person Maximus2012    schedule 19.03.2014
comment
снова я получаю сообщение об ошибке SyntaxError: Unexpected token <. - person Alex Sarnowski; 20.03.2014
comment
вы знакомы с blueimp? - person Alex Sarnowski; 20.03.2014
comment
нет, но поскольку это PHP, было бы полезно, если бы вы могли указать строку кода, в которой возникают проблемы. Возможно ли, что ошибка исходит из совершенно другой части кода и не имеет ничего общего с внесенными вами изменениями или изменениями, которые я предложил? - person Maximus2012; 20.03.2014
comment
это повторяется на add.php.., потому что каждый раз, когда вы редактируете что-либо в blueimp, кажется, что эта ошибка отображается через ajax под изображением, которое вы пытаетесь загрузить. Это общая ошибка... она возникает каждый раз, когда что-то не так. - person Alex Sarnowski; 20.03.2014
comment
Тогда возможно, что вы можете получить ошибку в другом месте кода. Без дополнительной информации ни я, ни кто-либо другой не смогли бы вам сильно помочь. - person Maximus2012; 20.03.2014

Я думаю, вам нужно добавить еще одну запись в первый параметр bind_param:

$query->bind_param(
        **'sisss',**
        $file->name,
        $file->size,
        $file->type,
        $file->title,
        $file->description,
        $_SESSION['userid']

должно быть

$query->bind_param(
        **'sissss',**
        $file->name,
        $file->size,
        $file->type,
        $file->title,
        $file->description,
        $_SESSION['userid']

Минус звездочки, конечно, или любой другой правильный тип данных (см. раздел типов параметров в http://us.php.net/manual/en/mysqli-stmt.bind-param.php).

Одна странность, я попытался передать литеральную строку в качестве последнего параметра, и это выдало эту ошибку:

«Неустранимая ошибка PHP: невозможно передать параметр 7 по ссылке в /var/www/html/jqfileuploadertest/server/php/index.php в строке 66»

Но когда я изменил «mystring» на $file->name, все заработало нормально. Это потребует некоторой борьбы, потому что я хочу поставить метку времени... У меня такое чувство, что простое добавление "СЕЙЧАС()" не сработает...


Обновлено: я хотел добавить два поля для каждого файла, идентификатор того, кто его загрузил (что, я думаю, и делает OP), а также метку времени. Я добавил их как скрытые входы в форме:

<input name="contributor[]" type="hidden" value="myuserid" />
<input name="uploadedOn[]" type="hidden" value="2014-03-28 10:00:00" />

Если ваша форма представляет собой php-скрипт, вы можете динамически генерировать оба.

Затем добавил это в строку index.php ~ 44:

    $file->contributor = @$_REQUEST['contributor'][$index];
    $file->uploadedOn = @$_REQUEST['uploadedOn'][$index];

И изменил эту часть index.php, где подготовлен оператор sql:

if (empty($file->error)) {
        $sql = 'INSERT INTO `'.$this->options['db_table']
            .'` (`name`, `size`, `type`, `title`, `description`,`contributor`, `dateUploaded`)'
            .' VALUES (?, ?, ?, ?, ?, ?, ?)';
        $query = $this->db->prepare($sql);
        $query->bind_param(
            'sisssss',
            $file->name,
            $file->size,
            $file->type,
            $file->title,
            $file->description,
            $file->contributor,
            $file->uploadedOn
        );

И это сработало.

person Tom McGee    schedule 27.03.2014

Ошибка, которую вы получаете, находится в консоли javascript, когда вы загружаете файл, верно? Мне кажется, что один из загружаемых файлов 404 не найден, и он пытается проанализировать полученную страницу 404 как файл сценария, хотя на самом деле это html-файл, начинающийся с ‹... У меня это случилось однажды раньше. Проверьте в сети и просмотрите все ресурсы, которые загружаются, когда это происходит. Вполне вероятно, что правильные заголовки 404 также не возвращаются, поэтому он будет пытаться их проанализировать.

person Rick Kukiela    schedule 06.01.2017

person    schedule
comment
Я сделал это, и я все еще получаю сообщение об ошибке. Я добавил session_start(); и изменил строку на $query->bind_param('sissss', и добавил $_SESSION['userid'].... и все еще не работает. - person Alex Sarnowski; 24.03.2014