Is it possible to update LONGBLOB field?

Asked

Viewed 446 times

3

I have a script that uploads images to a table with field LONGBLOB, upload any image and display it smoothly.

My question is, although I know we shouldn’t insert images into mysql, there is a way to do UPDATE, or even a INSERT through a given ID to that field LONGBLOB? In this case, how would I update the images inserted in the database?

  • 1

    That answer was correct to your question, Marcelo?

1 answer

2

There is a way to update the photo field that is in the type LONGBLOB.

Scripts

php connection.: Responsible for connection to the Mysql database PDO

<?php
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'senha');

Index.php: Responsible for inserting, changing and listing photos that are saved in the database with the field LONGBLOB

<?php    
    include 'conexao.php';
    //função responsável em converto arquivo de imagem em bytes
    function renderBytePicture($arq){        
        return fread(fopen($arq, "rb"), filesize($arq));
    }

    //verificação dos valores enviados pelos inputs e files da tela
    $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
    $im = isset($_FILES['imagem']) ? $_FILES['imagem']: NULL;
   
    //verifica se a imagem foi enviada
    if (is_null($im) === false)
    {
        //pega extensão da foto
        $imgs = explode('.',$im['name']);
        //cria um nome temporário do arquivo foto enviado
        $nametemp = session_id().'tmp-.'.(date('dmYHis')).'.'.(end($imgs));
        //envia a foto para o diretório
        move_uploaded_file($im['tmp_name'], $nametemp);
        //converte o arquivo de foto em bytes
        $imagem = renderBytePicture($nametemp);
        //verifica se o id foi digitado se não ele inseri se sim ele altera
        if (empty($id)) // novo registro
        {
            $sts = $pdo->prepare('INSERT INTO imagens(imagem, type, size) VALUES (?,?,?);');
            $sts->bindValue(1, $imagem, PDO::PARAM_LOB);
            $sts->bindValue(2, $im['type'], PDO::PARAM_STR);
            $sts->bindValue(3, filesize($nametemp), PDO::PARAM_INT);
            $sts->execute();            
        } 
        else // alterar registro
        {
            $sts = $pdo->prepare('UPDATE imagens SET imagem=?, type=?, size=? WHERE id=?;');
            $sts->bindValue(1, $imagem, PDO::PARAM_LOB);
            $sts->bindValue(2, $im['type'], PDO::PARAM_STR);
            $sts->bindValue(3, filesize($nametemp), PDO::PARAM_INT);
            $sts->bindValue(4, $id, PDO::PARAM_INT);
            $sts->execute();
        }
        
        unlink($nametemp);
    }
    
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Enviando em alterando foto</title>
</head>
<body>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <div>Para Alterar Informe Id:</div>
        <div><input type="text" name="id" value="" id="id"></div>
        <div>Escolha a Imagem:</div>
        <div><input type="file" name="imagem" id="imagem"></div>
        <div>
            <button type="submit">Enviar</button>
        </div>
    </form>
    <table>
        <tr>
            <td>Código</td>
            <td>Foto</td>
        <tr>
        <?php
            foreach($pdo->query('SELECT id, imagem FROM imagens ORDER BY id') as $item):            
        ?>
        <tr>
            <td><?php echo $item['id'];?></td>
            <td><img src="render.php?id=<?php echo $item['id'];?>" width="100px" /></td>
        <tr>
        <?php
            endforeach;
        ?>
    </table>
</body>
</html>

render.php: Responsible for displaying the image

<?php
  $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);    
  if (empty($id) === false){
      include 'conexao.php';
      
      $sts = $pdo->prepare('SELECT id, imagem, type, size FROM imagens WHERE id=? limit 1');
      $sts->bindValue(1, $id, PDO::PARAM_INT);
      $sts->execute();
      $item = $sts->fetch();
            
      header("Content-type: ".$item['type']);
      echo $item['imagem'];
  }

Table layout

CREATE TABLE `imagens` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `imagem` longblob NOT NULL,
  `type` varchar(30) DEFAULT NULL,
  `size` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

Resulting canvas

The screen works like this: if you inform the text box the change code choose the photo and send it changes the photo, if you choose only the photo and do not inform the text box it inserts the photo.

inserir a descrição da imagem aqui

Browser other questions tagged

You are not signed in. Login or sign up in order to post.