Go Back   vb.org Archive > vBulletin Article Depository > Read An Article > vBulletin 3 Articles

Reply
 
Thread Tools
Martz's Avatar
Martz
Join Date: Oct 2001
Posts: 156

 

UK
Show Printable Version Email this Page Subscription
Martz Martz is offline 01-16-2002, 10:00 PM

I thought I would post my experience of learning php and the way vB works under the hood. Please contribute if you have anything to add or if I need correcting!

Why?
My reason for posting this is because I think learning to modify your vBulletin source is quite confusing if you keep refering to the php/mySQL site to try and understand their code. vB uses its own functions which actually save you time and help you quickly develop your idea and keep it consistant throughout the forum. These snippets of code are precious in my opinion, and I thought I would share what I have learnt so far!

Firstly you should obviously read the "Do's and Don'ts" thread in this forum to make sure you don't screw everything up. Even better, install a second vB (which is private and non operational) and that also uses a second database. If you do break/corrupt anything its not going to matter.

On with the show..

Getting information (queries)
Instead of using the standard basic mySQL function to connect to the forum database and get/put information as documented on the php site - vBulletin has its own function which does this in a cleaner way.

PHP Code:
$results=$DB_site->query("SELECT * FROM user"); 
What it does in english:
$DB_site->query is the piece of magic here. All of the stuff that you may have read on on the php.net site concerning connecting to databases - you can forget for the moment. $DB_site->query is great for quickly and easily grabbing information, however complex the query without worring about the details of the connection. The variable $results becomes equal to everything (*) in the user table and stored as an array ($results) with many sets.

Next we need to cycle though all of these records and either extract or use the information we have. This can be done with a while statement and also the fetch_array function built into vB for us to take advantage of! fetch_array is a condition which can be used in the while statement to "Keep looping until we're all out of records".

Tip!: When picking variable names, keep them logical. For queries which return an array, use a plural (such as $results not $result). For queries which make use of query_first or when looping though an array, use a singular variable name to indicate you are being specific to 1 record and not all of the information.

PHP Code:
$results=$DB_site->query("SELECT * FROM user WHERE userselect=1");
// the above is our previous query which we'll use for this example

        
while ($result=$DB_site->fetch_array($results)) {
// start a loop which will: 
// assign the contents of the current record in the loop to the variable $result.

echo "Username: $result[username]";
echo 
"Title: $result[title]";

        }
// end of while loop 

Sometimes though, we know we only want to get 1 record which has a unique feature or condition. Example: "select the forum title from the forum table where the forumid = 6". This can be done using a query_first connection as below:

PHP Code:
$result=$DB_site->query_first("SELECT title FROM forum WHERE forumid=6"); 
As there will only be 1 forum at the most in the database with a forumdid of 6 - we can use query_first. $result is returned as a normal array, unlike the standard query function which returns a set of arrays. This can be used just as:
PHP Code:
echo "The forum title is $result[title]"
Since we only have 1 set (an array) of information we do not have to use a while statement to loop through the records.

Thats all folks!

For the moment anyway. If anyone else with more hacking experience has ways in which we can save time and keep things simple - please reply. I'll try and post how to build tables in the admin cp and how variables are passwed between forms.

HTH someone! Its taken me long enough to work out. Comments, errors and revisions welcomed.
Reply With Quote
  #12  
Old 01-06-2004, 06:38 PM
MindTrix's Avatar
MindTrix MindTrix is offline
 
Join Date: Apr 2002
Location: United Kingdom
Posts: 1,833
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

2) = config.php
Reply With Quote
  #13  
Old 01-06-2004, 06:57 PM
Kane Da Don's Avatar
Kane Da Don Kane Da Don is offline
 
Join Date: Sep 2002
Location: Vegas
Posts: 33
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

thank you for this tutorial this is going to help me out a alot
Reply With Quote
  #14  
Old 01-08-2004, 10:16 PM
rrottman rrottman is offline
 
Join Date: Jun 2002
Posts: 53
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Kane Da Don
thank you for this tutorial this is going to help me out a alot
Small remark:
While
PHP Code:
echo $result[title
works fine, isn't it 100% correct that you should write
PHP Code:
echo $result['title'
instead?
Reply With Quote
  #15  
Old 01-08-2004, 10:24 PM
NTLDR's Avatar
NTLDR NTLDR is offline
Coder
 
Join Date: Apr 2002
Location: Bristol, UK
Posts: 3,644
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Indeed the majority of time thats correct, using the first method could produce the wrong result eg:

PHP Code:
define('title''some text here');

echo 
$result[title];

// the above would try and echo $result[some text here] 
Reply With Quote
  #16  
Old 01-09-2004, 03:30 PM
Dean C's Avatar
Dean C Dean C is offline
 
Join Date: Jan 2002
Location: England
Posts: 9,071
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

You only quote your single strings when you are not inbetween any double or single quotes. As:

PHP Code:
echo "The forum title is $result['title']"
Will give a nasty error
Reply With Quote
  #17  
Old 01-09-2004, 04:41 PM
rrottman rrottman is offline
 
Join Date: Jun 2002
Posts: 53
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Mist
You only quote your single strings when you are not inbetween any double or single quotes. As:

PHP Code:
echo "The forum title is $result['title']"
Will give a nasty error
So the correct way would be to assign the value to a non-array var before you echo it with double quotes:

PHP Code:
$echostr $result['title'];
echo 
"The forum title is $echostr"
I know that $result[title] works, but again, it's syntactically not 100% correct and only works, because PHP is not type safe.
Reply With Quote
  #18  
Old 01-11-2004, 08:07 PM
rrottman rrottman is offline
 
Join Date: Jun 2002
Posts: 53
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Mist
You only quote your single strings when you are not inbetween any double or single quotes. As:

PHP Code:
echo "The forum title is $result['title']"
Will give a nasty error
@Mist: That's why PHP usually wants it like this:

echo "The forum title is $result[{'title'}]";
Reply With Quote
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 06:14 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.04449 seconds
  • Memory Usage 2,290KB
  • Queries Executed 22 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (11)bbcode_php
  • (3)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)modsystem_article
  • (1)navbar
  • (4)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (1)pagenav_pagelink
  • (8)post_thanks_box
  • (8)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (8)post_thanks_postbit_info
  • (7)postbit
  • (8)postbit_onlinestatus
  • (8)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete