Sqlite3查询结果中的误报

时间:2016-06-29 09:43:16

标签: php sqlite

我有一台带有Sqlite3数据库的服务器和一台客户端PC。

如果通过ajax发送数据库查询,如果查询已完成,我会在查询结果中收到真实结果。

我的问题是:如果我在进行数据库查询时关闭了我的服务器,我可能会收到一个假的正面,因为查询已完成但未在硬盘内存中修复!

示例:

通过ajax:

var testo_query='INSERT INTO comanda terminale,perc_iva,id,cod_articolo,ordinamento,peso_ums,ultima_portata,numero_conto,nodo,cat_variante,dest_stampa,portata,desc_art,quantita,prezzo_un,categoria,ntav_comanda,operatore,tipo_record,stato_record,                                     prog_inser,posizione) VALUES ("null","22","DAV_20160629110600158","151","00","","","1","006","1","51","4","TARTUFO NOCCIOLA","1","5.00",

var dbtype='sqlite';

var dbname='provaINTELLINET.sqlite';
                                    "0","A5","DAVIDE","CORPO","ATTIVO","6","CONTO");';

$.ajax({
                type: "POST",
                async: true,
                url: comanda.url_server + 'classi_php/db_realtime_cassa.lib.php',
                data: {
                    type: dbtype,
                    db_name: dbname,
                    query: testo_query
                },
                dataType: "json",
                timeout: 10000,

                success: function (dati) {

                    console.log("QUERY_CASSA_SUCCESS", dati);

                    //I RECEIVE A "TRUE" RESULT HERE


                    }

                }

            });`

那是服务器端:

<?php

//header('Access-Control-Allow-Origin: *');

// IMPORTANTE !!
//Se non faccio così, ai warning mi da error e ripete due volte la sincronia
error_reporting(0);

$sql = $_POST['query'];

//MYSQL
@$host = $_REQUEST['db_host'];
@$user = $_REQUEST['db_user'];
@$paas = $_REQUEST['db_pass'];

$db_name = $_REQUEST['db_name'];
$db_type = $_REQUEST['type'];

$prefix = '../';

$db2 = null;

if ($db_type === 'mysql') {
    $db2 = new mysqli($host, $user, $pass, $db_name);
} else {
    $db2 = new SQLite3($prefix . $db_name);
}

$result = false;

$i = 0;
while ($result === false && $i < 10) {

    $ms = "0." . rand(6, 9);
    sleep($ms);
    $result = $db2->query($sql);

    if ($result !== false) {
        $risultato_booleano = "true";
        break;
    }

    $risultato_booleano = "false";
    $i++;
}

if (strpos(strtolower($sql), 'select') === false) {
    $db2->close();
} else {
    if ($db_type === 'mysql') {
        for ($i = 1; $riga = $result->fetch_assoc(); $i++) {
            $prodotti[$i] = $riga;
        }
    } else {
        for ($i = 1; $riga = $result->fetchArray(SQLITE3_ASSOC); $i++) {
            $prodotti[$i] = $riga;
        }
    }
}
$db2->close();


if (@json_encode($prodotti) !== null && @json_encode($prodotti) !== 'null') {
    echo json_encode($prodotti);
} else {
    echo $risultato_booleano;
}

为什么?

1 个答案:

答案 0 :(得分:0)

我不知道你的意思是误报&#39;但SQLite具有非常强大的ACID支持。您可以(非常详细地)阅读Atomic Commit in SQLite中如何实现这一点。

要从中受益,您必须使用transactions

// start a transaction.
$db2->exec('BEGIN');

... insert/update/delete/etc. ...

// commit transaction.
$db2->exec('COMMIT');
// - OR - discard transaction.
$db2->exec('ROLLBACK');