Good afternoon class, I have a system for creating feeds, which is possible to use image, which is configured in the base as longblob.
When I pass the direct variable to the query it works perfectly, but when I pass it through bind_param it gives the error.
The error: It does not insert correctly into the base, it appears as a blob file in phpmyadmin but when displaying the image it gets broken.
I'm showing like this:
echo '<img src="data:'.$feed[0]['fd_imagem_type'].';base64,'.base64_encode( $feed[0]['fd_imagem'] ).'" height="120" class="imgleft1"/>';
functions for insertion:
function type($args = [], $bind = false){
# Essa função retorna o codigo para o valor
# Se o $bind for igual a true, ela vai retornar os simbolos
$type = $binds = "";
$i = 1;
foreach($args as $valor){
switch(gettype($valor)){
case 'integer':
$type .= 'i';
break;
case 'double':
$type .= 'd';
break;
case 'string':
if (array_search($valor, $args) == 'fd_imagem') {
$type .= 'b';
} else {
$type .= 's';
}
break;
default:
$type .= 's';
break;
}
$binds .= "?";
if($i < count($args)){
$binds .= ", ";
}
$i++;
}
if($bind){
return $binds;
}
return $type;
}
function parametros($args=[], $sec=false){
# Essa função retorna os parametros já referenciados
# Se a variavel $sec for igual a true, ela vai retornar os campos separados por vírgulas
$type = type($args);
$parametro[] = &$type;
foreach($args as $key=>$valor){
$parametro[] =& $args[$key];
}
if($sec){
$campos = implode(', ', array_keys($args));
return $campos;
}
return $parametro;
}
function insert($mysqli,$tabela, $args = []){
$campos = parametros($args, true); # aqui passo os nomes dos campos da tabela
$binds = type($args, true); # aqui passo os simbolos (?) para a consulta
$sql = "INSERT INTO {$tabela} ({$campos}) VALUES ({$binds})";
if($prepare = $mysqli->prepare($sql)){
if(call_user_func_array(array($prepare, "bind_param"), parametros($args))){
if($prepare->execute()){
return true;
}
} else {
return $mysqli->error;
}
} else {
return $mysqli->error;
}
}
Here's the insert:
// verifica se foi enviada alguma imagem
if($_FILES['fd_imagem']['name']!=''){
$_POST['fd_imagem'] = addslashes(file_get_contents($_FILES['fd_imagem']['tmp_name']));
$_POST['fd_imagem_type'] = $_FILES['fd_imagem']['type'];
}else{
$_POST['fd_imagem'] = '';
$_POST['fd_imagem_type'] = '';
}
$result = insert($mysqli,'tabela',$_POST);
PS. the functions I took from Laura's example link: How do I pass dynamic parameters in a preparedStatment?