Я пытаюсь использовать SQLite3 в PHP, и everithing было хорошо, пока мне не нужно было выполнить 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 остается 0, даже когда $conn->changes()
показывает, что UPDATE затронул 1 строку.
Я проверил everithing, я могу понять, файл boxberry.db читаем и записываем любым пользователем, я попытался развернуть его с помощью SQLITE3_OPEN_READWRITE, который должен быть по умолчанию, я попытался добавить выполнение COMMIT или даже поместить его в тот же exec строка, разделяющая как точки с запятой … Ошибка не вызывается, но значения не меняются.
Используя SQLite с Python, я обнаружил, что мне нужно COMMIT после UPDATE, но я не могу найти способ сделать это на PHP.
Этот скрипт возвращает что-то вроде: {«canvis»: 1, «tmp»: 0} Это означает, что это должно быть 1 изменение, но тогда значение в базе данных все равно 0, когда должно быть 1.
Вам не нужно вручную фиксировать изменения с расширением SQLite3
но вам может потребоваться создать каталог, содержащий файл базы данных, доступный для записи (возможно, установить его так, чтобы ваше программное обеспечение веб-сервера имело права на запись). Просто сделать сам файл базы данных доступным для записи не всегда достаточно для SQLite.
Я бы предложил использовать 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, вам не нужно беспокоиться о операторах commit в SQLite, поскольку они обрабатываются автоматически. Если вы хотите совершить или откат для определенного набора запросов, вы можете использовать PDO::beginTransaction
и commit()
/ rollBack()
.