How to install Apache 2/PHP 5/MySQL 5 under Windows XP

Sounds riveting doesn’t it?

I did this a while ago on my laptop, and it was a major headache. When I came to do it again on my desktop (laptop is in the laptop hospital having an AC socket replacement) it was no less of one. The problem is that most of the web-available tutorials are either incomplete or not up to date with the new versions of the software, and if you’re anything like me the official documentation is not so much verbose as impenetrable. So, in an effort to help mere mortals like myself, is as simple an explanation as I can muster of how to do it. This only applies to the platform, server and software configuration detailed above - if you want to do this on a Linux box, sorry, ask somebody else. Also this is intended to be a development installation only - I’m not an expert on server security, so if you’re actually going to use this as a live server you should read up on how to configure it properly.

Installing Apache

Warning: Apache says you need Service Pack 1 to install the server. I don’t know what happens if you haven’t got it, but if you haven’t I suggest you go no further.

  1. Go to the Apache server page where you will find a list of downloads. You want the most up-to-date, stable, Windows binary version available. At the time of writing, this is version 2.0.55, but there will probably be a binary of version 2.20 there soon. Download the installer file and run it.
  2. Read through the license, agree to it and click Next, read the information on the next page and click Next.
  3. Here is the first bit of configuring you need to do. In the Network Domain and Server Name boxes enter the word “localhost”. In the Administrator’s Email Address box put in any old email address (e.g. “me@localhost”). Click Next.
  4. Choose the Typical Setup and click Next.
  5. The next step is to choose the directory where the server is installed. It’s best to keep this simple so I suggest changing this to C:\Apache2. Click Next.
  6. At this point you should close any other applications you have open, and also turn off your firewall. Occasionally some programs will interfere with Apache’s socket connection and cause the installation to fail. Don’t forget to turn the firewall back on afterwards.
  7. Click Install to - well - install it, and that’s that. Just to check it’s working, open up your browser of choice and enter http://localhost/ in the URL bar. You should get a nice Apache default screen.

Installing PHP

  1. Head to the PHP downloads page and once again look for the most recent stable Windows binary (5.1.2 at the time of writing). You don’t want the installer version as this doesn’t work with Apache. Download the .zip file.
  2. Unzip the contents of the file into C:\php5\.
  3. Now it starts to get complicated. Open up Control Panel - Performance and Maintenance - System. Select the Advanced tab and click the Environment Variables button at the bottom. In the System Variables box, find the Path entry and double click. At the end of the line add the following: ;C:\php5. If there is already a semicolon at the end of the line you don’t need to add the second one. Click OK, and OK again.
  4. Now go into C:\php5 and find the file named php.ini-recommended. Copy this file into the directory C:\WINDOWS and rename the copy as php.ini.
  5. Now open up your Programs list from the Start menu and find the Apache folder. In the “Configure Apache Server” folder select “Edit the Apache httpd.conf Configuration File”. This opens up - yep, you’ve guessed it - the Apache configuration file. Fairly near the top of this there’s a block of lines that all start with “LoadModule”. At the bottom of this block enter the following two lines:
    LoadModule php5_module c:/php5/php5apache2.dll
    AddType application/x-httpd-php .php .html

    Save the file, and at this point restart your computer.

  6. PHP should be up and running at this point. To check, the best way is to run some code. Open up Notepad or any text editor and type in <?php phpinfo()?>. Save this as phpinfo.php in your server root directory, which is C:\Apache2\htdocs. Now go to your browser and type in http://localhost/phpinfo.php. You should get a page containing information on your installation of PHP and its settings. If you don’t, try restarting Apache (you can do this from the little Apache icon in your notification area (bottom RH corner). If still no joy, check the steps above (if you didn’t restart your computer, it won’t work).

At this point there are a number of extra things you can do - none of them are essential but they do make things a bit more convenient. I like to create a desktop shortcut to C:\Apache2\htdocs, as this is where all your web files have to go, and it’s a pain in the arse to have to go through Start - My Computer each time. You may also like to tweak the DirectoryIndex entry in Section 2 of the Apache httpd.conf settings - this is the list of files the server will look for by default if you don’t put a filename at the end of the URL. By default there is only index.html - I suggest you add index.htm and index php, or you can change them to home.html and home.php or whatever. Each filename must be separated by a space. Save the file and restart Apache when this is done.

Installing MySQL

  1. Go to dev.mysql.com/downloads/ and select the most recent stable version (5.0 at the time of writing). Select the Windows version and download the .zip file. Extract it anywhere, and then run the Setup file.
  2. You should choose the Custom installation, to allow you to select an installation path. You should not need to alter any of the component settings. Change the installation path to C:\MySQL and click Next.
  3. Click Install at the confirmation screen to begin the installation. When this is complete you will be invited to register with MySQL to gain access to the forums and bug reporting. Skip this for now, and do it later if you wish. You will then be given the option to launch the MySQL Configuration Wizard. Do this.
  4. Select the Standard Configuration option on the first screen and click Next.
  5. On the next screen, make sure both boxes are checked. The latter box (Include Bin Directory in Windows Path) will allow you to enter MySQL commands from the command line without first having to naviagate to the bin directory.
  6. The next step is important. I strongly recommend you set up a password for the root user. It is also not a good idea to setup an anonynous user. Both of these are serious security holes. True, you’re only going to be running this as a development setup, but better safe than sorry. Choose a good password and click Next.
  7. Click Execute on the next screen to configure the server. Once this is done, restart your computer again.
  8. At this stage, check MySQL is up and running by opening up the command line (in the Accessories folder) and typing the following command:
    mysql -u root -p

    You will be prompted to enter your password (which you just set up in the config wizard). Do this and you should get a welcome message. Try a couple of MySQL commands like use mysql; followed by show tables; to see what happens.

  9. Now you need to get PHP to talk to MySQL. First of all, navigate to C:\WINDOWS and open up php.ini in your text editor. Scroll down to the “Paths and Directories” section and find the line that begins with extension_dir. Change this line to read:
    extension_dir = "c:\php5\ext"
  10. Further down is the Dynamic Extensions section with a block of lines all starting with ;extension=. The semicolons are comment markers that you need to delete in order to activate the extensions. Delete the semicolons from the lines extension=php_mbstring.dll and extension=php_mysql.dll. Save the file and restart Apache.
  11. Finally, just check you added the PHP directory to the PATH environment variables, as in step 3 of the PHP installation. Do this now and restart your computer if you haven’t already.

That should be it. I recommend installing phpMyAdmin as a means of administering your database without faffing around with the command line. It will also give you some indication of what might be wrong if PHP and MySQL aren’t hooked up properly. It’ll almost certainly be a problem with the extension and/or Path settings as outlined in the last three steps above. There’s a config file you’ll need to set up with your root password to get it to work - see the phpMyAdmin documentation for details.

Got all that? Good. If this doesn’t work for you, or if you’re cleverer than I am and have noticed a mistake, please leave a comment and I’ll make corrections.

56 Responses to “How to install Apache 2/PHP 5/MySQL 5 under Windows XP”

  1. Gravatarmlambie Says:

    totally bitchin!!
    thanks

  2. Gravatarrelik Says:

    Thank you, this is the best tutorial on how to get apache 2 and php5 running together. I spent an hour trying other methods to no avail. You rock.

  3. GravatarNicky Says:

    The documentation provided is straight to the point. Well done.

  4. GravatarNicky Says:

    I also discovered from other documentation that the alternative to copying php.ini (setp 4 of Installing PHP) to c:\windows folder, we can choose to retain the php.ini in the c:\php5 folder and including the following statement in the apache2 httpd.conf file.

    # configure the path php.ini
    PHPIniDir “C:/php”

    This works well for me.

  5. GravatarJames Says:

    Thanks for that Nicky. That would seem to be a good idea, certainly in the interests of not moving files all over the place. I found other sources which suggested setting the PHP extension directory as C:\php5 and moving the necessary extensions in there, but that for me seemed counter-productive, as it only means moving more files later on if you need to use other extensions.

  6. GravatarC Says:

    Thank you James. This is the first tutorial I have come across which simplified starting up MYSQL and PHP. Hopefully it should all work fine when I start working on my database and website for my dissertation.

  7. GravatarFrank Says:

    YES!!!

    I’ve been fighting with this for over a week. After visiting what very well could be every single web page in existance on the net, I finally found this page. I followed this step by step, and *everything* worked perfectly on the first try.

    THANK YOU!!!

    I’d buy you a cold one if I could, but since I can’t do that, I’ll plug a link to this page on some programming forums I frequent.

  8. Gravatarprabu Says:

    not bad i unable to connect mysql

    Thanks

  9. Gravatarxkullbox Says:

    after following the steps i am still unable to open the connection to mysql !

  10. GravatarDinis Says:

    It’s really working. Finally!!!
    Thank you very much for the time you have dedicated to write this article. I’m shure is helping a lot of people like me.

  11. GravatarJames Says:

    @ prabu and xkullbox - sorry you’re still having problems. What happens when you try to connect to MySQL? What error message do you get? Do Apache/PHP work as they’re supposed to?

    If you’re still stuck email me at james[at]jamestopp[dot]com and I’ll do my best to help you.

  12. GravatarShane Says:

    Best tutorial around. Was completely stumped, trying to connect them all up.Thanks again

  13. GravatarRyan Says:

    Same luck as prabu and xkullbox …
    I’m getting… “Call to undefined function mysql_connect() ”

    I’ve currently given up, believing it to be some compatibility issue somewhere.

    Any ideas. I was so frustrated I went back to using php4 to make sure it worked fine and it did.

    Obviously I believe the error to be caused by apache not reading php.ini and picking up the module for mysql??? I’ve tried everything I can think of. I’ve moved dll’s all over my system, moved ini’s with no luck =(

    I’m tired of working on this atm… the one thing I can think of is that I’m using apache 2.2.0 … i could try scaling back to 2.0.5 or whatever, think it’s worth a try?

  14. GravatarJames Says:

    Hmmm. I don’t have Apache 2.20 yet, but I don’t think it’s a server problem - if Apache couldn’t read php.ini then php wouldn’t work at all. Have you checked step 6 in the php install?

    It’s more likely to be a problem with the mysql extensions. Carefully check through mysql step 9 onwards. I personally wouldn’t recommend moving files around too much, because there are always several places where they have to be referenced. Leave them in c:\php5\ext and make sure that this is the value for extension-dir in php.ini. Also make sure the 3 extensions in step 10 are uncommented. It’s probably a little typo somewhere.

    php4 was much more closely integrated with mysql but due to licensing issues they had to scale this back a bit for php5. If php4 meets your needs then fine, but php5 is a huge step forward due to its better OOP capabilities.

  15. Gravatarkristin Says:

    i followed all the instructions but when i try to run the php script it asks me to open the file or save to disk. ive tried everything i can think of but to no avail. apache works fine but its not reading the php script.

  16. Gravatarkristin Says:

    problem solved. i dont know what happened but it is now up and running.

    kristin

  17. GravatarJon Says:

    It’s alive
    Not so many pretty pictures but it works
    GR8

  18. GravatarRobert Says:

    I’m glad it’s working for some people. I was fine working with earlier versions but when I tried to follow your directions for this upgrade, I can’t even get php to work.
    After I add the line: “LoadModule php5_module c:/php5/php5apache2.dll”
    Apache won’t start-up. The dos test says that Apache can’t find the .dll but it’s there.
    Also tried the variations your viewers suggested — no luck on this one.

  19. GravatarJames Says:

    All those with problems:

    I found the following user contributed note at http://uk.php.net/manual/en/install.windows.apache2.php

    I had a hard time to install PHP5.1 with Apache2.2 as a module, because whenever I tried to start apache, I always got the error that “Cannot load C:/php/php5apache2.dll into server: The specified module could not be found.”
    I have checked that php5apache2.dll does in the right directory of “c:/php/”, and I have also tried to copy some files (php5ts.dll, php.ini) into relevant directories, such as WINDOWS/, Apache2/, but none of them worked.

    I then found a post http://www.apachelounge.com/forum/viewtopic.php?t=139&view=next&sid=b8df0fe80ac524939e2553ad7ee49123
    and tried as suggested by downloading a zip file created by Steffen, and followed the instructions. The apache2.2 now works fine.

    If you’re using Apache 2.2 this may be the cause of the problem - apparently the dll that php supplies is specific to the Apache 2.0.x API. I suggest you use the alternative dll from apachelounge, or roll back to 2.0.x. Either way, let me know how it goes.

  20. GravatarAdam Says:

    Yes, After struggling over 2 hours to get the module to load php5apache2.dll for Apache 2.2.2 and PHP 5.1.4, I got it to work. Now it doesn’t say, The specified module was unable to be found.

    As James said, go to http://www.apachelounge.com/download/ and get php5apache2.dll-php5.1.x.zip, the apache2handler php5apache2.dll for Apache 2.2.x and PHP 5.1.x.

    Just switch the dll to the updated working one and now PHP 5.1.4 will work with Apache 2.2.2, rather than forcing you to stick with Apache 2.0.x.

  21. Gravatarshaj miah Says:

    you guys rock

  22. GravatarWes Says:

    For Apache 2.2 you can download the latest stable PHP release from PHP
    Snapshots
    site and that worked for me.

  23. GravatarDinho Says:

    Ótimas dicas

  24. GravatarDaveP Says:

    Thx lot of work in writing this so thx again. Ok Ive got it working myself this may help..If it says MODULE not found your path in php.ini is incorrect..If it says PRPCEDURE not found then your path is ok. To check this put semicolon back on php_mysql.dll and remove from php_msql.dll and try. If no errors msql will appear in phpinfo.php in browser. restore previous settings and……delete php5 folder and reinstall php5 to c:/php5 ( yes previously deleted folder )and try…….crazy but works

  25. Gravatarcppgenius Says:

    Super Installation guide James. Very detailed and to the point without skipping important stuff. I am also new to PHP and came across other tutorials which simply shunt me around. Everytime I thought I had everything to install an Apache PHP sever I found I still had to download something because the tutorial did not mention it (for instance, I did not know Apache and PHP were two separate packages and thought if I downloaded the PHP zip file I would have everything. When the install guide started talking about the httpd.conf file I lost it completely because the install guide never mentioned to download Apache as well). Thanks for the links for every resource provided in your guide. Other guides also had other confusing stuff that I needed to add to the httpd.conf file. Hell I mean I’m a starter and want a starter’s guide. Just get me started and I will fill in the gaps as I go. Your install guide made that possible for me.

    And even the problem with Apache 2.2.2 was a breeze thanks to your great guide.

    I will certainly come back to your blog if I ever run into problems again in the future, before I try any other resource.

  26. Gravatarovertaker Says:

    I am still stuck in the “Cannot load C:/php/php5apache2.dll into server: The specified module could not be found.”

    I tried what adam said in his post
    doesn’t work

    I tried to change all path in the php.ini
    doesnt work either

    this is so suck
    compared to J2EE and .NET, PHP + Apache installation is hell

  27. GravatarJames Says:

    @overtaker: Sorry to hear you’re having difficulties. I can only guess, not being able to see your setup, that either there is an issue with the versions of PHP and/or Apache you’re using, or there’s a typo in one of your config files somewhere. There is always the option of uninstalling the whole lot and starting again, as I did several times. If you do this, make sure any copies of php.ini you may have moved are deleted before you start over. Bear in mind any potential problems with current versions may have arisen since this post and subsequent comments were written. At some point I’ll have to revise this post with info on current versions and patches required, but I’m too tired right now.

    I admit it’s not the easiest thing to do, but remember these are two separate pieces of OS software being worked on by (presumably) entirely different developers (and BTW i’d damn well expect installing .NET on top of Windows to be easy given how much Windows costs), so sticking points such as you’re experiencing are an occupational hazard. It’s all worth it in the end.

  28. GravatarStephen Says:

    how do i know if it has worked , i’m able to connect th the BD via command prompt , but phpinfo() command isn’t finding any mysql ??

  29. Gravatarkristin Says:

    installed mysql and when i try to test it using show tables; i get: ERROR 1046 : no database selected. whats the deal with that?

  30. Gravatarkristin Says:

    ok i have a bad habit of skipping over instructions bc i think theyre optional. went back and typed in use mysql’ followed by show tables; and it worked. thanks anyhow. this is the easiest setup ive seen for installing apache/php/mysql thanks.

    kristin

  31. GravatarTolis Says:

    As Wes Said earlier:

    “For Apache 2.2 you can download the latest stable PHP release from PHP
    Snapshots site and that worked for me.”

    For apache 2.2 YOU MUST DOWNLOAD the latest Sable PHP Release FROM PHP. There is a new DLL called php5apache2_2.dll that works with APACHE 2.2

    a small quote from the original announcement for APACHE 2.2

    “Modules written for Apache 2.0 will need to be recompiled in order to run with Apache 2.2, but no substantial reworking should be necessary.”

    http://www.apache.org/dist/httpd/Announcement2.2.html

    I hope this helps…

  32. GravatarJames Says:

    @stephen - try a couple of php’s MySQL functions, maybe something like this:
    < ?php
    $conn=mysql_connect('localhost','root','[yourpwd]') or die (mysql_error());
    echo $conn;
    ?>

    If you run this code and the page displays something like “Resource id#1″ then all is well. If you get a “call to undefined function” error then your steps 9-11 above aren’t quite right.

    Are you sure the mysql info isn’t in phpinfo? From memory it appears a long way down the page.

  33. GravatarJoe Says:

    Thank you so much!

    I spent hours going through other guides but they were very complicated and didn’t work.

    Your guide was concise, straightforward, and I got it set up very quickly. The only thing is, I think when you said “restart computer,” it was only necessary to restart Apache.

  34. GravatarJason Says:

    This is a really good tuturial I had given up on php5 cuz I spent too many hours reading “tutorials” trying to get it to work and this only took me 20 minutes

  35. Gravatarhyeclass Says:

    after reading numerous sites, for installing apache+php5+mysql5, this is the best one so far

    very short and very informative

    greate site, hope you still keep it coming

    hyeclass.

  36. Gravatarcormac Says:

    great tutorial, thanks

  37. GravatarVishal Says:

    Dude, your a living legend. You helped me fix a bug that I encountered from dodgy instructions from another tutorial.

    Thanks for taking the time to write the tutorial…

    Vishal

  38. GravatarChris Says:

    Thanks to Nicky for his comment back in february, suggesting to add the following line:

    # configure the path php.ini
    PHPIniDir “C:/php”

    I had been fighting all morning with PHP, which worked but was not loading the MySQL extension, and this solved it. I don’t want to move php.ini to the Windows folder, and it seems that Apache couldn’t find php.ini even though the php folder *is* included in my PATH variable.

    I just wanted to warn everyone about copying/pasting the PHPIniDir instruction from Nicky’s post. I did so and it copied it with *curly* quotation marks instead of straight ones, so Apache wouldn’t accept the instruction. Make sure you use straight quotes.

  39. GravatarChris Says:

    Just noticed my quotation marks were changed to curly ones, too. It’s this commenting system’s fault, it seems.

  40. GravatarJames Says:

    It’s not a fault, it’s assuming that the code snippet is an ordinary chunk of text. If you use <code> and <pre> tags to enclose code fragments this shouldn’t happen. Semantic markup, people! Anyway that’s another story.

  41. GravatarJ-Ware Says:

    Nice one, this was a real help. I’ve tried loads of other resources but none of them made sense or worked.

    Although, I had to do the apache2.dll thing to get mine working but it wasn’t too difficult. I am going to recommend your site to everyone at uni.

    Cheers

  42. GravatarBen Sayers Says:

    ABSOLUTE BRILLIANCE. You’ve done an excellent job here. I tried installing PHP for about 2 days using various other websites and the PHP manual on php.net and was about to go CRAZY, but then luckily I followed your extremely simple steps and as if by magic it worked.

    Thank you very much. You are a Saviour!

  43. Gravatarrich Says:

    I too am trying to load Apache. Your directions are great, BUT Apache starts and then immeditely stops when I try to fire it up manually. It won’t even think about firing up automatically. I tried the firewall thing. Made sure IIS was’nt installed. Still no dice. This is driving me nuts!
    I’ve got 20 emails and 20 message board postings out there with no reply. Where the heck are the 40% of the poeple that use Apache at! Here is a copy of my error log. If you can figure out my problem i will recommend you for the distinguised service cross.

    [Mon Mar 05 23:08:13 2007] [notice] Apache/2.2.4 (Win32) configured — resuming normal operations
    [Mon Mar 05 23:08:13 2007] [notice] Server built: Jan 9 2007 23:17:20
    [Mon Mar 05 23:08:13 2007] [notice] Parent: Created child process 248
    [Mon Mar 05 23:08:13 2007] [notice] Child 248: Child process is running
    [Mon Mar 05 23:08:13 2007] [crit] (OS 10022)An invalid argument was supplied. : Child 248: setup_inherited_listeners(), WSASocket failed to open the inherited socket.
    [Mon Mar 05 23:08:13 2007] [crit] Parent: child process exited with status 3 — Aborting.

    PS I’m running XP
    Thanks

  44. GravatarJames Says:

    @rich: From memory, this sounds like what happened to me first time, and it was because I had Skype running in the taskbar. Check everything is closed and try again.

  45. GravatarLeticia Says:

    This thread continue been helpful. I’m tryng run apache2.2.4 and php5 and this post:

    “For apache 2.2 YOU MUST DOWNLOAD the latest Sable PHP Release FROM PHP. There is a new DLL called php5apache2_2.dll that works with APACHE 2.2″

    Was the solution to my problem:
    “Cannot load php5apache2.dll into server The specified module could not be found”

    Thanks to all.

  46. Gravatarnewbie Says:

    Thanks for the tutorial, it really helped me a lot getting my php5 to talk to mysql. keep up the good work.

    Warm Regards

  47. Gravataraditya Says:

    i am getting error…….help people
    me almost dead by installing it!!!

    127.0.0.1 - - [22/May/2007:18:37:25 +0530] “GET /phpinfo.php HTTP/1.1″ 404 209

    [Tue May 22 18:37:25 2007] [error] [client 127.0.0.1] script ‘E:/Aditya/apache/htdocs/phpinfo.php’ not found or unable to stat

  48. GravatarSpiridon Adrian Says:

    Still MySql doesen’t appers in phpinfo() :| :((

  49. Gravatargary Says:

    Thanks for taking the time to do this! Was getting in a right mess following differing tutorials from all over the net, so uninstalled everything and followed this all the way through, worked perfect!

    Thanks again!

  50. GravatarTerry Jones Says:

    Great set of instruction please incorporate the following info into the instructions PHP4 had MySql support built in so it would by default show up in the output of the phpinfo()script. PHP5 does not have built in support for MySql so unless futher configuration is done the MySql information will not show up in the ouput of the phpinfo()script.
    I used the following set of software for my installation
    1)php5.2.3
    2)mysql5
    3)apache2.0.59
    4)operating sysyem Windows XP Pro with service pack2.
    I found a post on a forum that I think would solve a lot of problems for users of php5. It work for me. Please give me feedback if this post help anyone else.The answer is not my work. My email address is terryjones130@msn.com

    http://www.thescripts.com/forum/thread678313.html

  51. Gravatartenz Says:

    thanks! i tried it like a million times before setting my eyes on this. yours was the only article on the web that helped. thanks again!!

  52. Gravatarshegun babs Says:

    if Apache and PHP aren’t talking after adding ‘LoadModule php5_module c:/php5/php5apache2.dll’ in the httpd.conf file try changing the module file to php5apache2_2.dll

  53. Gravatardavid Says:

    After many attempts with other tutorials, I’m glad to have found your support site.

    Finally have the trio working and I can catch up on sleep!

    Thank you!

  54. GravatarNor Aziah Says:

    Thanks a lot James for your simple and straight forward installation guide. Finally I got all three running. I almost give up. Other tutorial seem more complicated. Thanks for your effort.

  55. GravatarCoenraad de Beer Says:

    Hi James, I saved your guide 2 years ago when I installed PHP and Apache for the very first time, just in case I needed it again for a fresh install on another computer (because I found it very helpful then). So it came in handy again when I had to install them on my Laptop as well.

    Everything worked fine but I struggled for hours to get PHP and MySQL to hook up in order to run phpMyAdmin. The problem was a typo in your guide extension-dir should be extension_dir otherwise you will never be able to use phpMyAdmin.

    I guess that’s the reason why Ryan couldn’t get PHP to pick up the mysql libraries. See comment: (http://www.jamestopp.com/dfym/2006/01/29/how-to-install-apache-2php-5mysql-5-under-windows-xp-home-sp2/#comment-98)

    I was able to get MySQL to work on the previous installation, but never found out why. I guess at some point I must have replaced php.ini with the original one and only replaced the path instead of the whole entry.

    It would be great if you can fix this typo because this is really a helpful guide.

  56. GravatarJames Says:

    Well spotted Coenraad - typo is now fixed.

    Sorry it took so long to approve your comment - I have been severely neglecting the blog of late and have just moderated 321 comments, all but 2 of which were spam.

Leave a Reply





-->