Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 05-30-2006, 10:13 PM
jwocky jwocky is offline
 
Join Date: Mar 2005
Posts: 138
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Making my own plugin, starting from scratch, some PHP questions (my ongoing adventure

** Hopefully this thread can become a resource for other newbies who want to learn how to do some PHP coding in relation to a vB hack **

Hey everyone, I've been a user here for a while now downloading the great plugins we have in this community. Now I need something custome but couldnt find anyone to take on the project, so I figured, what the hell.. I'll try to make one myself.

Now to begin with, I have no knowledge of PHP whatsoever, but i'm not a total idiot, and a pretty quick learner.. I also have general experience with coding from the old basic, then C++ days so I know the general concepts, but not the specific calls anymore.

I've been furiously reading the tutorials from the sites that have been generously stickied in this subforum.. but as always, the best way to learn is to learn by doing, so i've started on my project.

Now with that background out of the way, I've started on my voyage to making this custom script.

It has many stages, but I will try to build it step by step.

What my script generally will do in the end will be to take data about a certain user (data would be the users name, user start date and a user end date) and then do some functions based on whether or not todays date matches the pre-definined user start date and end-date.

As I dont want to mess with my databse and its tables, I decided to make a simple text file with the information as such:

UserName, Start Date, End Date
UserName, Start Date, End Date
UserName, Start Date, End Date


First thing for me was to poll todays date, which I have been able to do, yay!

Second is to poll data from the text file.

I've been able to pull the data using this call:

PHP Code:
function getnames()
    {
    
$data file_get_contents "users.txt" );
    return 
$data;
    } 
However now i'm stuck on how to parse the data properly.. Can anyone give me pointers on how to parse this info ? Ideally i'd like to separate the username, start date and end date into separate variables so i can compare them to todays date...

Thanks for any thoughts or answers!
Reply With Quote
  #2  
Old 05-30-2006, 11:35 PM
Adrian Schneider's Avatar
Adrian Schneider Adrian Schneider is offline
 
Join Date: Jul 2004
Posts: 2,528
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

PHP Code:
function getNames()
{
    
$lines file('your_file.txt');

    
$users = array();
    foreach (
$lines as $line)
    {
        
$users[] = explode(', 'trim($line));
    }
    return 
$users;

Similar to yours...

file() takes the first parameter, and returns an array containing all of the lines.

Then, I created an array which I will load with all the user data...

foreach is a loop. For each (array) $lines, set $line equal to that row. I then add a new row the the $users array, containing an array for that current user.

Using explode(), you can take a string, and turn it into an array, using the first parameter as a delimiter, and the second as the source array. I used the function trim() on $line because the file() function does not get ride of the whitespace (usually a newline) after each line.

After the loop is complete, return the final array. Here is how my array looked, based off this data:
Code:
SirAdrian, today, tomorrow
Bob, Jan 1st, Feb 1st
Jeff, Next Year, in two years
Code:
Array
(
    [0] => Array
        (
            [0] => SirAdrian
            [1] => today
            [2] => tomorrow
        )

    [1] => Array
        (
            [0] => Bob
            [1] => Jan 1st
            [2] => Feb 1st
        )

    [2] => Array
        (
            [0] => Jeff
            [1] => Next Year
            [2] => in two years
        )

)
Reply With Quote
  #3  
Old 05-31-2006, 01:33 AM
jwocky jwocky is offline
 
Join Date: Mar 2005
Posts: 138
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Awesome, thanks for the help

Looks like I'm thru step #2 with your help.

Now to learn how to properly access the data...

i'm trying to do

echo $users[0];

but that doesnt work obviously..

My next step is to do an if->then check with the data in my new array (thanks to adrian), how do I properly access the data to do that?

What I mean is what is the syntax to pull one piece of specific data out?

Thanks!
Reply With Quote
  #4  
Old 05-31-2006, 01:37 AM
Kirk Y's Avatar
Kirk Y Kirk Y is offline
 
Join Date: Apr 2005
Location: Tallahassee, Florida
Posts: 2,604
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Do you mean like "$db->query(SELECT * FROM tablename WHERE condition = '1')"?
Reply With Quote
  #5  
Old 05-31-2006, 01:38 AM
Adrian Schneider's Avatar
Adrian Schneider Adrian Schneider is offline
 
Join Date: Jul 2004
Posts: 2,528
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Foreach is very useful again (and in this case, all the loops are really)...

I would do something like this:
PHP Code:
// ...

$users getNames();

foreach (
$users as $user)
{
    
// $user[0] = username
    // $user[1] = start date
    // $user[2] = end date

Just a note, I changed my code earlier to a simplified version without updating the output, so check back on that. Anyway, inside this foreach loop, $user would be an array containing the user currently being processed. In here, you would display / do whatever you plan to do with each user.

Edit: echo $users[0] won't work because it is an array. It will just display "Array". To display anything, you will have to know the exact value you are searching for (or use a loop, which goes through them all). An example would be
PHP Code:
echo $users[0][0]; 
which would display the username of the first user.

@acidburn: the data is in a text file, so queries are no good here.
Reply With Quote
  #6  
Old 05-31-2006, 01:50 AM
jwocky jwocky is offline
 
Join Date: Mar 2005
Posts: 138
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by SirAdrian
Foreach is very useful again (and in this case, all the loops are really)...

I would do something like this:
PHP Code:
// ...

$users getNames();

foreach (
$users as $user)
{
    
// $user[0] = username
    // $user[1] = start date
    // $user[2] = end date

Just a note, I changed my code earlier to a simplified version without updating the output, so check back on that. Anyway, inside this foreach loop, $user would be an array containing the user currently being processed. In here, you would display / do whatever you plan to do with each user.

Edit: echo $users[0] won't work because it is an array. It will just display "Array". To display anything, you will have to know the exact value you are searching for (or use a loop, which goes through them all). An example would be
PHP Code:
echo $users[0][0]; 
which would display the username of the first user.

@acidburn: the data is in a text file, so queries are no good here.
Adrian, absolutly perfect... this works perfectly for me. I'm still finishing up this section of my process, but basicly this is what i'm having it do, I'm having it take the first date (the start date) and compare it to today's date and my if->then statement combined with your foreach statement has done the trick so far.

FOr now I put in echo commands just to see if it was working so far, I will now replace those with the actual function I want it to do, which has to do with changing the usergroupd of that user... This will take a bit more research

PHP Code:
function comparestart($today,$users)
    {

    foreach (
$users as $user)
    {
            
// $user[0] = username
            // $user[1] = start date
            // $user[2] = end date
    /* echo $user[1]; */
    
echo "<BR>";
        if (
$today==$user[1])
        {
        echo 
$user[1];
        }

    } 

    } 
Ok...

Now on to Stage 3..

Now that this script effectivly checks the user list from a text file and checks the date against todays date, it then effectivly sorts out whos date matchs todays date.

(note in previous posts I was using actual usernames, now I will swith to userid #s to keep things simple for now.. so $user is now a number instead of a name)

Now I have it calling a function called promote() which will take that user and move him from his current usergroup to usergroup #9

I'm using this call:

PHP Code:
function promote($username)
{

$vbulletin->db->query_write("UPDATE user SET usergroupid = '" "9" "' WHERE userid IN (" $username ")"
echo $username " promoted!!" "<BR>";


Now this is not working.. I think the problem might not be just a problem with bad database query instructions, but a bigger problem. Namely, how in the world does this script know which database to use, etc etc.. Again i'm very new to this, so is there some initialization I should put at the begining of my php file to tell it what $vbulletin is, etc and where to find my databases?
Reply With Quote
  #7  
Old 05-31-2006, 02:55 AM
sambah sambah is offline
 
Join Date: May 2006
Posts: 67
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

To tell your script which database to connect to do the following.

At the beginning of your file add:

Code:
include('config.php');
Then make a file called config.php while looks like this. (assuming your vb database is mysql)

Code:
<?
$dbuser = "your database username";
$dbpass = "your database password";
$db = mysql_connect("localhost", $dbuser, $dbpass);
$dbname = "name of your database";
?>
Hope this helps
Reply With Quote
  #8  
Old 05-31-2006, 03:03 AM
jwocky jwocky is offline
 
Join Date: Mar 2005
Posts: 138
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thanks very much, I will try that in a second.

I also found this:

require_once('./global.php');

does that do the same thing ?
Reply With Quote
  #9  
Old 05-31-2006, 03:08 AM
sambah sambah is offline
 
Join Date: May 2006
Posts: 67
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I'm not sure what global.php does to be honest but its not the DB configuration data.

The database file that VB uses is /includes/config.php

Sorry... I said invision before for some weird reason!
Reply With Quote
  #10  
Old 05-31-2006, 03:23 AM
jwocky jwocky is offline
 
Join Date: Mar 2005
Posts: 138
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

This is a great group of ppl we have here so far, I just took a break from coding for a few mins and I just realized how far I've gotten with this script from not knowing anything a few hours ago. I cant say thanks enought to everyone so far.. I cant wait to see this script to completion and hopefully others can use this info when starting their own scripts from scratch.

:banana: :banana:
Reply With Quote
Reply


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 09:51 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.06389 seconds
  • Memory Usage 2,285KB
  • Queries Executed 11 (?)
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
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (4)bbcode_code
  • (8)bbcode_php
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (2)pagenav_pagelink
  • (10)post_thanks_box
  • (10)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (10)post_thanks_postbit_info
  • (10)postbit
  • (10)postbit_onlinestatus
  • (10)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