Warning: duplicate entry | Ad module | Advertisements | Drupal 6
Published by Nicholas Dunbar on December 24th, 2012
The Problem:
[6.x-2.2](http://drupal.org/node/646830) I was having the following error every time I resaved an ad or made changes to an ad:
user warning: Duplicate entry '32-0' for key 'PRIMARY' query: INSERT INTO ad_priority (aid, priority) VALUES(32, 0) in /data/www/flash_guru.localhost/sites/all/modules/ad/channel/ad_channel.module on line 710.
And
user warning: Duplicate entry '32-0' for key 'PRIMARY' query: INSERT INTO ad_channel_remnant (aid, remnant) VALUES(32, 0) in /data/www/flash_guru.localhost/sites/all/modules/ad/channel/ad_channel.module on line 715.
The Solution:
In modules/ad/channel/ad_channel.module I found that in the function _ad_channel_save_node they were not using a very thurough way of checking if the records already existed. I could have come up with something a little more efficient but I just threw together a redundant solution.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//I changed the function from the following: | |
function _ad_channel_save_node($node) { | |
// delete old channel information, then add new | |
db_query('DELETE FROM {ad_channel_node} WHERE nid = %d', $node->nid); | |
$channels = _ad_channel_get_enabled($node); | |
foreach ($channels as $chid) { | |
db_query('INSERT INTO {ad_channel_node} (chid, nid) VALUES(%d, %d)', $chid, $node->nid); | |
} | |
if (user_access('configure ad premier status')) { | |
db_query('UPDATE {ad_priority} SET priority = %d WHERE aid = %d', isset($node->premiere) ? $node->premiere : 0, $node->nid); | |
if (!db_affected_rows()) { | |
db_query('INSERT INTO {ad_priority} (aid, priority) VALUES(%d, %d)', $node->nid, isset($node->premiere) ? $node->premiere : 0); | |
} | |
} | |
db_query('UPDATE {ad_channel_remnant} SET remnant = %d WHERE aid = %d', isset($node->remnant) ? $node->remnant : 0, $node->nid); | |
if (!db_affected_rows()) { | |
db_query('INSERT INTO {ad_channel_remnant} (aid, remnant) VALUES(%d, %d)', $node->nid, isset($node->remnant) ? $node->remnant : 0); | |
} | |
} | |
//to the following : | |
function _ad_channel_save_node($node) { | |
// delete old channel information, then add new | |
db_query('DELETE FROM {ad_channel_node} WHERE nid = %d', $node->nid); | |
$channels = _ad_channel_get_enabled($node); | |
foreach ($channels as $chid) { | |
db_query('INSERT INTO {ad_channel_node} (chid, nid) VALUES(%d, %d)', $chid, $node->nid); | |
} | |
if (user_access('configure ad premier status')) { | |
db_query('UPDATE {ad_priority} SET priority = %d WHERE aid = %d', isset($node->premiere) ? $node->premiere : 0, $node->nid); | |
if (!db_affected_rows()) { | |
$isExists = FALSE; | |
$result = db_query('SELECT priority FROM {ad_priority} WHERE aid = %d',$node->nid); | |
if ($result){ | |
if (db_fetch_object($result)){ | |
$isExists = TRUE; | |
} | |
} | |
if (!$isExists){ | |
db_query('INSERT INTO {ad_priority} (aid, priority) VALUES(%d, %d)', $node->nid, isset($node->premiere) ? $node->premiere : 0); | |
} | |
} | |
} | |
db_query('UPDATE {ad_channel_remnant} SET remnant = %d WHERE aid = %d', isset($node->remnant) ? $node->remnant : 0, $node->nid); | |
if (!db_affected_rows()) { | |
$isExists = FALSE; | |
$result = db_query('SELECT remnant FROM {ad_channel_remnant} WHERE aid = %d',$node->nid); | |
if ($result){ | |
if (db_fetch_object($result)){ | |
$isExists = TRUE; | |
} | |
} | |
if (!$isExists){ | |
db_query('INSERT INTO {ad_channel_remnant} (aid, remnant) VALUES(%d, %d)', $node->nid, isset($node->remnant) ? $node->remnant : 0); | |
} | |
} | |
} | |
//If you are not already there. Here is the article on how to use this code http://www.actionscript-flash-guru.com/blog/50-warning-duplicate-entry-ad-module-advertisements-drupal-6.php | |