View Full Version : [HELP] Removing row from table plugin query
Dr.CustUmz
03-10-2016, 08:06 PM
so ive got my plugin at showthread_complete, its working pretty good =)
but im trying to add a query to it that reverses something done in showthread.php
This is the code straight from showthread.php
$db->shutdown_query("
INSERT INTO " . TABLE_PREFIX . "threadviews (threadid)
VALUES (" . intval($threadinfo['threadid']) . ')'
);
So I would think to reverse that my plugin would have to be
$db->shutdown_query("
DELETE FROM " . TABLE_PREFIX . "threadviews (threadid)
VALUES (" . intval($threadinfo['threadid']) . ')'
);
This doesnt give me an error, but it's not working, and threadviews table still continues to grow.
i have also tried
$vbulletin->db->query
$db->query
both resulting in database errors.
The goal:
if vb options are not set to update view counts immediately, each view is stored in the threadviews table. this happens with that first block of code from showthread.php
so when you view a thread that query runs, i want my query to just delete the row that first query added.
i have got this all worked out if admins update threads immediately, but i don't want to dictate their having to choose that option.
--------------- Added 1457655461 at 1457655461 ---------------
this is working
$vbulletin->db->query_first("
DELETE FROM " . TABLE_PREFIX . "threadviews
WHERE threadid = $threadinfo[threadid]
LIMIT 1
");
is it proper?
MarkFL
03-10-2016, 10:19 PM
You need something like:
$vbulletin->db->query_write("
DELETE FROM " . TABLE_PREFIX . "threadviews
WHERE threadid = " . intval($threadinfo['threadid'])
);
Paul M
03-10-2016, 11:05 PM
so ive got my plugin at showthread_complete, its working pretty good =)
but im trying to add a query to it that reverses something done in showthread.php
This is the code straight from showthread.php
$db->shutdown_query("
INSERT INTO " . TABLE_PREFIX . "threadviews (threadid)
VALUES (" . intval($threadinfo['threadid']) . ')'
);
So I would think to reverse that my plugin would have to be
$db->shutdown_query("
DELETE FROM " . TABLE_PREFIX . "threadviews (threadid)
VALUES (" . intval($threadinfo['threadid']) . ')'
);
This doesnt give me an error, but it's not working, and threadviews table still continues to grow.
i have also tried
$vbulletin->db->query
$db->query
both resulting in database errors.
The goal:
if vb options are not set to update view counts immediately, each view is stored in the threadviews table. this happens with that first block of code from showthread.php
so when you view a thread that query runs, i want my query to just delete the row that first query added.
i have got this all worked out if admins update threads immediately, but i don't want to dictate their having to choose that option.
--------------- Added 1457655461 at 1457655461 ---------------
this is working
$vbulletin->db->query_first("
DELETE FROM " . TABLE_PREFIX . "threadviews
WHERE threadid = $threadinfo[threadid]
LIMIT 1
");
is it proper?
The original code will throw a database error, you just wont see it because its being run as a shutdown query.
You final code is fine, but you dont actually need the LIMIT 1.
Dr.CustUmz
03-11-2016, 01:53 AM
The original code will throw a database error, you just wont see it because its being run as a shutdown query.
You final code is fine, but you dont actually need the LIMIT 1.
without the limit 1 it erases every entry of that that thread id
thread views table looks like
8
8
8
8
3
1
6
8
8
8
if i remove limit 1 and view thread 8, all of its instances get removed and when the cron runs to update thread view its not accurate.
update****
the problem with the method im using
$vbulletin->db->query_write("
DELETE FROM " . TABLE_PREFIX . "threadviews
WHERE threadid = $threadinfo[threadid]
LIMIT 1
");
is if there is no row with that threadID in the threadviews table it adds the original view to the table.
https://vborg.vbsupport.ru/attachment.php?attachmentid=154445&stc=1&d=1457669996
Paul M
03-11-2016, 03:49 PM
without the limit 1 it erases every entry of that that thread id
Is that not what you are trying to do ?
I guess I dont understand your actual objective then.
the problem with the method im using
$vbulletin->db->query_write("
DELETE FROM " . TABLE_PREFIX . "threadviews
WHERE threadid = $threadinfo[threadid]
LIMIT 1
");
is if there is no row with that threadID in the threadviews table it adds the original view to the table.
A delete query cannot add anything, ever.
You are using shutdown queries, which quite possibly get run backwards to how you define them (there isnt any guarantee what order they will run). So more likely the delete is running first, then the insert. You wont notice this if there is at least one existing record, but you will if there are none.
Dr.CustUmz
03-11-2016, 04:45 PM
the goal is to remove the insert that showthread.php adds through a plugin
this is the query in showthread.php
$db->shutdown_query("
INSERT INTO " . TABLE_PREFIX . "threadviews (threadid)
VALUES (" . intval($threadinfo['threadid']) . ')'
);
i can make it do what i want by editing the showthread.php using if conditions, but im trying make it so there are no file edits.
so i have my plugin set to
if ($thread['postuserid']==$vbulletin->userinfo['userid']){
$vbulletin->db->query_first("
DELETE FROM " . TABLE_PREFIX . "threadviews
WHERE threadid = $threadinfo[threadid]
LIMIT 1
");
}
this is saying if thread viewer is thread starter remove the view that the showthread query added.
BUT
if the thread has no views in the time the cron keeps them in the threadviews table (before placing them in thread table >views column) on the hour for most forums. it will add a view to the threadviews table even if it is thread starter viewing.
Paul M
03-11-2016, 08:27 PM
I still dont understand the objective, why do you want to remove that record ?
Two things ;
1. Dont use db->query_first() on the delete, thats for table reads. I believe its db->query_write() you need, but Im unable to check that where I am located atm.
2. What you are doing atm isnt going to work properly, because you are running the delete before the insert.
You need to remember that shutdown queries are run when all the page processing has completed - just before vb sends the actual html back to the client (and shuts down).
Dr.CustUmz
03-12-2016, 01:40 AM
I still dont understand the objective, why do you want to remove that record ?
Two things ;
1. Dont use db->query_first() on the delete, thats for table reads. I believe its db->query_write() you need, but Im unable to check that where I am located atm.
2. What you are doing atm isnt going to work properly, because you are running the delete before the insert.
You need to remember that shutdown queries are run when all the page processing has completed - just before vb sends the actual html back to the client (and shuts down).
the recored is being removed, so if thread starter views his own thread the view counter does not go up
this is how i came up with this, i edited showthread.php (search for // update views counter)
and came up with this.
// update views counter
if ($vbulletin->options['threadviewslive']) {
// doing it as they happen; for optimization purposes, this cannot use a DM!
if ($vbulletin->userinfo['userid'] == 0) {
// ignore guest
} elseif ($thread['postuserid']==$vbulletin->userinfo['userid']) {
// ignore thread poster
} else {
$db->shutdown_query("
UPDATE " . TABLE_PREFIX . "thread
SET views = views + 1
WHERE threadid = " . intval($threadinfo['threadid'])
);
}
} else {
// or doing it once an hour
if ($vbulletin->userinfo['userid'] == 0) {
// ignore guest
} elseif ($thread['postuserid']==$vbulletin->userinfo['userid']) {
// ignore thread poster
} else {
$db->shutdown_query("
INSERT INTO " . TABLE_PREFIX . "threadviews (threadid)
VALUES (" . intval($threadinfo['threadid']) . ')'
);
}
}
works 100%
im trying to do the same exact thing only without having to edit the showthread.php
vBulletin® v3.8.12 by vBS, Copyright ©2000-2025, vBulletin Solutions Inc.