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. >