如何在PHP上提交SQLite3更新?

Jes*_*ter 2 php sqlite

我正在尝试在PHP中使用SQLite3,并且在我需要执行更新之前,everithing很好.我想我错过了一个COMMIT,但我找不到如何做的方法.

我的代码是:

$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 );
Run Code Online (Sandbox Code Playgroud)

我想要的是从数据库中读取所有问题,并将resposta列中的答案与$respostesPOST收到的变量中的答案进行比较.这也很好.然后,如果答案是正确的,我需要将此正确性放到数据库中,correcta将此行的列设置为1.如果我显示查询然后将其放在SQLite3控制台上它可以正常工作,但是当我重新检查它时在PHP上,它保持为0,即使$conn->changes()显示UPDATE影响了1行.

我查了一下我可以想象的,我发现boxberry.db文件是任何用户都可以读写的,我尝试用SQLITE3_OPEN_READWRITE来操作它应该是默认的,我试着添加一个COMMIT的执行,或者甚至把它放在同一个exec中用分号分隔行...没有抛出错误,但值不会改变.

使用SQLite和Python我发现在UPDATE之后我需要COMMIT,但我找不到在PHP中执行它的方法.

此脚本返回类似于:{"canvis":1,"tmp":0}这意味着它应该是1更改,但是当应该为1时,数据库中的值仍为0.

Jus*_*ᚄᚒᚔ 6

我建议使用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();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是未经测试的,但应该作为OP示例代码的替代品.

通过使用PDO,您不必关心SQLite中的commit语句,因为它们是自动处理的.如果您希望能够为特定查询集提交或回滚,则可以使用PDO::beginTransaction和commit()/ rollBack().