Intereting Posts
symfony2 добавить динамический параметр для маршрутизации, попробуйте с помощью пользовательского загрузчика PHP: Как получить дату позавчера? Определить, открыт ли бизнес на закрытых рабочих днях Javascript crc32 и PHP crc32 не соответствуют Показывать подкатегорию вместо Root в меню Специальная ссылка на страницу профиля, например, www.domain.com/username Как добавить несколько переменных $ _POST и переменных? Завершает ли это выполнение SQL-инъекций 24 часа значений Является ли время () гарантированным знаком прыжка? Ограничение предела LDAP для LDAP Как заполнить второе раскрывающееся меню на основе выбора первого раскрывающегося списка с использованием jQuery / AJAX и PHP / MySQL? String with Convert.ToChar (0) hash результат отличается от chr (0) в PHP при хэшировании hash_hmac Laravel Eloquent whereRaw sql возвращает все строки при использовании оператора OR Как фильтровать кешированный запрос в Laravel

Как фиксировать обновления SQLite3 на PHP?

Я пытаюсь использовать 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() .