[PHP] Como adicionar o nome da imagem ao banco de dados?

Bom dia, gostava de saber como é possível colocar o nome do ficheiro q eu der upload na base de dados… no campo imagem_noticia
image

image

Gostaria de saber como fazer… O meu input é assim:
<input type="file" name="file"/>

$nome_original = $_FILES["file"]["name"];

Se quiser o nome sem o formato do arquivo, pode usar o basename()
http://php.net/manual/pt_BR/function.basename.php

Nesse exemplo do W3School tem algumas validações:
https://www.w3schools.com/php/php_file_upload.asp

Boa tarde, obrigado pela resposta. Não estou conseguindo, não sei se estou fazendo algo de errado também… O meu código está assim!

<input type="file" id="imagem" name="file"/>

E no meu PHP… :

$nome_original = $_FILES["imagem"]["name"];

$query = "INSERT INTO noticias(imagem_noticia) VALUES ('$nome_original', '$datanoticia')";

Você tem que alterar o name do input, se você quiser usar o $_FILES

<input type="file" id="imagem" name="imagem"/>

$_FILES[  Aqui é o NAME do input, não o ID  ]["name"];

Ou usar do jeito que eu mandei mesmo, já que o name = file

$nome_original = $_FILES["file"]["name"];

Não está funcionando…
HTML:
<input type="file" id="imagem" name="imagem"/>

Código PHP:

$imagem = $_FILES["imagem"]["name"];

Código SQL:
$query = "INSERT INTO noticias(imagem_noticia) VALUES ('$imagem')";

O que é que será que estou fazendo de errado? :confused:

Talvez esse seja o problema?
É que tenho uma <form>

<form method="post" action="upload.php" enctype="multipart/form-data">
`<p>Imagem:</p>`
    <input type="file" id="imagem" name="file"/>
    <button ng-disabled="verificarcampos()" type="submit" name="submit" ng-click="adicionar()">Publicar Notícia<button>
    </form>

Como pode verificar o metodo é post no upload .php… e tou usando outro ficheiro (index.php) que serve apenas pra enviar dados para o banco de dados, será essa a razão de não conseguir ler o nome do ficheiro? Obs: o index.php é que está tentando ler o nome do ficheiro pra enviar para o banco de dados.

Se este form está dando POST para a página upload.php, as informações deste formulário vão ser enviadas para o upload.php.

Não sei se entendi muito bem, você está usando apenas um arquivo (index.php), contendo o formulário e salvando no banco?
Senão é só alterar o action para index.php

<form method="post" action="index.php" enctype="multipart/form-data">

Sua index.php está +/- assim?

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    $target_file =  basename($_FILES["file"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
    // Check if image file is a actual image or fake image
    if(isset($_POST["submit"])) {
        $check = getimagesize($_FILES["file"]["tmp_name"]);
        if($check !== false) {
            echo "File is an image - " . $check["mime"] . ".";
            $uploadOk = 1;
        } else {
            echo "File is not an image.";
            $uploadOk = 0;
        }
    }
    // Check if file already exists
    if (file_exists($target_file)) {
        echo "Sorry, file already exists.";
        $uploadOk = 0;
    }
    // Check file size
    if ($_FILES["file"]["size"] > 500000) {
        echo "Sorry, your file is too large.";
        $uploadOk = 0;
    }
    // Allow certain file formats
    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
    && $imageFileType != "gif" ) {
        echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
        $uploadOk = 0;
    }
    // Check if $uploadOk is set to 0 by an error
    if ($uploadOk == 0) {
        echo "Sorry, your file was not uploaded.";
    // if everything is ok, try to upload file
    } else {
        if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.";
        } else {
            echo "Sorry, there was an error uploading your file.";
        }
    }
}
else{
    echo '<!DOCTYPE html>
<html>
<body>

<form action="index.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="file" id="imagem">
    <input type="submit" value="Upload Image" name="submit">
</form>

</body>
</html>
';
}

Bom dia, minha index.php não tem nada sobre a imagem, como eu disse é apenas pra adicionar á base de dados… aqui está o código do meu index.php

Código:

<?php

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require '../vendor/autoload.php';

$app = new \Slim\App;
// Get container
$container = $app->getContainer();

// Register component on container
$container['view'] = function ($container) {
    $view = new \Slim\Views\Twig('../src/view/', [
//'cache' => 'path/to/cache'
    ]);

    // Instantiate and add Slim specific extension
    $router = $container->get('router');
    $uri = \Slim\Http\Uri::createFromEnvironment(new \Slim\Http\Environment($_SERVER));
    $view->addExtension(new Slim\Views\TwigExtension($router, $uri));

    return $view;
};

$app->get('/', function (Request $request, Response $response, array $args) {
    return $this->view->render($response, 'index.html');

});

$app->post('/inserirAlerta', function (Request $request, Response $response, array $args) {
    $conn = mysqli_connect("localhost", "root", "", "noticia");
    if (!$conn) {
        $data=array("status"=>"Nao foi possivel conectar com a base de dados.");
        return $response->withJson($data);
        die("Erro: " . mysqli_connect_error());
    }
    $info= json_decode(file_get_contents("php://input"));
    $titulonoticia = mysqli_real_escape_string($conn, $info->titulo);
    $descricaonoticia = mysqli_real_escape_string($conn, $info->descricao);
    $nome_original = $_FILES["file"]["name"];
    $datanoticia = mysqli_real_escape_string($conn, $info->data);
    $tiponoticia = mysqli_real_escape_string($conn, $info->tipo);
    $query = "INSERT INTO noticias(titulo_noticia, texto_noticia, imagem_noticia, data_noticia, tipo_noticia) VALUES ('$titulonoticia', '$descricaonoticia', '$nome_original', '$datanoticia','$tiponoticia')";
    if(mysqli_query($conn, $query)) 
    {
        $data=array("status"=>"Inserido");
    }
    else
    {
        $data=array("status"=>"Erro");
    }
});

$app->run();

Tá muito difícil resolver isso daqui :confused:

Se me conseguisse ajudar seria mesmo fantástico, obrigado pela sua resposta também!

Se você der o print na variável $nome_original, o que aparece?
Talvez, por causa do framework, essa variável não esteja mais com essa informação, mas esteja no $request.
Nunca usei mas dando um procurada sobre upload de arquivo achei essa página. http://www.slimframework.com/docs/v3/cookbook/uploading-files.html

Invés de usar a variavel $_FILES, você precisa usar $request com as especificações desse framework.

    $uploadedFiles = $request->getUploadedFiles();

 // handle single input with single file upload
    $uploadedFile = $uploadedFiles['example1'];
    if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
        $filename = moveUploadedFile($directory, $uploadedFile);
        $response->write('uploaded ' . $filename . '<br/>');
    }

Tá dando erro… Talvez não esteja bem… Voce tem discord?

Só se tiver.

Como não consigo usar SLIM agora, fiz só não testei, dá CTRL+F e pesquisa por //ADD e //REMOVE, são as partes que eu adicionei ou removi algo no código.

<?php

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require '../vendor/autoload.php';

$app = new \Slim\App;
// Get container
$container = $app->getContainer();
$container['upload_directory'] = __DIR__ . '/uploads';//ADD - AQUI É A PASTA ONDE VAI SER SALVA A IMAGEM

// Register component on container
$container['view'] = function ($container) {
    $view = new \Slim\Views\Twig('../src/view/', [
//'cache' => 'path/to/cache'
    ]);

    // Instantiate and add Slim specific extension
    $router = $container->get('router');
    $uri = \Slim\Http\Uri::createFromEnvironment(new \Slim\Http\Environment($_SERVER));
    $view->addExtension(new Slim\Views\TwigExtension($router, $uri));

    return $view;
};

$app->get('/', function (Request $request, Response $response, array $args) {
    return $this->view->render($response, 'index.html');

});


$app->post('/inserirAlerta', function (Request $request, Response $response, array $args) {
    $conn = mysqli_connect("localhost", "root", "", "noticia");
    if (!$conn) {
        $data=array("status"=>"Nao foi possivel conectar com a base de dados.");
        return $response->withJson($data);
        die("Erro: " . mysqli_connect_error());
    }
    $info= json_decode(file_get_contents("php://input"));
    $titulonoticia = mysqli_real_escape_string($conn, $info->titulo);
    $descricaonoticia = mysqli_real_escape_string($conn, $info->descricao);


    //$nome_original = $_FILES["file"]["name"];//REMOVE - Não esta funcionando 

    //ADD
    $directory = $this->get('upload_directory');
    $uploadedFiles = $request->getUploadedFiles();
    // handle single input with single file upload
    $uploadedFile = $uploadedFiles['file'];
    if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
        $filename = moveUploadedFile($directory, $uploadedFile);
        $nome_original = $filename; 
        $response->write('uploaded ' . $filename . '<br/>');
    
    }
    //ADD


    $datanoticia = mysqli_real_escape_string($conn, $info->data);
    $tiponoticia = mysqli_real_escape_string($conn, $info->tipo);
    $query = "INSERT INTO noticias(titulo_noticia, texto_noticia, imagem_noticia, data_noticia, tipo_noticia) VALUES ('$titulonoticia', '$descricaonoticia', '$nome_original', '$datanoticia','$tiponoticia')";
    if(mysqli_query($conn, $query)) 
    {
        $data=array("status"=>"Inserido");
    }
    else
    {
        $data=array("status"=>"Erro");
    }
});


//ADD
/**
 * Moves the uploaded file to the upload directory and assigns it a unique name
 * to avoid overwriting an existing uploaded file.
 *
 * @param string $directory directory to which the file is moved
 * @param UploadedFile $uploaded file uploaded file to move
 * @return string filename of moved file
 */
function moveUploadedFile($directory, UploadedFile $uploadedFile)
{
    $extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION);
    $basename = bin2hex(random_bytes(8)); // see http://php.net/manual/en/function.random-bytes.php
    $filename = sprintf('%s.%0.8s', $basename, $extension);

    $uploadedFile->moveTo($directory . DIRECTORY_SEPARATOR . $filename);

    return $filename;
}

$app->run();