Правильное использование MySQL LOAD_FILE()

Прошу прощения, если это сложный вопрос, но у меня возникли некоторые проблемы с использованием MYSQL LOAD_FILE() в сочетании с подготовленными операторами для загрузки BLOB-изображения. В результате мне приходится прибегать к использованию отдельных запросов, один для подготовки оператора для деталей, а другой, который не готовит оператор для вставки моего BLOB. Вот пример запроса, который я пробовал:

function add_new_video() {
    $image = $_FILES['thumbnail_file']['tmp_name']; // pass this file name to getimagesize() to determine the mime-type
    $size_array = getimagesize($image);
    $thumbnail_mimetype = $size_array['mime'];
    $thumbnail_contents = file_get_contents($image);
    $thumbnail_filesize = $size_array[3];
    $thumbnail_filename = $_FILES['thumbnail_file']['name'];

    $title = $_POST['title'];
    $summary = $_POST['summary'];
        // Checkbox...      
        if(!empty($_POST['demo_reel'])) {
        $demo_reel = $_POST['demo_reel'];
    }
    else {
        $demo_reel = 0;
    }

    $query = "INSERT INTO videos (title, summary, thumbnail_filename, thumbnail_filesize, thumbnail_mimetype, thumbnail_contents, demo_reel) VALUES(?, ?, ?, ?, ?, LOAD_FILE($image), ?)";
    if($stmt = $this->conn->prepare($query)) {
        $stmt->bind_param('sssssi', $title, $summary, $thumbnail_filename, $thumbnail_filesize, $thumbnail_mimetype, $thumbnail_contents, $demo_reel);
        $stmt->execute();
        if($stmt->affected_rows == 1) {
            return true;
        }
        else {
            return false;
        }
    }
}

К сожалению, этот запрос завершается ошибкой, и я не могу вывести из него никаких ошибок. И наоборот, вот мой текущий запрос, который работает, но не использует подготовленные операторы и менее безопасен:

    $video_filename = $_POST['file_name'];
    $video_number = $_POST['number'];
    $title = $_POST['title'];
    $summary = $_POST['summary'];
    if(!empty($_POST['demo_reel'])) {
    $demo_reel = $_POST['demo_reel'];
   }
   else {
    $demo_reel = 0;
   }


    $image = $_FILES['thumbnail_file']['tmp_name']; // pass this file name to      
    getimagesize() to determine the mime-type
    $size_array = getimagesize($image);
    $thumbnail_mimetype = $size_array['mime'];
    $thumbnail_filesize = $size_array[3];
    $thumbnail_contents = addslashes(file_get_contents($image));
    $thumbnail_filename = $_POST['number'] . '.jpg';

    $query = "INSERT INTO videos (`video_filename`, `video_number`,
    `thumbnail_contents`, `title`, `summary`, `demo_reel`, `thumbnail_filename`,     
    `thumbnail_filesize`, `thumbnail_mimetype`) VALUES ('$video_filename', 
    '$video_number', '$thumbnail_contents', '$title', '$summary', '$demo_reel', 
    '$thumbnail_filename', '$thumbnail_filesize', '$thumbnail_mimetype')";

  if($result = $this->conn->query($query)) {        
     return true;
  }
  else {
    return false;
  }

Поскольку все детали в настоящее время не экранированы, и я бы предпочел не проходить через процесс использования nl2br() и обратно, я думаю о двух запросах: один с использованием подготовленных операторов для переменных $_POST, а затем другой с использованием addlashes () и обычные операторы для файла. Я хотел бы иметь возможность сделать всю вставку в одном подготовленном операторе. Любая помощь и понимание очень ценятся!


person Steve K    schedule 11.08.2009    source источник
comment
LOAD_FILE() означает, что ваш сервер PHP и сервер MySQL находятся на одном компьютере, и что MySQL будет иметь доступ к местоположению tmp, куда PHP записал файл. У тебя такая установка?   -  person VoteyDisciple    schedule 12.08.2009
comment
Спасибо за ваш комментарий! Да, мой хост сказал мне, что это установка, которая у меня сейчас есть.   -  person Steve K    schedule 12.08.2009


Ответы (1)


Вам нужно MySQLi send_long_data:

$stmt = $mysqli->prepare("INSERT INTO images (image) VALUES(?)");
//initialize the statement
$null = NULL;
$stmt->bind_param("b", $null);
//bind an empty blob dummy
$stmt->send_long_data(0, file_get_contents("osaka.jpg"));
//send the actual data (0 is the index of the parameter to fill with the data)
$stmt->execute();
person Community    schedule 27.01.2014