Jump to content
Fórum Script Brasil
  • 0

Formulário com imagem pro banco PHP


joanita
 Share

Question

neste codigo estou a receber um erro que não consigo resolver...

(Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in /home/index.php on line 23)

alem disso mal abre a pagina grava-me logo o registo e exibe o anterior, quando so o deveria fazer apos enviar o form pra base de dados.



<?php
//LIGA-SE Á BASE DE DADOS

include('ligar-bd.php');

//SE FOR PEDIDO UMA CONSULTA

if(!isset($_GET["getfile"])){

//SE ELA NÃO EXISTIR MOSTRA A MENSAGEM DE ERRO

    if ($_FILES["file"]["error"] > 0){
        echo "Erro: " . $_FILES["file"]["error"] . "<br>";

//CASO CONTRÁRIO

    }else{

//EXECUTA AÇÕES DE TRATAMENTO E CODIFICAÇÃO DAS IMAGENS

        move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

    $bin_string = file_get_contents($_FILES["file"]["name"]);
        $hex_string = base64_encode($bin_string);

//CARREGA TODAS AS OPÇÕES DO FORMULÁRIO

    $nome = $_POST['nome'];

//INSERE OS DADOS NA BASE DE DADOS

    $mysqli->query(" INSERT INTO teste(imagem,nome) VALUES ('" . $hex_string . "','$nome') ");
    }

//SE AINDA NADA FOI PEDIDO PARA SER MOSTRADO

}else{

//SELECIONA NA BASE DE DADOS A ULTIMA ENTRADA

        if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){

            if($row = $result->fetch_assoc()){
                $output_hex_string = $row["imagem"];
                $output_bin_string = base64_decode($output_hex_string);

                header("Content-Type: image/png");
                header("Content-Length: " . strlen($output_bin_string));

//MOSTRA A ULTIMA ENTRADA

                $result->free();
                echo $output_bin_string;
                }
        }
  }
?>  






<html>
<body>

<form action="" method="POST" enctype="multipart/form-data">
    Nome: <input type="text" name="nome">
    <br>
    Imagem: <input type="file" name="file">
    <br>
    <input type="submit">
</form>






<?php
//MOSTRA OS RESULTADOS

echo "<h2>Nome:<i> $nome </i></h2>";
?>

<img src="index.php?getfile=1">

</body>
</html>

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

não... se estivesse não dava o erro, eu fiz print $_FILES; e aparece apenas escrito "Array"... com print_r $_FILES; aparece Parse error: syntax error, unexpected T_VARIABLE in /home/rpublici/public_html/teste/index.php on line 6

 

não sei se isso se deve ao script estar a gravar no banco um registo vazio mal se abre a pagina, mesmo antes de enviar alguma coisa

Edited by joanita
Link to comment
Share on other sites

  • 0

dividi em 3 ficheiros e ficou bom, o index.php com o form, o envia.php com o php para enviar e o ultimo_envio.php para include do ultimo post. Gostaria mesmo é de criar um campo para categoria abaixo do Nome,  coisa que ando á meses a tentar e ainda não consegui fazer as categorias :(

Se me puderes ajudar agradeço!

vê como ficou...

 

index.php

<?php
include "estilos/estilos.css";
?>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html>
<body>

<center>
<h2>Adicionar Nova Entrada</h2>
<form action="envia.php" method="POST" enctype="multipart/form-data">

<table align="center" width="300px" border="0" cellpading="4" cellspacing="8"  bgcolor="#f0f0f0">
<tr><td align="center">

<hr size=1 width=300 class="degrade">
Nome:
<br>
<input type="text" name="nome">
<br>
Adicionar uma imagem:
<br>
<input type="file" name="file">

<hr size=1 width=300 class="degrade">
<br>
<input type="submit" value="Adicionar Entrada" class="button buttonfx buttonredondo">
<br>
<br>

</td></tr></table>
</form>
<hr size=1 width=300 class="listado">

</center>

</body>
</html>

 

 

envia.php

<?php
include('ligar-bd.php');

if(!$_GET[getfile]){
if ($_FILES["file"]["error"] > 0){
    echo "Ups... falha no envio, tente novamente. ERRO: " . $_FILES["file"]["error"] . "<br>";
    }else{
    move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);
    $bin_string = file_get_contents($_FILES["file"]["name"]);
    $hex_string = base64_encode($bin_string);
    $nome = filter_var($_POST['nome'], FILTER_SANITIZE_STRING);
    $mysqli->query(" INSERT INTO teste(
    imagem,
    nome
    ) VALUES (
    '" . $hex_string . "',
    '$nome'
    ) ");
    }
}else{
    if ($result = $mysqli->query(" SELECT * FROM teste ORDER BY id DESC ")){
        if($row = $result->fetch_assoc()){
            $output_hex_string = $row["imagem"];
            $output_bin_string = base64_decode($output_hex_string);
            header("Content-Type: image/png");
            header("Content-Length: " . strlen($output_bin_string));
            $result->free();
            echo $output_bin_string;
            }
        }
    }
include "ultimo_envio.php";
?>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

 

 

ultimo_envio.php

<html>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
echo "
<center>
<hr size=1 width=300 class='degrade'>
Última entrada adicionada:
<br>
<i><b> $nome </b></i>
<hr size=1 width=300 class='listado'>
<a href='envia.php?getfile=1' target='blank''><img src='envia.php?getfile=1'></a>
";
include "index.php";
?>
</center>
</body>
</html>

 

 

Edited by joanita
Link to comment
Share on other sites

  • 0

A forma mais simples é criar um input text para o nome da categoria e salvar o valor desse input no banco de dados.

Dá pra aprimorar. Em vez do input, usar um <select> que busca as categorias no banco, caso haja uma lista pré-definida de categorias

Link to comment
Share on other sites

  • 0

pois era isso que queria,  criar um campo para escolher a categoria existente ou digitar a categoria nova, mas o meu problema parte muite de como tudo isso joga com o banco... criar o input é facil, o problema é depois as ligaçoes entre IDs de categorias/subcategorias com o id do $nome.

Neste caso com o meu código que te mostrei acima, podes dar-me um exemplo visual de como farias?

Link to comment
Share on other sites

  • 0

assim... ? isto parece-me um select comum... como posso depois permitir a inserção de novas categorias que não estejam pre-definidas (supondo que queres adicionar umproduto numa categoria nova não existente)

Categoria:
<br>
<select name="categoria" id="catid">
<option>Aromáticas</option>
<option>Malaguetas</option>
<option>Legumes</option>
<option>Árvores</option>
<option>Sebes e Arbustos</option>
<option>Flores</option>
</select>

Link to comment
Share on other sites

  • 0

Um campo <select> não permite adicionar valores. Se quiser permitir a inserção de novas categorias, use um campo input text.

 

Sobre a modelagem obsoleta, não entendi seu argumento. A modelagem do banco independe de SGBD. E uso MySQLi orientado a objetos no exemplo. O que acha que está obsoleto?

Link to comment
Share on other sites

  • 0

ola, não esta nada, pareceu-me estar ainda em msql antigo, mas vi mal desculpa.

então mas  voltando ao assunto, normalmente aparece um input para adicionar nova categoria com um select a frente para escolher uma categoria caso esta já exista e não queiramos criar uma nova.

Link to comment
Share on other sites

  • 0

Em casos assim, esse input text recebe o nome de uma nova categoria e o salva no banco via Ajax, atualizando o <select>, para que a categoria possa ser selecionada. É uma lógica um pouco mais avançada, mas não é muito complexa. Se você conhecer um pouco sobre Ajax, não terá grandes dificuldades

Link to comment
Share on other sites

  • 0
Em 07/04/2016 at 17:54, Beraldo disse:

Em casos assim, esse input text recebe o nome de uma nova categoria e o salva no banco via Ajax, atualizando o <select>, para que a categoria possa ser selecionada. É uma lógica um pouco mais avançada, mas não é muito complexa. Se você conhecer um pouco sobre Ajax, não terá grandes dificuldades

olha aí Beraldo...

<div class="formularioPainel">
           
<form action="" method="POST" enctype="multipart/form-data">
    <label>
    <titulo>Selecione ou insira uma nova Categoria ou Subcategoria: </titulo>
    <br>
    <span>Categorias: </span>
    <select name="categoria">
    <option>DEVIA LER E MOSTRAR AS ENTRADAS DO CAMPO "categoria" NA BASE DE DADOS "teste"</option>
    </select>
    </label>
    <br>
    <span>Insira a nova Categoria/Subcategoria: </span>
    <label>
    <input type="text" name="categoria" value=""/>
    </label>
    <input type="submit" value="Enviar" />
    <input type="hidden" name="acao" value="adicionar_categoria" />
</form>

</div>

<?php

// LIGA-SE Á BASE DE DADOS
include('ligar-bd.php');
include('estilos/estilos.css');

// INFORMA QUE VAI USAR UTF8 AO GRAVAR NA BASE DE DADOS
$mysqli->set_charset('utf8');
                                           
    if(isset($_POST['acao']) && $_POST['acao'] == "adicionar_categoria"){
        
        $categoria = $_POST['categoria'];
                   
        // SE A CATEGORIA ESTIVER VAZIA MOSTRA A MENSAGEM
        if($categoria == ""){
            echo "<script>alert('O campo categoria não pode ficar vazio!')</script>";

                        }else{

            // SELECIONA A CATEGORIA NA BASE DE DADOS
            $seleciona = $mysqli->query("SELECT * FROM teste WHERE categoria = '$categoria'");
                   
            //SE A CATEGORIA EXISTIR NA BASE DE DADOS MOSTRA A MENSAGEM
            if(mysqli_num_rows($seleciona) == 1) {
                               echo "<script>alert('Esta categoria já existe!')</script>";

                        }else{

            // INSERE NA BASE DE DADOS
                        $insere = $mysqli->query("INSERT INTO teste (categoria) VALUES('$categoria')");
                        echo "<script>alert('Adicionado com sucesso!')</script>";
            }
        }
    }

?>

 

e na minha tabela tenho estes campos:

`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) CHARACTER SET utf8 NOT NULL,
`imagem` longtext CHARACTER SET utf8 NOT NULL,
`catid` int(11) NOT NULL,

`categoria` varchar(50) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.1k
×
×
  • Create New...