2015-02-20 4 views
1

Каждая вставка, которую я делаю, происходит дважды. Я думал, что страница может попасть дважды, поэтому я также добавил файл счетчика, который будет увеличиваться при каждой загрузке. Страница только получает удар один раз, но каждая вставка вставлена ​​дважды.PHP + SQLite duplicate inserts

<? 
$x = intval(file_get_contents("./count.x")); 
header("Content-type: text/plain"); 
$db = new SQLite3("/var/www/images/cache.db"); 

$statement = $db->prepare('insert into `imgCache` (name,type,data) values("test7","bmp","argh);'); 
$result = $statement->execute(); 


while ($row = $result->fetchArray(SQLITE3_ASSOC)) 
{ 
print_r($row); 
} 


$x++; 
file_put_contents("./count.x",$x); 

?> 

Перед запуском этого сценария нет входа для «test7» в базе данных, и содержимое count.x является «0».

Когда я запускаю этот скрипт, происходит следующее

  1. count.x содержит текст «1»
  2. есть две записи для test7 в базе данных сейчас.
+0

Чтение строк из запроса 'INSERT' не имеет смысла; 'INSERT' ничего не возвращают. Кроме того, использование 'SELECT COUNT (*) FROM imgCache' намного лучше, чем хранение счета в отдельном файле. –

+0

Счетчик был средством отладки, чтобы быстро проверить, был ли сценарий дважды вызван браузером, а не приспособлением, чтобы оставаться в этом постоянно. – Trel

ответ

2

PHP выполняет запросы дважды: один раз, чтобы проверить, возвращены ли какие-либо строки, и второй раз, чтобы фактически вернуть строки.

Оператор INSERT не является запросом и не возвращает строки. Удалить звонок fetchArray.

+0

Я использовал это на машине, у меня не было доступа к CLI, чтобы инициализировать базу данных. Тогда это имеет смысл. Иногда были выборы, но да, похоже, мне придется включить логику или использовать отдельные файлы. Благодарю. – Trel