Я столкнулся с какой-то странной ошибкой в своем веб-приложении PHP, который я не могу разобраться. Php script извлекает строку из базы данных, обрабатывает ее и сериализует новый запрос и записывает строку в базу данных.
Я скопировал код, который делает это:
foreach($a as $key => $value)
{
$a[$key]="'".mysql_real_escape_string($value)."'";
}
$a['lastUpdate']="$when";
//assembling request
$assignments=array();
foreach($a as $key => $value)
{
$assignments[]="$key=$value";
}
$q="UPDATE wtfb2_villages SET ".implode(',',$assignments)." WHERE (id=${a['id']})";
logText($q);
logText(mysql_error());
$r=mysql_query($q) or die(__FILE__.':'.__LINE__.':'.mysql_error().':'.$q);
logText(mysql_affected_rows());
logText('Mysql error in query is: '.mysql_error()."\n");
Это UPDATE, похоже, выполняется. mysql_error() дает пустую строку. mysql_affected_rows говорит 1 точно так же, как когда все сделано. Но если я посмотрю в таблицу с помощью phpmyadmin, я увидел, что ничего не изменилось.
Я сам выполнил сам запрос:
UPDATE wtfb2_villages SET id='22',ownerId='56',villageName='Új falu',x='0',y='1',buildPoints='7.2226273148149',barracksLevel='0',archeryRangeLevel='0',stablesLevel='0',workshopLevel='0',townHallLevel='0',blacksmithLevel='0',goldmineLevel='1',wallLevel='0',spearmen='0',archers='0',knights='0',catapults='0',diplomats='0',spearmanLevel='0',archerLevel='0',knightLevel='0',catapultLevel='0',spearmenTraining='0',archersTraining='0',knightsTraining='0',catapultsTraining='0',diplomatsTraining='0',lastUpdate='2011-01-18 21:56:10' WHERE (id='22')
Если я просто скопирую этот запрос непосредственно в phpmyadmin, он выполнит его, и я увижу результат в таблице.
В таблице используется механизм myIsam. Так что никаких транзакций или каких-либо таких.
Я застрял в этой проблеме более 2 часов, и я не могу узнать, что происходит.
Это единственный запрос, который делает это. запросы до и после этого выполняются правильно.
Любые идеи?
Я нашел это... Ошибка была в другом месте...
Когда деревня атакована армией, процессор событий script сначала проверяет, существует ли деревня. Если существует, он также выводит строку. Читает идентификатор владельца из строки и обновляет владельца всех деревень, чтобы определить, сколько добычи можно получить из этой деревни. После этого обработчик событий имитирует битву, вычисляет потери и...... записывает строку со старой датой обновления... pfff Вот оно...
Мой совет: если вы застряли с абсолютно абсурдной ошибкой... Примите душ, пообедайте, кормите собаку или бегайте вокруг квартала и т.д.... Просто перестань думать... После того, перед компьютером вы можете почти сразу найти какую-либо ошибку...
ps: И только тогда, когда все не удается запустить SO-сообщение...
Глядя на ваш журнал запросов, ID является первичным ключом? Я не уверен, что вы можете включить его в свой запрос на обновление, если это так. Это было некоторое время, так как я сделал работу с БД, хотя.