【问题标题】:Clerification needed re: INSERT base64 to BLOB in mySQL database需要重新澄清:在 mySQL 数据库中将 base64 插入到 BLOB
【发布时间】:2018-01-24 00:20:03
【问题描述】:

我正在使用画布元素收集协议表单上的签名。在提交表单之前,canvas 元素被转换为 base64 字符串,然后存储在 HIDDEN 表单字段中。

当 base64 字符串到达​​正在处理表单元素并将其插入到我的数据库中的 PHP 页面时,它看起来如下所示:

data:image/jpeg;base64,/9j/4AAQSkZJ......RgABAQAAS

我尝试了许多不同的 ENCODE 和 DECODE 组合... ESCAPE_STRING ... GET FILE CONTENTS... 将此 base64 字符串保存到我的数据库中,但数据从未进入数据库。

我的 PHP 正在将此表单插入到我的数据库中,目前看起来像:

<?php 
include ('header.php');
include ('connect.php');
// prepare and bind
$stmt = $conn->prepare("INSERT INTO deposit (type, amount, created, agreement, signature, project_id) VALUES (?,?,?,?,?,?)");
$stmt->bind_param("ssssbs", $type, $amount, $created, $agreement, $signature, $project_id);
// set parameters
$created = date("Y-m-d H:i:s");
$amount = htmlspecialchars($_POST['amount']);
$type = htmlspecialchars($_POST['type']);
$agreement = $_POST['agreement'];


$hidden_data = $_POST['hidden_data'];
$escaped = mysqli_real_escape_string ($hidden_data);
$signature = base64_decode($escaped);


$project_id = $_POST['project_id'];
// execute 
$stmt->execute();
$deposit_id = ($stmt->insert_id);
echo "$amount - created successfully";
$stmt->close();
?>
<form action="project.php" method="post">
    <div class="wrapper">   
        <input name="project_id" value="<?php echo $project_id; ?>" type="hidden">
        <input type="submit" value="Go back to project">
    </div>  
</form>
<?php 
include ('disconnect.php');
include ('footer.php');
?>

如果我正确理解流程,我需要:

1) 从字符串的开头去除“data:image/jpeg;base64”

2) 转换或解码或编码剩余数据

3) 使用 INSERT 将数据保存到 BLOB

我找到的有关此过程的大部分信息看起来与我在此处的代码设置方式大不相同,以至于我不明白如何重新组织它以适应我在这里的内容。有人可以为我澄清一下这个过程在我在这里使用的 CODE 结构类型中是如何工作的吗?

我在这个应用程序中确实有另一个地方,它从相机收集图像,将其存储在一个文件中,并使用 $_FILE 而不是 $_POST 进行处理。这个过程有效,图像存储在数据库 BLOB 中,我可以稍后获取信息以供显示。该代码如下所示:

$data = $conn->real_escape_string(file_get_contents($_FILES  ['uploaded_file']['tmp_name']));

我尝试将 $_FILES 更改为 $_POST 但这只是破坏了一切。

提前感谢您抽出宝贵时间。

编辑 1:

这里是收集这里使用的数据的表格:

<?php 
include ('header.php');
include ('legal_deposit_agreement_display.php');
?>
<form action="legal_deposit_agreement_create.php" method="post" enctype="multipart/form-data" id="form" name="form">

    <input name="hidden_data" id='hidden_data' type="hidden"/>
    <input name="project_id" value="<?php echo $project_id; ?>" type="hidden">

    <h1>Deposit</h1>

    <div class="wrapper">
        <label>Ammount of Deposit</label><br>
        <input name="amount" value="<?php echo $amount; ?>" placeholder="Enter Ammount of deposit here" type="text" tabindex="1" required>
    </div>

    <div class="wrapper">   
        <label>Payment Type</label><br>
        <select name="type" tabindex="3">
            <option value="Cash/Credit"<?php if ($type == 'Cash/Credit') echo ' selected="selected"'; ?>>Cash/Credit</option>
            <option value="Gift Certificate"<?php if ($type == 'Gift Certificate') echo ' selected="selected"'; ?>>Gift Certificate</option>
        </select>
    </div>

    <div class="wrapper">
        <label>Deposit Agreement</label><br>
        <textarea id="agreement" name="agreement" style="overflow:hidden" TextMode="MultiLine" onkeyup="setHeight('textBox1');" onkeydown="setHeight('textBox1');" tabindex="4" value="<?php include 'text/depositAgreement.txt';?>"><?php include 'text/depositAgreement.txt';?></textarea>
        <script type="text/javascript">
            function setHeight(fieldId){
                document.getElementById(fieldId).style.height = document.getElementById(fieldId).scrollHeight+'px';
            }
            setHeight('agreement');
        </script>
    </div>

    <div id="signature-pad" class="signature-pad">
        <div class="signature-pad--body">
          <canvas id="canvas" name="canvas"></canvas>
        </div>
        <div class="signature-pad--footer">
          <div class="description">Sign above</div>

          <div class="signature-pad--actions">
            <div>
              <button type="button" class="button clear" data-action="clear">Clear</button>
            </div>
          </div>

        </div>
    </div>

    <script src="js/signature_pad.js"></script>
    <script src="js/app.js"></script>

    <div class="wrapper">
    <input type="button" onclick="convert()" value="I AGREE TO ALL OF THE TERMS DESCRIBED ABOVE">
    </div>

</form>

<script>
    function convert() {
        document.getElementById('hidden_data').value = canvas.toDataURL('image/jpeg', 0.5);
        document.forms["form"].submit();
    };
</script>

<?php include ('footer.php');?>

【问题讨论】:

  • 你说:"那段代码看起来像:$data = $conn-&gt;real_escape_string(file_get_contents($_FILES ['uploaded_file']['tmp_name']));" - 但是这行代码$escaped = mysqli_real_escape_string ($hidden_data); 失败了。那么,你为什么不把连接也传递给它呢?如果这就是全部,那么它就有一个副本。但是,没有输入该名称。
  • 那么,带有文件输入的表单在哪里呢?这个问题不清楚。
  • 在我用来将照片发送到数据库的代码中,$conn 只被调用了一次。在我用来发送此表单的代码中,它在代码的前面被调用,所以我不确定是否需要再次调用它。当我试图将 $conn 保留在那里时,代码坏了,根本没有任何效果。目前我使用的代码插入了除 BLOB 之外的所有内容。
  • 我将在编辑中添加输入页面的表单代码。
  • 您有 2 个不同的文件和 2 个不同的表格。如果您要同时使用两者,请使用会话。

标签: php mysql forms canvas


【解决方案1】:

文件/$_FILES 需要 &lt;form&gt; 中的有效编码类型,即 enctype="multipart/form-data",这不是您发布的内容的一部分。

其中应该有一个file 的输入类型并为其使用命名属性,然后将该变量传递给分配给$_FILES 超全局变量。然后,您可以像在 bind_param() 中一样使用 b

此行不包含您帖子中的文件输入:

$data = $conn->real_escape_string(file_get_contents($_FILES  ['uploaded_file']['tmp_name']));

如果您想将 BLOB 上传到您的数据库,请使用我在此处发布的内容并阅读有关处理文件的手册。

此行失败,因为您没有为其传递连接参数:

$escaped = mysqli_real_escape_string ($hidden_data);

应该读作:

$escaped = mysqli_real_escape_string ($conn, $hidden_data);

【讨论】:

  • 在这种情况下,我没有使用 $_FILES,因为 base64 字符串是由 JS 生成的,并在提交表单之前放入隐藏的文本字段中。我确实按照您的描述将 $conn 添加到了我当前的代码中,但数据库中仍然没有存储任何数据。
  • @inkslinger 在查询中使用 php 的错误报告和 mysqli_error($conn),看看会产生什么。
  • 我现在正试图弄清楚如何使用错误报告。我可能需要一些时间来弄清楚如何正确使用它。我会尽快公布结果。感谢您迄今为止的帮助。
  • @inkslinger ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); 是如何检查 php 错误以及我在另一条评论中为上述查询发布的内容。
  • 好的,我添加了:ini_set('display_errors', 1); ini_set('display_startup_errors', 1);错误报告(E_ALL);在我的 php 代码之上。如何正确使用 mysqli_error($conn) 部分?我只是在最后将它添加到我当前的 PHP 中,还是我必须 Echo 某些东西才能显示?对于我对这一切的不熟悉,我深表歉意。我一边走一边自学。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2012-12-05
  • 2011-12-28
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多