我如何在mysqli中输入图像?


How can I enter an image into mysqli?

我不太确定如何在PHP中处理图像以将其放入mysql中的blob类型。这是我到目前为止的代码…

<?php
    $servername = ""; //Taken out for stack overflow question
    $username = ""; //Taken out for stack overflow question
    $password = ""; //Taken out for stack overflow question  
    $dbname = ""; //Taken out for stack overflow question
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    if (!$conn)
    {
        echo 'Could not connect';
    }
    else 
    {
        if (!empty($_FILES['cf'] && $_POST['category']))
        {
            $file = $conn->real_escape_string($_FILES['cf']['tmp_name']);
            mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")");
        }
        else 
        {
            echo 'Empty file';
        }
    }
    mysqli_close($conn);
?>

现在图像的值不为空,因此图像被处理。但我似乎无法处理它。通常我创建一个变量$var = $_POST['cf'];然后将其添加到查询中。我还尝试了$var = $_FILES['cf'];但它不会处理。我还需要做些什么来使它正确发送/处理吗?

基于答案编辑

我把PHP改成了类似于答案的东西

<?php
    $servername = ""; //Taken out for stack overflow question
    $username = ""; //Taken out for stack overflow question
    $password = ""; //Taken out for stack overflow question  
    $dbname = ""; //Taken out for stack overflow question
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    if (!$conn)
    {
        echo 'Could not connect';
    }
    else 
    {
        if (!empty($_FILES['cf'] && $_POST['category']))
        {
            try
            {
                $file = $conn->real_escape_string($_FILES['cf']['tmp_name']);
                $filecontents = File_Get_Contents($file);
                $filecontentssafe = $conn->real_escape_string($filecontents);
                mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")");
                echo 'Query successful';
            }
            catch(Exception $e)
            {
                echo 'Could not perform action' + $e;
            }
        }
        else 
        {
            echo 'Empty file';
        }
    }
    mysqli_close($conn);
?>

现在我看到查询成功,但是…没有东西进入数据库。

编辑添加检索文件

<?php
    $servername = "";
    $username = "";
    $passcode = "";
    $dbname = "";
    $conn = mysqli_connect($servername, $username, $passcode, $dbname);
    if (!$conn)
    {
        echo 'Could not connect';
    }
    else 
    {
        try
        {
            $sql_query = mysqli_query($conn, "SELECT * FROM `adDatabase`");
            while ($row = mysqli_fetch_array($sql_query))
            {
                $id = $row['ID'];
                $img = $row['img'];
                $image = '<img src="data:image/png;base64,'.base64_encode( $row['food'] ).'" style="height: 12em; width: 12em; margin: 1em; padding: 0.9em; " >';
                echo $image;
            }
        }
        catch(Exception $e)
        {
            echo $e;
        }
    }
?>

如何检索信息

当你调用mysql时,$file只包含一个临时上传文件的路径,而不是你想要的数据。

如果您希望MySQL查看文件的路径,并将其内容直接加载到数据库中,请查看MySQL函数LOAD_FILE(): http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file

否则,如果您希望在PHP中执行此操作,则需要将文件的内容放入一个类似

的变量中。
$file_contents=File_Get_Contents($file);

…然后使用

$file_contents_safe=$conn->real_escape_string($file_contents);

在$file_contents_safe插入数据库之前。有些人还喜欢Base64编码。

编辑:正如其他人建议的那样,也请记住注入漏洞。临时文件的名称以及从post/apache传入的任何其他内容本身都不应该被信任。

如果您不必坚持在数据库中保存blob内容,那么您可以只在数据库中保存文件名,并将常规文件上传到选定的位置。为此,您需要在向数据库

中添加内容之前添加这个。
$tmp_name = $_FILES["filename"]["tmp_name"];
$name = $_FILES["filename"]["name"];
move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}");

上传文件后,您只需要在数据库中存储它的名称,而不是存储blob内容。在显示时,您只需要访问上传文件夹中的实际文件并显示它。这是一个更简洁的解决方案,特别是如果您不需要在服务器之间迁移文件。

整个代码看起来像这样:

if (!empty($_FILES['cf'] && $_POST['category']))
{
    $tmp_name = $_FILES["cf"]["tmp_name"];
    $name = $_FILES["cf"]["name"];
    move_uploaded_file($tmp_name, "YOUR_UPLOAD_DIR/{$name}");
    $file = $conn->real_escape_string($name);
    mysqli_query($conn, "INSERT INTO adDatabase(".$category.") VALUES(".$file.")");
}

然后在访问它时,您需要从数据库中提取数据并显示它。如果是图像,可以是

<img src="<?php YOUR_UPLOAD_DIR.'/'.$name ?>"/>
否则

:

在数据库中插入图像数据:

$content = file_get_contents($tmpName);
$file = $conn->real_escape_string($content);
$mime_type = mime_content_type($tmpName);
mysqli_query($conn, "INSERT INTO adDatabase(".$category.", mime_type) VALUES(".$file.", ".$mime_type.")");

注意,我在插入中添加了一个mime类型,因为您将需要它,以便稍后能够正确显示文件。

然后,当您想要显示它时,只需从db中提取内容并将其与适当的标题一起回显即可。

header('Content-type:'.$mime_type);
echo $content;