2012-08-17 57 views
2

我試圖在PHP中使用SQLite3,並且在我需要執行UPDATE之前一直很好。 我說我錯過了一個COMMIT,但我沒有找到如何去做的方式。如何在PHP上提交SQLite3更新?

我的代碼是:

$respostes = $_POST['respostes']; 
$return = array(); 

$conn = new SQLite3('/home/pi/boxberry/boxberry.db', SQLITE3_OPEN_READWRITE); 

$res = $conn->query('SELECT numero, resposta FROM preguntes WHERE NOT correcta'); 
while($resposta = $res->fetchArray(SQLITE3_ASSOC)) 
{ 
    if(strstr(strtolower($respostes), strtolower($resposta['resposta'])) !== FALSE) 
    { 
     $conn->exec('UPDATE preguntes SET correcta = 1 WHERE numero = ' . $resposta['numero']); 
     $return['canvis'] = $conn->changes(); 
     $conn->exec('COMMIT'); 
     $res = $conn->query('SELECT correcta FROM preguntes WHERE numero = ' . $resposta['numero']); 
     $tmp = $res->fetchArray(SQLITE3_ASSOC); 
     $return['tmp'] = $tmp['correcta']; 
    } 
} 

.... more stuff ... 

echo json_encode($return); 

我想要的是從數據庫中讀取所有的問題,答案從與POST收到$respostes變量中的答案resposta列比較。這也很好。 然後,如果答案是正確的,我需要把這個正確性的數據庫,設置該行的correcta列爲1. 如果我顯示查詢,然後我把它放在SQLite3控制檯上它工作正常,但是當我在PHP上重新檢查它始終爲0,即使$conn->changes()顯示UPDATE影響1行。

我檢查了我的計算結果,我發現boxberry.db文件可以被任何用戶讀寫,我試着用SQLITE3_OPEN_READWRITE調用它作爲默認值,我嘗試添加一個COMMIT的執行,甚至把它在同一個執行行中用分號分隔...沒有引發錯誤,但值不會改變。

在Python中使用SQLite我發現我需要在UPDATE後執行COMMIT,但是我找不到在PHP中執行它的方式。

此腳本返回類似: {「canvis」:1,「TMP」:0} 這意味着它應該是1層的變化,但隨後在數據庫中的值仍爲0時,應爲1

+1

PDO可能更容易,更便攜。 – 2012-08-17 14:07:15

回答

2

您不需要手動提交擴展名爲SQLite3的更改,但可能需要將包含數據庫文件的目錄設置爲可寫(可能需要設置它以便您的Web服務器軟件具有寫權限)。僅僅讓數據庫文件本身可寫對於SQLite來說並不總是足夠的。

+0

就是這樣!非常感謝你,不是它按預期工作。 – Jester 2012-08-17 15:15:55

4

我會建議使用PDO此,而不是SQLite3的擴展:

$dbh = new PDO('sqlite:/home/pi/boxberry/boxberry.db'); 

$res = $dbh->query('SELECT numero, resposta FROM preguntes WHERE NOT correcta'); 
foreach($res as $resposta) 
{ 
    if(FALSE !== strstr(strtolower($respostes), strtolower($resposta['resposta']))) 
    { 
    $updstmt = $dbh->prepare('UPDATE preguntes SET correcta = 1 WHERE numero = :numero'); 
    $updstmt->bindParam(':numero', $resposta['numero']); 
    $updstmt->execute(); 
    $return['canvis'] = $updstmt->rowCount(); 

    $stmt = $dbh->prepare('SELECT correcta FROM preguntes WHERE numero = :numero'); 
    $stmt->bindParam(':numero', $resposta['numero']); 
    $stmt->execute(); 
    $return['tmp'] = $stmt->fetchAll(); 
    } 
} 

這是未經測試,但應作爲一個下拉更換爲OP的示例代碼。

通過使用PDO,您不必關心SQLite中的提交語句,因爲它們是自動處理的。如果您想想要能夠針對特定的一組查詢進行提交或回滾,您可以使用PDO::beginTransactioncommit()/rollBack()

+0

謝謝你的代碼@Justin,但我結束了使用SQLite3本身,我錯過了目錄權限而不是數據庫文件。 – Jester 2012-08-17 15:17:08