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.
That answer was correct to your question, Marcelo?
– user6026