2012-08-17 35 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