【问题标题】:Problem using AJAX to import image from MySQL blob into HTML file input type使用 AJAX 将图像从 MySQL blob 导入 HTML 文件输入类型的问题
【发布时间】:2019-07-13 22:15:19
【问题描述】:

标题听起来很混乱,所以我先详细说明一下。我有一个网站,除其他外,它允许用户从他们的手机上传图片,这些图片进入 MySQL 数据库并以 blob 格式存储,可以正常工作。我还有一个运行 AJAX 功能的按钮,它允许用户从所述 MySQL 数据库导入信息,然后将其返回到相同的 HTML 字段(继续他们离开的地方)。这个 AJAX 函数适用于除我用于图片的“文件”HTML 输入字段类型之外的所有内容。

为了将文件数据导入 MySQL,我使用 addslashes(file_get_contents($image));,我猜我必须撤消才能将其放回文件输入字段中。如果是这样,我不知道该怎么做。我的猜测是文件数据以一种格式存储在 HTML 输入字段类型中,而以另一种格式存储在 MySQL 中,但我什至不确定这一点,更不用说如果确实是问题,如何解决这个问题。

如果他们有帮助,这里有一些不同的位。

HTML / AJAX:

<button type="button" id = 'ajaxButton' onClick = 'imAnAjaxFunction()';>TEST</button>

<label for="Image1"> Picture 01: </label>
<input type="file" id="Image1" name="Image1" value="Image1" 

<script>
function imAnAjaxFunction()
{   
var val1 = $('#Serial').val(); //
var request = $.ajax({
    url: 'import.php',
    type: 'get',
    data: { Serial: val1 }, //
    dataType: 'html'
});

request.done( function ( data ) {
    //alert(data);
});

request.fail( function ( jqXHR, textStatus) {
    console.log( 'Sorry: ' + textStatus );
});

var val1 = $('#Serial').val(); //
$.ajax
({
    url: 'import.php',
    type: 'get',
    dataType: 'JSON',
    data: { Serial: val1 }, //
    success: function(response)
    {
        var len = response.length;
        for(var i=0; i<len; i++)
        {
            document.getElementById('DateSet').value = response[i].DateSet;
            document.getElementById('JobName').value = response[i].JobName;
            document.getElementById('Image1').value = response[i].Image1;
        }
    }
})

}
</script>

insert.php 大部分我不认为是相关的

$image = $_FILES['Image1']['tmp_name'];
$imagetmp=addslashes(file_get_contents($image));

import.php

<?php
ob_start();

$servername = "";
$username = "";
$password = "";
$dbname = "";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT * FROM setcrewreport WHERE Serial = '$_GET[Serial]'";

$result = $conn->query($sql); //query

if ($result->num_rows > 0) 
{
// output data of each row
while($row = $result->fetch_assoc())
{
    $Serial = $row['Serial'];
    $DateSet = $row['DateSet'];
    $JobName = $row['JobName'];
    $Image1   = $row['Image1'];

    $return_arr[] = array("Serial" => $Serial,
                          "DateSet" => $DateSet,
                          "JobName" => $JobName,
                          "Image1" => $Image1);
}
ob_end_clean();
// Encoding array in JSON format
echo json_encode($return_arr);
}
else
{
echo "0 results";
}

$conn->close();
?>

这离参数化 SQL 语句有多近?

$sql = $mysqli->prepare("SELECT * FROM setcrewreport WHERE Serial = ?");
$sql ->bind_param("si", '$_GET[Serial]');

【问题讨论】:

  • 如果你想要一个建议:不要将图片保存在数据库中,数据库会变得很大,它的性能会下降。最好只保存图片的路径或获取该路径所需的信息并保持数据库整洁
  • 顺便说一句,学习使用prepared statements也比使用addslashes函数更好地防止你的数据库受到内存注入攻击
  • 在这种情况下,我认为您无法通过这种方式获取文件片段并将它们放在 json 上。如果你真的想要它在那个json中,你可以尝试在base64之前对其进行编码,然后在接收到json的数据后使用base64解码。发送的数据会更大,但会被安全地编码在一个字符串上,成为 json 的一部分
  • html文件上传控件只保存待上传文件在客户端的本地路径。您不能以编程方式设置其值,这将是一个巨大的安全漏洞!
  • 我不知道你在说什么。将代码放在问题中。在 cmets 中很难阅读。

标签: php html mysql ajax


【解决方案1】:

我最初的目标是不可能的,所以我要走另一条路。

SQL 语句参数化如下:

$sql = $conn->prepare("SELECT * FROM setcrewreport WHERE Serial = ?");
$sql->bind_param("s", $_GET['Serial']);
$sql->execute();

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多