2016-06-29 13 views
0

Ich habe einen Server mit einem Sqlite3 DB und einem Client-PC.False Positiv in Sqlite3 Abfrage Ergebnis

Wenn eine Datenbankabfrage über Ajax gesendet wird, erhalte ich ein wahres Ergebnis des Abfrageergebnisses, wenn die Abfrage durchgeführt wurde.

Mein Problem ist: wenn ich während der DB-Abfragen meinen Server ausschalte, kann ich ein FALSCHES POSITIVES erhalten, weil die Abfrage fertig ist, aber nicht auf dem Festplattenspeicher!

Beispiel:

Via 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 


        } 

       } 

      });` 

Das ist der Server-Seite ist:

<?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; 
} 

Warum?

Antwort

0

Ich weiß nicht, was Sie mit 'falsch positiv' meinen, aber SQLite hat sehr robuste ACID Unterstützung. Sie können (extrem detailliert) darüber lesen, wie dies in Atomic Commit in SQLite erreicht wird.

Um davon zu profitieren müssen Sie transactions verwenden:

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

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

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

sagen „falsch positiv“, meine ich, dass das Ergebnis der Abfrage ist wahr, aber die Abfrage tatsächlich nicht gespeichert –