Update LONGBLOB field possible?

3

I have a script that uploads images to a table with LONGBLOB field, uploads any image, and displays it without any problems.

My question is: even though I know we should not insert images in mysql , is there a way to UPDATE , or even INSERT through a certain ID to this LONGBLOB field? In this case, how would I do to update the images inserted in the database?

    
asked by anonymous 28.04.2014 / 23:30

1 answer

2

You do have to update the photo field that is in type LONGBLOB .

Scripts

connection.php: Responsible for connecting to the MySQL database made at PDO

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

Index.php: Responsible for inserting, changing and listing the photos that are stored in the database with the%

<?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 screen

The screen works like this: if you tell the text box the code to change 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. >

    
29.04.2014 / 03:46