PHP 似乎没有处理要发布到 MySQL 的脚本

标签 php jquery mysql ajax

我正在使用 html5 canvas 捕获签名并将其存储在 MySQL 中。除了保存签名并将其发送到 MySQL 的部分外,脚本中的所有内容都可以正常工作。 我对 AJAX 一无所知,所以我正在研究我在书中读到的内容,查看教程并从这里获得帮助。

所以在 Firefox 控制台中,当我点击保存签名时,我可以看到脚本显示了它应该去的 post.php 文件并显示了一个 200 ok 通知,但是没有任何反应,它没有在 MySQL 中发布(它没有不要让我感到惊讶,因为我确定我的代码不正确)并且我没有看到任何错误。

我要完成的是将签名图片上传到服务器上的一个文件夹中,并将图片的路径保存在MySQL中。由于不熟悉 JavaScript、Jquery 和 Ajax,我对如何让它发挥作用感到困惑。

这是 jquery:

$(document).ready(function () {
/** Set Canvas Size **/
var canvasWidth = 400;
var canvasHeight = 75;

/** IE SUPPORT **/
var canvasDiv = document.getElementById('signaturePad');
canvas = document.createElement('canvas');
canvas.setAttribute('width', canvasWidth);
canvas.setAttribute('height', canvasHeight);
canvas.setAttribute('id', 'canvas');
canvasDiv.appendChild(canvas);
if (typeof G_vmlCanvasManager != 'undefined') {
    canvas = G_vmlCanvasManager.initElement(canvas);
}
var context = canvas.getContext("2d");

var clickX = new Array();
var clickY = new Array();
var clickDrag = new Array();
var paint;

/** Redraw the Canvas **/
function redraw() {
    canvas.width = canvas.width; // Clears the canvas

    context.strokeStyle = "#000000";
    context.lineJoin = "miter";
    context.lineWidth = 2;

    for (var i = 0; i < clickX.length; i++) {
        context.beginPath();
        if (clickDrag[i] && i) {
            context.moveTo(clickX[i - 1], clickY[i - 1]);
        } else {
            context.moveTo(clickX[i] - 1, clickY[i]);
        }
        context.lineTo(clickX[i], clickY[i]);
        context.closePath();
        context.stroke();
    }
}

/** Save Canvas **/
$("#saveSig").click(function saveSig() {
    //encode URI
    var sigData = encodeURIComponent(canvas.toDataURL("image/png"));
$("#imgData").html('Thank you! Your signature was saved');
    var ajax = XMLHttpRequest();
    ajax.open("POST", 'post.php');
    ajax.setRequestHeader('Content-Type', 'application/upload');
    ajax.send(sigData);
   // $('#debug').html(sigData);
});

/** Clear Canvas **/
$('#clearSig').click(
    function clearSig() {
        clickX = new Array();
        clickY = new Array();
        clickDrag = new Array();
        context.clearRect(0, 0, canvas.width, canvas.height);
});

/**Draw when moving over Canvas **/
$('#signaturePad').mousemove(function (e) {
    if (paint) {
        addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true);
        redraw();
    }
});

/**Stop Drawing on Mouseup **/
$('#signaturePad').mouseup(function (e) {
    paint = false;
});

/** Starting a Click **/
function addClick(x, y, dragging) {
    clickX.push(x);
    clickY.push(y);
    clickDrag.push(dragging);
}

$('#signaturePad').mousedown(function (e) {
    var mouseX = e.pageX - this.offsetLeft;
    var mouseY = e.pageY - this.offsetTop;

    paint = true;
    addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop);
    redraw();
});

});

这是 PHP:此外,我没有在下面编写 PHP 代码,它是整个签名板的一部分,所以我确定它不正确。

<?php
session_start();
if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
{
$session_id = $_SERVER['REMOTE_ADDR'];
// Get the data
$imageData=$GLOBALS['HTTP_RAW_POST_DATA'];

// Remove the headers (data:,) part.
// A real application should use them according to needs such as to check image type
$filteredData=substr($imageData, strpos($imageData, ",")+1);

// Need to decode before saving since the data we received is already base64 encoded
$unencodedData=base64_decode($filteredData);

//echo "unencodedData".$unencodedData;
$imageName = "sign_" . rand(5,1000) . rand(1, 10) . rand(10000, 150000) . rand(1500,   100000000) . ".png";
//Set the absolute path to your folder (i.e. /usr/home/your-domain/your-folder/
$filepath = "xampp/htdocs/alpha/site7/images/" . $imageName;

$fp = fopen("$filepath", 'wb' );
fwrite( $fp, $unencodedData);
fclose( $fp );

//Connect to a mySQL database and store the user's information so you can link to it later
$link = mysql_connect('localhost','root', 'password') OR DIE(mysql_error);
mysql_select_db("customer", $link);
mysql_query("INSERT INTO 'signature' ('session', 'image_location') VALUES       ('$session_id', '$imageName')") OR DIE(mysql_error());
mysql_close($link);
}
?>

和 html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Signature Pad</title>

<!-- The Signature Pad -->
<script type ="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="signature-pad.js"></script>
</head>
<body>
<center>
<fieldset style="width: 435px">
    <br/>
    <br/>
    <div id="signaturePad" style="border: 1px solid #ccc; height: 55px; width: 400px;"></div>
    <br/>
    <button id="clearSig" type="button">Clear Signature</button>&nbsp;
    <button id="saveSig" type="button">Save Signature</button>
    <div id="imgData"></div>
    <div 
    <br/>
    <br/>
</fieldset>
</center>
<div id="debug"></div>
</body>
</html>

经过一番苦思冥想之后,我终于能够发现一些错误。 在签名板上签名并按下保存签名按钮后,我在 Firebug 中收到这些错误


Warning: fopen(xampp/htdocs/alpha/site6/images/sign_42281643871777767.png): failed to open stream: No such file or directory in C:\xampp\htdocs\alpha\site6\post.php on line 20

Warning: fwrite() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\alpha\site6\post.php on line 21

Warning: fclose() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\alpha\site6\post.php on line 22
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''signatures' ('session', 'image_location') VALUES ('127.0.0.1', 'sign_42281643871' at line 1

由于我对 Jquery 或 Ajax 以及它们如何创建图像并尝试将其发布到文件夹一无所知,所以我几乎无法理解这一点!

最佳答案

似乎我在回答我自己的问题,我已经弄清楚 fopen 错误是什么,我没有使用绝对路径所以在路径开始之前添加/清除了除最后一个错误之外的所有内容这: 您的 SQL 语法有误;检查与您的 MySQL 服务器版本对应的手册,了解在第 1 行的 ''signature' ('session', 'image_location') VALUES ('127.0.0.1', 'sign_11814198867') 附近使用的正确语法

关于PHP 似乎没有处理要发布到 MySQL 的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17017072/

相关文章:

javascript - 我上传图像的 Javascript 和 PHP 通信有什么问题?

javascript - SVG,如何评估svg对象的属性

php - Laravel APP_URL 没有改变

php - SOAP wsdl,授权

javascript - 如何获取点击按钮的事件id

javascript - jQuery 在后台弹出窗口

mysql - Alter a column default 在使用语句后不生效

php MySQL query update column into database.. 但它无法将更新的列值显示到页面中

mysql - hibernate 触发器生成的 ID 问题 (MySQL)

php - 使用 jQuery 将背景图像 css 设置为 wordpress 中的特色图像