#php #mysql
#php #mysql
Вопрос:
Это очень странно, и это сводит меня с ума, у меня есть список производителей, которые необходимо время от времени обновлять. Я должен выбрать самое старое обновленное, а затем записать текущее время в качестве времени последнего обновления.
Проблема в том, что запрос на обновление ОБНОВЛЯЕТ ДВЕ СТРОКИ вместо одной. Он обновляет строку с правильным идентификатором manufacturer_id, а также следующий.
ЕЩЕ ОДНА СТРАННОСТЬ ЗАКЛЮЧАЕТСЯ В ТОМ, ЧТО ВСЕ РАБОТАЕТ НОРМАЛЬНО, ЕСЛИ Я ПОМЕЩАЮ AN ECHO
МЕЖДУ ДВУМЯ ЗАПРОСАМИ.
Я тестировал на сервере Mac XAMPP, на сервере Windows XAMPP и на сервере Linux (Hostgator). Это работает, как и ожидалось, только на сервере Windows, на Mac и Linux запрос на обновление затрагивает 2 строки вместо одной.
Пожалуйста, протестируйте следующий скрипт:
создайте файл test.php и вставьте следующий код:
$connection = mysql_connect('localhost', 'root', '')
or die("Unable to connect to MySQL");
$select = mysql_select_db('test',$connection)
or die("Could not select test");
$sql = '
SELECT manufacturer_id FROM
manufacturer
ORDER BY last_update LIMIT 1
';
$query = mysql_query($sql, $connection);
$manufacturer = mysql_fetch_assoc($query);
//echo $manufacturer['manufacturer_id'];
$sql = 'UPDATE manufacturer
SET last_update = '.time().'
WHERE manufacturer_id ='. $manufacturer['manufacturer_id'];
mysql_query($sql, $connection);
создайте тест базы данных и запустите следующий SQL-запрос для создания таблицы manufacturers
:
CREATE TABLE `manufacturer` (
`manufacturer_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`last_update` bigint(15) DEFAULT NULL,
PRIMARY KEY (`manufacturer_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
LOCK TABLES `manufacturer` WRITE;
/*!40000 ALTER TABLE `manufacturer` DISABLE KEYS */;
INSERT INTO `manufacturer` (`manufacturer_id`, `last_update`)
VALUES
(1,0),
(2,0),
(3,0),
(4,0);
/*!40000 ALTER TABLE `manufacturer` ENABLE KEYS */;
UNLOCK TABLES;
Вызов test.php а затем проверьте таблицу, чтобы увидеть, сколько строк было затронуто.
Если затронута только одна строка, то она работает должным образом на вашем сервере (возможно, Windows).
Если затронуты две строки, то и на вашем сервере происходит то же странное поведение. Теперь снимите флажок с строки echo, и вы увидите, что теперь она работает так, как ожидалось. Сумасшедший!!!
Что это? Как будто кто-то подшучивает надо мной. У кого-нибудь есть идеи, почему это происходит?
Как вы думаете, это как-то связано с каким-то кешем mysql или чем-то подобным???
Большое спасибо за вашу помощь!
Комментарии:
1. Вы сделали
var_dump($manufacturer['manufacturer_id']);
только для того, чтобы доказать, что это то, что вы ожидаете?2. Извините, я не могу воспроизвести вашу проблему: Win 7, XAMPP.
3. Да, и если я ставлю
var_dump
перед вторым запросом, он работает нормально, это влияет только на одну строку. Я думаю, что сегодня я потратил более 5 часов, проверяя все, что мог придумать, и пытаясь понять.4. Это очень странно. Похоже, это должно сработать. Вы пробовали ставить точки с запятой после каждого оператора sql, чтобы убедиться, что они завершаются правильно?
5. Вы просматривали журналы своего сервера, чтобы узнать, сколько раз на самом деле был запущен скрипт? Скрипт может работать отлично, но браузер фактически нажимает на него дважды, вызывая «двойное» обновление. Эхо-сигнал может привести к тому, что браузер попадет на страницу только один раз, так как в противном случае ваш скрипт вообще не будет выводиться.
Ответ №1:
Спасибо Mark B (см. Комментарии) Я узнал, что причиной был браузер. Точнее, плагин FirePHP в Chrome. После того, как я отключил его, все вернулось в нормальное состояние.
По какой-то причине FirePHP заставляет браузер дважды вызывать страницу, когда эхо не выполняется.