2

PHPでSQLite3を使用しようとしていますが、UPDATEを実行する必要があるまでは問題ありませんでした。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 );

私が欲しいのは、データベースからすべての質問を読み、resposta列からの回答$respostesをPOSTによって受信された変数内の回答と比較することです。それもうまくいきます。次に、答えが正しければ、correctaこの行の列を1に設定して、この正しさをデータベースに設定する必要があります。クエリを表示してからSQLite3コンソールに配置すると、正しく機能しますが、再確認するとPHPでは$conn->changes()、UPDATEが1行に影響したことを示している場合でも、0のままです。

私は理解できることをすべてチェックしました、boxberry.dbファイルはすべてのユーザーが読み取りおよび書き込み可能です、デフォルトであるはずのSQLITE3_OPEN_READWRITEでそれを操作しようとしました、COMMITの実行を追加しようとしました、あるいは同じexecに入れました両方をセミコロンで区切る行...エラーはスローされませんが、値は変更されません。

PythonでSQLiteを使用すると、UPDATEの後にコミットする必要があることがわかりましたが、PHPでそれを行う方法が見つかりません。

このスクリプトは次のようなものを返します。{"canvis":1、 "tmp":0}つまり、1回の変更である必要がありますが、データベースの値は1である必要があるときに0のままです。

4

2 に答える 2

5

SQLite3拡張機能ではなく、PDOを使用することをお勧めします。

$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のcommitステートメントが自動的に処理されるため、気にする必要がありません。特定のクエリセットに対してコミットまたはロールバックする機能が必要な場合は、および/PDO::beginTransactioncommit()使用できますrollBack()

于 2012-08-17T14:49:40.410 に答える
4

拡張子を使用して手動で変更をコミットする必要はありませSQLite3んが、データベースファイルを含むディレクトリを書き込み可能にする必要がある場合があります(おそらく、Webサーバーソフトウェアに書き込み権限があるように設定します)。データベースファイル自体を書き込み可能にするだけでは、SQLiteにとって必ずしも十分ではありません。

于 2012-08-17T15:10:02.957 に答える