Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据插入Web SQL数据库的Javascript代码有什么问题?_Javascript_Html_Web Sql - Fatal编程技术网

将数据插入Web SQL数据库的Javascript代码有什么问题?

将数据插入Web SQL数据库的Javascript代码有什么问题?,javascript,html,web-sql,Javascript,Html,Web Sql,我正在尝试创建一个简单的页面,它接受一个二进制文件,并将值插入到Web SQL数据库中。 这是我用来插入数据的函数: function bin2dbfunc() { var result, n, aByte, byteStr; var i=0; var sql = new Array(); result = fr.result; //Input file for (n = 0; n < result.length; ++n) {

我正在尝试创建一个简单的页面,它接受一个二进制文件,并将值插入到Web SQL数据库中。 这是我用来插入数据的函数:

function bin2dbfunc()
{
    var result, n, aByte, byteStr;
    var i=0;
    var sql = new Array();

    result = fr.result;  //Input file

    for (n = 0; n < result.length; ++n) 
    {
        aByte = result.charCodeAt(n);
        byteStr = aByte.toString(16);
        if (byteStr.length < 2)
        {
            byteStr = "0" + byteStr;
        } //Format to add leading 0 for hex values

        //Looping through taking each byte read from file and adding to array

        //sql[i] = aByte;   //Value
        sql[i] = byteStr;   //String


        //When completed one row of database run single SQL insert statement with array contents
        if(i==15)
        {
            i=0;  //Clear counter for next row
            db.transaction(function (tx)
            {
                tx.executeSql('INSERT INTO binary_data VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [sql[0], sql[1], sql[2], sql[3], sql[4], sql[5], sql[6], sql[7], sql[8], sql[9], sql[10], sql[11], sql[12], sql[13], sql[14], sql[15]]);
            }, function (tx, err) {
                document.getElementById("result3").innerHTML += 'ERROR ';  //Display error message if SQL not run successfully
            });
        }
        else
        {
            i++;  //Otherwise increment counter
        }
    }
}
函数bin2dbfunc()
{
var结果,n,aByte,byteStr;
var i=0;
var sql=新数组();
result=fr.result;//输入文件
对于(n=0;n
我已经剥离了代码以删除所有调试消息,但实际上代码似乎正在运行。我使用的是一个包含6行数据的二进制文件,但是代码将最后一行数据插入数据库6次。
有人能指出我哪里出错了吗?

变量是通过引用捕获的,而不是通过JavaScript闭包中的值捕获的(对于数组等对象也是如此,但对于基本值也是如此);这意味着传递给
db.transaction
的函数在运行时将使用
sql
的当前值。在您的案例中,它们似乎是异步运行的,因此在返回
bin2dbfunc
时使用
sql
的值(这解释了为什么您会得到最后一行数据)

您必须复制
sql
的值,以确保使用正确的值:

function transactionCallback(sql_) {
  var sql = sql_.slice(0); // copy
  return function(tx) {
    tx.executeSql(…, sql);
  };
}

db.transaction(transactionCallback(sql), …);


因为在
bin2dbfunc
中不需要
sql
的值;第二个解决方案还可以让您摆脱
i
,使用一个基于
push
length

的更优雅的解决方案,听起来像是一个范围问题-
db.transaction()
是一个异步函数吗?如果
tx.executeSql
抛出错误,变量
i
不会增加。是吗?谢谢你,这解决了问题。在尝试更多的javascript之前,我必须多读一些书,这只是一个混搭的例子来尝试一个想法。
function transactionCallback(sql) {
  return function(tx) {
    tx.executeSql(…, sql);
  };
}

db.transaction(transactionCallback(sql), …);
sql = [];