我正在尝试在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.
我建议使用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().
| 归档时间: |
|
| 查看次数: |
5210 次 |
| 最近记录: |