2016-06-24 4 views
0

Я не уверен, как обрабатывать образ в PHP, чтобы поместить его в тип BLOB в MYSQLI. Вот мой код до сих пор ...Как я могу ввести изображение в mysqli?

<?php 
    $servername = ""; //Taken out for stack overflow question 
    $username = ""; //Taken out for stack overflow question 
    $password = ""; //Taken out for stack overflow question 
    $dbname = ""; //Taken out for stack overflow question 

    $conn = mysqli_connect($servername, $username, $password, $dbname); 

    if (!$conn) 
    { 
     echo 'Could not connect'; 
    } 
    else 
    { 
     if (!empty($_FILES['cf'] && $_POST['category'])) 
     { 
      $file = $conn->real_escape_string($_FILES['cf']['tmp_name']); 
      mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")"); 
     } 
     else 
     { 
      echo 'Empty file'; 
     } 
    } 

    mysqli_close($conn); 
?> 

Теперь значение изображения не равно нулю, поэтому изображение обрабатывается. Но я не могу заставить его обработать. Обычно я делаю переменную $ var = $ _POST ['cf']; то я добавляю это в запрос. Я также попробовал $ var = $ _FILES ['cf']; но он не будет обрабатывать. Есть ли что-то еще, что мне нужно сделать, чтобы заставить его отправлять/обрабатывать правильно?

Редактировать на основе ответа

Я изменил свой PHP к чему-то, что напоминает ответ

<?php 
    $servername = ""; //Taken out for stack overflow question 
    $username = ""; //Taken out for stack overflow question 
    $password = ""; //Taken out for stack overflow question 
    $dbname = ""; //Taken out for stack overflow question 

    $conn = mysqli_connect($servername, $username, $password, $dbname); 

    if (!$conn) 
    { 
     echo 'Could not connect'; 
    } 
    else 
    { 
     if (!empty($_FILES['cf'] && $_POST['category'])) 
     { 
      try 
      { 
       $file = $conn->real_escape_string($_FILES['cf']['tmp_name']); 
       $filecontents = File_Get_Contents($file); 
       $filecontentssafe = $conn->real_escape_string($filecontents); 
       mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")"); 
       echo 'Query successful'; 
      } 
      catch(Exception $e) 
      { 
       echo 'Could not perform action' + $e; 
      } 
     } 
     else 
     { 
      echo 'Empty file'; 
     } 
    } 

    mysqli_close($conn); 
?> 

Теперь я вижу запрос успешно, но .. ничего не входит в базу данных.

Edit - добавил извлечение файлу

<?php 
    $servername = ""; 
    $username = ""; 
    $passcode = ""; 
    $dbname = ""; 

    $conn = mysqli_connect($servername, $username, $passcode, $dbname); 

    if (!$conn) 
    { 
     echo 'Could not connect'; 
    } 
    else 
    { 
     try 
     { 
      $sql_query = mysqli_query($conn, "SELECT * FROM `adDatabase`"); 
      while ($row = mysqli_fetch_array($sql_query)) 
      { 
       $id = $row['ID']; 
       $img = $row['img']; 
       $image = '<img src="data:image/png;base64,'.base64_encode($row['food']).'" style="height: 12em; width: 12em; margin: 1em; padding: 0.9em; " >'; 
       echo $image; 
      } 
     } 
     catch(Exception $e) 
     { 
      echo $e; 
     } 
    } 
?> 

Как получить информацию о

+1

У вас есть уязвимость в SQL-инъекции. – SLaks

+0

'var_dump ($ _ FILES)'. то, что находится в $ _FILES, это только информация о загрузке. он НЕ является фактическим содержимым файла. –

+1

Ни SSL, ни другие методы защиты не помогут в SQL-инъекции каким-либо образом. Вы не поняли уязвимости. И, используя параметры, все равно исправить вашу проблему. – SLaks

ответ

0

К тому времени вы называете MySQL, $ файл содержит только путь к временному загруженному файлу, а не данные, которые вы хотите ,

Если вы хотите MySQL, чтобы посмотреть на путь к файлу, и загрузить его содержимое непосредственно в вашу базу данных, посмотреть на функции load_file MySQL() здесь: http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file

В противном случае, если вы хотите сделать это в PHP, вы хотите вывести содержимое файла в переменную с чем-то вроде

$file_contents=File_Get_Contents($file); 

... а затем использовать

$file_contents_safe=$conn->real_escape_string($file_contents); 

перед тем ЦНТИ king $ file_contents_safe в базу данных. Некоторым людям также нравится кодировать Base64.

Редактировать: Пожалуйста, также учитывайте уязвимости в отношении инъекций, как и другие. Имя временного файла и ничего другого, поступающего из post/apache, не следует доверять самостоятельно.

+0

Я использовал base64 при извлечении изображений. –

+0

Благодарим за отзыв. –

+0

Я пытаюсь это сделать –

0

Если вам не нужно сохранять информацию о блобе в базе данных, вы можете сохранить только имя файла в базе данных и выполнить обычную загрузку файла в выбранное место. Для этого вам нужно будет добавить это перед добавлением контента в базе данных

$tmp_name = $_FILES["filename"]["tmp_name"]; 
$name = $_FILES["filename"]["name"]; 
move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}"); 

И после загрузки файла, вам просто нужно хранить его имя в базе данных вместо того, чтобы хранить содержимое BLOB. При отображении вам просто нужно получить доступ к фактическому файлу в папке загрузки и показать его. Это гораздо более чистое решение, особенно если вам не нужно переносить файлы между серверами.

Весь код будет выглядеть примерно так:

if (!empty($_FILES['cf'] && $_POST['category'])) 
{ 
    $tmp_name = $_FILES["cf"]["tmp_name"]; 
    $name = $_FILES["cf"]["name"]; 
    move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}"); 
    $file = $conn->real_escape_string($name); 
    mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")"); 
} 

Затем, когда доступ к нему, вам нужно будет извлекать данные из базы данных и просто отобразить его.Если это изображение, это может быть

<img src="<?php YOUR_UPLOAD_DIR.'/'.$name ?>"/> 

Иначе:

Чтобы вставить данные изображения в базе данных сделать:

$content = file_get_contents($tmpName); 
$file = $conn->real_escape_string($content); 
$mime_type = mime_content_type($tmpName); 
mysqli_query($conn, "INSERT INTO adDatabase(".$category.", mime_type) VALUES(".$file.", ".$mime_type.")"); 

Примечание я добавил MimeType к вставке, потому что он вам понадобится, чтобы отобразить файл правильно позже.

Затем, когда вы хотите отобразить его, просто вытащите контент из db и эхо его вместе с соответствующим заголовком.

header('Content-type:'.$mime_type); 
echo $content; 
+0

К несчастью, мне нужна база данных. Обычно я использую этот метод. Но db необходим в этом случае. –

+0

Просто обновил ответ, должен быть более полезным сейчас :) – trajchevska

+0

Спасибо, теперь что такое mimi_content_type? –

Смежные вопросы