GithubHelp home page GithubHelp logo

interconnectit / search-replace-db Goto Github PK

View Code? Open in Web Editor NEW
4.0K 164.0 852.0 1.3 MB

This script was made to aid the process of migrating PHP and MySQL based websites. Works with most common CMSes.

Home Page: https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

License: GNU General Public License v3.0

PHP 100.00%

search-replace-db's People

Contributors

andrewryantech avatar bananastalktome avatar bsy-web avatar cyberhobo avatar damiencarbery avatar davecoveney avatar fauria avatar getdave avatar gianluigi-icit avatar hyperionjrw avatar jack-interconnectit avatar jnorell avatar julego avatar macbookandrew avatar mamchenkov avatar matt-icit avatar msenateatplos avatar paulbunyannet avatar pcurrier avatar petitphp avatar rahe avatar rausanka avatar roborourke avatar rubenreyes2000 avatar sheabunge avatar szepeviktor avatar tentwofour avatar tomjn avatar wilsonww avatar zanzix avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

search-replace-db's Issues

Does not properly search/replace udesign_options

I'm attempting to use it to migrate from a development environment (http://dev.truenorth.com) to a staging environment (http://truenorth.brandedclever.com). My goal is to search and replace the URLs and when I run the script, it completes successfully. However, when I load the page on the staging server it renders incorrectly.

Based on my testing, I've narrowed it down to an 'option_name' in 'wp_options' called 'udesign_options'. I've included pasties to the before and after versions of the contents of that field so that you could see a diff of the two. From what I can tell, it doesn't seem to be updating the length of certain fields, which might be the issue.

Any suggestions would be hugely appreciated since this is the only site I can't get working.

Before search and replace: http://pastie.org/private/w5wqplpt17ujjqnydkavq
After search and replace: http://pastie.org/private/drvedkwf55gjcackqrkhw

General Info

Development Environment

Staging Environment

Thanks in advance!

Cli issue with UTF8 strings

I'm using cli mode for version 3.0.0-beta.

The search and replace is corrupting the utf8 strings in my database that are modified by the replace.

As a quick fix i added in file srdb.class.php under line 449 the following:
$connection->exec("set names utf8");

after this change it works fine for me.

string not replaced

Shouldn't the string shown below be replaced? I put echo's around the call to recursive_unserialize_replace


search: /home/meicvs5/public_html/wp-content

replace: E:/TwdDevel/WSFiles/twd_wp_website/communityplugin2/www/wp-content

data_to_fix: a:8:{i:0;b:0;s:39:"peters-post-notes/peters_post_notes.php";s:13:"ppn_uninstall";s:35:"si-contact-form/si-contact-form.php";s:24:"si_contact_unset_options";s:102:"/home/meicvs5/public_html/wp-content/twd/v01/plugins/twd-admin-page-options/twd-admin-page-options.php";s:30:"twdadmin_delete_plugin_options";s:94:"/home/meicvs5/public_html/wp-content/twd/v01/plugins/twd_seller_welcome/twd_seller_welcome.php";s:32:"frswelcome_delete_plugin_options";s:49:"twd-admin-page-options/twd-admin-page-options.php";s:30:"twdadmin_delete_plugin_options";s:41:"twd_seller_welcome/twd_seller_welcome.php";s:32:"twdwelcome_delete_plugin_options";s:27:"twd-reports/twd-reports.php";s:31:"twdreport_delete_plugin_options";}

edited_data: a:8:{i:0;b:0;s:39:"peters-post-notes/peters_post_notes.php";s:13:"ppn_uninstall";s:35:"si-contact-form/si-contact-form.php";s:24:"si_contact_unset_options";s:102:"/home/meicvs5/public_html/wp-content/twd/v01/plugins/twd-admin-page-options/twd-admin-page-options.php";s:30:"twdadmin_delete_plugin_options";s:94:"/home/meicvs5/public_html/wp-content/twd/v01/plugins/twd_seller_welcome/twd_seller_welcome.php";s:32:"frswelcome_delete_plugin_options";s:49:"twd-admin-page-options/twd-admin-page-options.php";s:30:"twdadmin_delete_plugin_options";s:41:"twd_seller_welcome/twd_seller_welcome.php";s:32:"twdwelcome_delete_plugin_options";s:27:"twd-reports/twd-reports.php";s:31:"twdreport_delete_plugin_options";}


Completed

In the process of replacing "/home/meicvs5/public_html/wp-content" with "E:/TwdDevel/WSFiles/twd_wp_website/communityplugin2/www/wp-content" we scanned 26 tables with a total of 1599 rows, 0 cells were changed and 0 db update performed and it all took 0.645770 seconds.

UI notes

screen shot 2014-03-07 at 11 13 57

A few notes:

  • The warning on the table keys should be below the actions or in a separate section
  • Theres no way of clearing or collapsing the results below. I ran in dry run mode then tried to do a live run, but wasn't sure if it would clear the dry run results or simply append them on the end
  • It wasn't immediately clear what update-details did, but I'm guessing it doesn't belong in the same section as live/dry run
  • The use regex checkbox isn't centered vertically

UI: "dry run" -> "view changes" -> before - after preview window: add ids

hello

it is not so easy for me to identify which row is belonging to which post "ID".
it would be nice to have the post "ID" from wp_posts "ID" column in the title of each row:

row 11, column post_content

would be

row 11, column post_content, ID 3366

i have no clue what is the best way to do it ...

thanks for excellent script and ui of it
sb

Major performance downgrade

I've been using the old searchreplacedb2.php for quite some time now, with great satisfaction.

Now I've eagerly tested the new version, and it's beautiful, responsive, easier to use, with much better real-time feedback.

But... v3 is so slow it's become unusable for me.

I've just successfully run a S&R over a large-ish WP MS DB, and the old version completed like this:

We scanned 4758 tables with a total of 865971 rows, 286395 cells were changed. 118284 db updates were actually performed. It all took 459 seconds.

As for the new version, it halted on table 362 (out of 4758) after running for over 1500 seconds.

So: the new version took 3x the time to do less than 10% of the work.

Wildcard select table names

It would be useful to be able to quickly select all WordPress tables in a database as we have all our 1028 (and growing) multisite tables alongside other tables used in our site.

On the command line it would be useful to be able to select using a wildcard:

-t wp_*

or

-t wp_28_*

On the webpage either a radio button for "All WordPress tables", or even a way to pick the name of a blog from a dropdown list?

Stronger Styling on Deletion link

Auto deletion is lovely, but the link isn't that obvious, so we could do with improving the styling there, or making it very very big.

CLI returns database string as Array, thus failing

I tried running the script on my server with short and long options, none worked. I saw that the database string was printing out as Array.

In my error_log i get this:
[24-Jan-2013 16:46:35] PHP Warning: getopt() [function.getopt]: No support for long options in this build in /home2/martint0/public_html/tilini/do-the-db-dance.php on line 46

error converting between table types

line 297 of srdb.class.php references the non-existant $this->alter_engines (plural). Changing it to the present $this->alter_engine (singular) allows conversion to innodb (or myisam) to work correctly again.

'delete me' erases site contents completely

Dear Sirs
first of all my compliments for this v3.0 ... it's really pleasant to see and functional to use!

Now, what I think it might be a bug: when I click delete me, the whole site contents is wiped out! That is, to be precise: all contents of the folder where the script is located are deleted, subfolders included.
And the page shows the message Could not delete the search replace script automatically. You will have to delete it manually, sorry! (note: this is the one ending with sorry).

I had a look at index.php code, and it looks like there is something wrong with delete_script execution, with its return value (apart from comment: it does return a value, not void) and how that return value is used by the invoking code in case 'delete'.

In my case, basename( __FILE__ ) is equal to 'index.php' and so $path is the containing folder (e.g. where wp-config.php is stored).
So delete_script will just wipe out all that folder, i.e. the whole site.

Probably it would be enough to state clearly in the readme that the tool should be put in its own subdirectory, and that subdir will be eventually erased. But at the moment, I think the readme file says to put the tool files in the root folder, or where wp-config.php is stored.

Just another quick observation: in delete_script, if the path is a directory, with that array_map solution the return value is the array itself, not the success/failure result of the whole operation ... if I'm not wrong.

Thanks again for the effort you put in this tool!
screenshot with message

CLI script only runs in 'dry-run' mode

Great tool. Thanks.

I got the AJAX error, which suggested I use the CLI version of the script.

Only challenge is that it only appears to run in 'dry-run' mode.

I ran it with ./srdb.cli.php -h localhost -n database -u username -p password -s "http://clients.conquerthechaos.co.uk/n5/" -r "http://portal.businessgrowthadviser.co.uk/portal/"and the first line of the output was...
results: The dry-run option was selected. No replacements will be made.

I'm not setting the --dry-run flag, so how do I get it to run in live mode?

Thanks for your help.

Support configuration file with a different name

We define the database constants in wp-config-live.php. The script does always parses wp-config.php, and thus can't find the values. It would help if we could pass a filename as a parameter to the script.

Search and Replace with old name part of new name

I discovered an issue when doing a search and replace on a non-Wordpress database. If you do a search and replace on a table where the original is, for instance, Trash, and you try to replace it with Trash 1.13 x 1.51 inches, it appears to run through the database twice, leaving you with Trash 1.13 x 1.51 inches 1.13 x 1.51 inches. The workaround is to do an initial search and replace where you replace Trash with asdfjkl; and then asdfjkl; with Trash 1.13 x 1.51 inches, but of course now you are making this into a two step process.

Error when the tables have multi primary keys (Drupal)

The function (for detect primary key) takes the last primary key discovered, and will launch a bad update on the table.

Is it possible to add in this function, a verification with the greater value of count on ( DISTINCT of all columns primary key) ?

Or a new field to force the name of primary key column.

Thanks

Error on page and onsubmit

Got the following on page error. Setup is in a WordPress multisite install. Currently can't access the WP install because I changed the domain the site is running on before changing the Site URL in WP. Don't know if that matters, but that is why I'm trying to use this tool, to search and replace from old domain to new domain. CLI seemed to work but did dry run even though I didn't ask it to. Second time CLI seemed to complete but no changes in DB.

screen shot 2014-02-11 at 11 13 50 am

Tried to run the script even with above on page errors and got this:

screen shot 2014-02-11 at 11 14 15 am

Super cool script if I can get it to work. Going to try 2.1 now. Thx!

Command line always runs in dry_run mode

This is on version 3.0.0 beta - downloaded today.

Command line mode always runs in dry_run mode.

It's late - so I can only offer a partial fix...

In srdb.cli.php and at L174 add

$args['dry_run'] = false;

to make the script run in command line mode without dry-run being set.

When showing Dry-run results, the texts to search and replace are not escaped

Hello there

just found a minor issue. Here are the texts inputed in search and replace fields:

replace:
<strong>TESTO DUMMY</strong>

with:
<strong>Produrre un testo (opzionale)</strong>

Here you can find attached a screenshot of the message showing Dry-Run results. As you can see:

  1. the replace text is not escaped, so the &lt; and &gt; are gone in place of < and >
  2. the with text is not escaped, so the <strong> is completely invisible, as the text is already bold by itself.

HTH
Keep up with the good work!

dry-run-results

Version 3.0.0 UTF8 Handling

UTF8 handling is good in 3.0.0 but only in certain use cases.

The problem is one of detecting which UTF8 coding is used and of handling that appropriately. Annoyingly this means creating multiple UTF8 collation databases for handling.

I would consider the following:

  1. Detect use of 3 byte UTF8 in the strings - if used and the DB collation is not utf8mb4 then give an error message and do not proceed - this will prevent the Cheshire Cat bug I discovered (see http://interconnectit.com/5237/the-cheshire-cat-bug/ ) where the 3byte (4 bytes within MySQL) are truncated.
  2. If MySQL version is 5.5.3 you can offer the option of converting the collation of tables to utf8mb4 - the only caveat is that this will increase the space required by the DB. A utf8mb4 collation can take 4x the space of the most efficient collations.
  3. Test for different collations, and consider that $connection->exec("set names utf8"); is relevant dependent on the collation available. Should we warn of problems in collations that aren't included in our tests? V2.1 and 2.2 had some tweaks that helped to handle some situations - take a look at what they did. Might help, might not.

Ultimately, code for safe and reliable search/replace operations on broad ranges of DB installs isn't trivial and given the resources we've applied to this it may be that we need to create a 'pro' version that is paid for in order to further support development, testing and maintenance.

Character encoding

I’m trying to replace ‘Cablégarn’ with ‘Cablegarn’ but the script says it finds 0 occurences. I know it’s there, I’ve tried to copy the text directly from the table cell using phpmyadmin and also using Sequel Pro then pasting it into the 'Search for' field. I guess it’s the encoding of the accented é that goes wrong. Any suggestions for how to handle ‘special cars’ in search terms?

The DB

Nothing found

CLI: The dry-run option was selected. No replacements will be made.

So, I'm trying to run this on a huge MU sites database. The purpose is to move from live to local again for some changes. Anyhow. I encountered some issues with the gui version so I thought I'd try with cli.

For some reason dry-run is enabled even if I don't specify it, running this:
./srdb.cli.php -h localhost -n db -u root -p password -s "site.net" -r "site.dev"

Gives me:
results: The dry-run option was selected. No replacements will be made.

And then it starts to run through the DB, and no changes are done.
Why's that?

Option for converting between charsets and their normalizations

Yesterday, I moved a page from a MacOSX Server to a Linux Server and ran into the problem that the filenames have been converted from NFD to NFC compliant UTF8 characters.

As this is an issue that also applies to serialized text, can you please add a feature here?

More Info:
http://stackoverflow.com/questions/12147410/different-utf-8-signature-for-same-diacritics-umlauts-2-binary-ways-to-write

Additionally I would like to see a conversion-option from latin1 to utf8 in serialized text :)

I know, that I could do part of that with iconv, but that's impossible since I also have serialized data that differs in the binary length.

EDIT: Here's a PHP library for normalization: http://php.net/manual/en/class.normalizer.php

serialized string error

The new v3 script doesnt convert serialized strings anymore. Missing widget settings over conversions.

<div class="help"> - many HTML errors

Fixed version:

<div class="help">
        <h4><a href="http://interconnectit.com/">interconnect/it</a> <a href="http://interconnectit.com/products/search-and-replace-for-wordpress-databases/">Safe Search and Replace on Database with Serialized Data v2.0.0</a></h4>
        <p>This developer/sysadmin tool helps solve the problem of doing a search and replace on a
            WordPress site when doing a migration to a domain name with a different length.</p>

        <p style="color:red">WARNING!</p> Take a backup first, and carefully test the results of this code.
        If you don't, and you vape your data then you only have yourself to blame.
        Seriously.  And if you're English is bad and you don't fully understand the
        instructions then STOP.  Right there.  Yes.  Before you do any damage.

        <h2>Don't Forget to Remove Me!</h2>

        <p style="color:red">Delete this utility from your
            server after use.  It represents a major security threat to your database if
            maliciously used.</p>

        <h2>Use Of This Script Is Entirely At Your Own Risk</h2>

        <p> We accept no liability from the use of this tool.</p>

        <p>If you're not comfortable with this kind of stuff, get an expert, like us, to do
            this work for you.  You do this ENTIRELY AT YOUR OWN RISK!  We accept no responsibility
            if you mess up your data.  There is NO UNDO here!</p>

        <p>The easiest way to use it is to copy your site's files and DB to the new location.
            You then, if required, fix up your .htaccess and wp-config.php appropriately.  Once
            done, run this script, select your tables (in most cases all of them) and then
            enter the search replace strings.  You can press back in your browser to do
            this several times, as may be required in some cases.</p>

        <p>Of course, you can use the script in many other ways - for example, finding
            all references to a company name and changing it when a rebrand comes along.  Or
            perhaps you changed your name.  Whatever you want to search and replace the code will help.</p>

        <p><a href="http://interconnectit.com/products/search-and-replace-for-wordpress-databases/">Got feedback on this script? Come tell us!</a>

    </div>

Tag stable versions

Would love to make a homebrew formula for installing the cli on macs. Any chance of adding version tags to stable releases?

Linebreaks

It's useful to replace <br> with linebreaks. Currently there's no way to do that, so need to support some escaped notation or regex to do this.

CLI Script Mangles WPAlchemy MetaBox Fields

Sample Command:

searchreplacedb2cli.php --host localhost --user user --database database --pass "pass" --charset utf-8 -s "oldurl.example.com" -r "new.example.com"

This command performs the search and replace but does not update field length values, causing the fields to be blank within the Wordpress Admin and when they are retrieved using the MetaBox object.

Blank White Screen Accessing Search-Replace-DB 3.x on Localhost

I downloaded the latest Search-Replace-DB 3.x beta, and copied the secret-name-please folder into Mac OS X's /Library/WebServer/Documents directory.

When I try to access Search-Replace-DB 3.x by either of the following hostnames, I get a blank white page in my web browser:

http://localhost/secret-name-please/
http://127.0.0.1/secret-name-please/

Frustratingly, nothing appears in Apache or PHP's error_log but the page returns a valid HTTP/1.1 200 status.

If I move the secret-name-please directory to a virtual host, e.g. http://example.dev/secret-name-please/, everything works as expected.

Is there a reason why Search-Replace-DB 3.x doesn't work in a web browser when accessed from localhost?

I'm running Mac OS X 10.9.1 "Mavericks" with Apache v2.2.24, PHP v5.4.17 and MySQL v5.6.15.

dealing with custom classes

I noticed that your script does not handle serialized data from the Shopp plugin. Doing a little debugging, my guess is that it is because Shopp serializes its own classes, not standard PHP classes. These Shopp classes are not included by your script, so there is no way to unserialize them.

If I watch the script try to unserialize these classes, I see things like:

array(1) {
    ["php_error"]=>
    object(__PHP_Incomplete_Class)#9 (5) {
      ["__PHP_Incomplete_Class_Name"]=>
      string(10) "ShoppError"
      ["code"]=>
      string(9) "php_error"
      ["source"]=>
      string(10) "PHP NOTICE"
      ["messages"]=>
      array(1) {
        [0]=>
        string(34) "Undefined index: shopp-stats-range"
      }
      ["level"]=>
      int(256)
    }
  }

Notice the __PHP_Incomplete_Class error in the unserialized data. PHP provides a callback where you can include necessary files for classes it can't unserialize.

Have you considered providing such a callback in your script? I know WP doesn't follow any PSR-0 conventions so we probably couldn't do automatic class loading, but this would be a place for users to manually include the necessary class references to get around these errors.

I'd be willing to work up a prototype and submit as a pull request if you think it's a good idea. Let me know.

Strict Error

At line 224 of index.php, the code throws a PHP strict error. Sorry I don't have a clean patch file for you, but the fix is as follows. Replace:

if ( is_array( $_POST[ 'submit' ] ) )
$show = array_shift( array_keys( $_POST[ 'submit' ] ) );

WITH

if ( is_array( $_POST[ 'submit' ] ) ) {
$post_keys = array_keys( $_POST[ 'submit' ] );
$show = array_shift( $post_keys );
}

Alternative, shorter code would be $show = key( $_POST[ 'submit' ] );

Error in readme of cli-script

The readme of the cli-script has an error. There is no utf-8 character set in MySQL. Using

--charset utf\-8

or

-c utf\-8

ends up in wrong replacements. It should be utf8.

See MySQL for reference:

mysql> SHOW CHARACTER SET LIKE 'utf%';
+---------+----------------+--------------------+--------+
| Charset | Description    | Default collation  | Maxlen |
+---------+----------------+--------------------+--------+
| utf8    | UTF-8 Unicode  | utf8_general_ci    |      3 |
| utf8mb4 | UTF-8 Unicode  | utf8mb4_general_ci |      4 |
| utf16   | UTF-16 Unicode | utf16_general_ci   |      4 |
| utf32   | UTF-32 Unicode | utf32_general_ci   |      4 |
+---------+----------------+--------------------+--------+
4 rows in set (0.01 sec)

different method for loading wp-config?

I noticed that in icit_srdb_define_find() you are loading the wp-config.php file as text and using regexes to find the values. This works great if you have string values in your definitions. On our sites, however, we have multiple configs in wp-config and use runtime evaluation to determine which one gets used. This makes it much easier to move sites between dev, staging and production. That goal seems to be a similar one that drove your tool, so I'm probably not the only one handling wp-config.php this way.

For example, instead of

define('DB_NAME', "static_string");

we have

define('DB_NAME', $currentConfig['db_name']);

Have you considered including wp-config.php and allowing it to execute to handle these situations? I realize you probably don't want to bootstrap the entire WP environment, so you'd need a way to exclude the inclusion of wp-settings.php at the bottom of wp-config.php.

Any ideas?

Great tool, by the way.

Blank White Screen Accessing Search-Replace-DB 3.x on Localhost

I downloaded the latest Search-Replace-DB 3.x beta, and copied the secret-name-please folder into Mac OS X's /Library/WebServer/Documents directory.

When I try to access Search-Replace-DB 3.x by either of the following hostnames, I get a blank white page in my web browser:

http://localhost/secret-name-please/
http://127.0.0.1/secret-name-please/

Frustratingly, nothing appears in Apache or PHP's error_log but the page returns a valid HTTP/1.1 200 status.

If I move the secret-name-please directory to a virtual host, e.g. http://example.dev/secret-name-please/, everything works as expected.

Is there a reason why Search-Replace-DB 3.x doesn't work in a web browser when accessed from localhost?

I'm running Mac OS X 10.9.1 "Mavericks" with Apache v2.2.24, PHP v5.4.17 and MySQL v5.6.15.

Composer

Adding a composer.json would do similar things that the package.json would do, albeit for PHP users rather than node

Replace with empty string

Hello,

I'm wondering: is it possible to implement a replacement with empty string?

For example I'd like to erase every instance of this string from the DB: '.php53-12.dfw1-1.websitetestlink.com'
But I only get the 'Replace string is blank' error message.

Thanks in advance

Cannot replace a string with nothing

Should be possible, perhaps with a warning message. Need to be careful as very hard to go back from a mistake in that kind of search/replace, but it's definitely a useful thing to do in some cases, especially data migrations where you're cleaning up junk tags and the like from html that's been imported.

Multisite wordpress installation - PHP notice

Hi every one,
Great stuff that you offer here! Thanks a lot.
However I have the following PHP notice (on index.php) on my multisite wordpress installation:

Notice: Trying to get property of non-object in /home2/fed-webric2/forms/wp-includes/ms-settings.php on line 107 Notice: Trying to get property of non-object in /home2/fed-webric2/forms/wp-includes/ms-settings.php on line 108

I was obliged to comment on wp_config.php:

define('MULTISITE', true);

Hoping that this message may be useful (and forgive my if not).
Tibo.

Blank White Screen Accessing Search-Replace-DB 3.x on Localhost ?

Same issue than #58 on a MAMP bitnami setup. Blank page and no errors ...
Wordpress install is fully functional.

I'm using MAMP bitnami stack on OSX 10.8.5.
HTTP and mySQL port are 8081 and 3706 but i don't know how to edit the script to set these custom ports.

Thank you for any help or advice.
Regards.

Package.json

I am trying to make use of this script as a dependency of a Grunt Plugin to perform safe search and replace on a DB.

https://github.com/getdave/grunt-deployments/tree/feature/advanced-search-replace

Without a valid package.json file it's not possible to specify the current interconnectit / Search-Replace-DB repo as a dependency. I've created a fork here and added a package.json file

https://github.com/getdave/Search-Replace-DB

I don't want to maintain a fork so would someone like to let me know if a pull request would be acceptable?

Much appreciated.

Length counter not updated even though search->replace occurs

Ran into a very long string from the Flexform WP theme. Cell data is ~5-6kB for a 134-element serialized array.
Other replacements in the WP database work fine, but some have been string-replaced without their length values being properly updated. Redacted pre-parse and post-parse SQL rows are below. I tried to determine where the problem was, but did not get very far very quickly.

  • Search: testbed4.xxxxxxxxxxx.com
  • Replace: yyyyyyyyyyyy.com
    Only the actual hostnames in the URLs should be updated, not the rest of the path. There were no errors thrown during the conversion process. I can provide the non-redacted versions privately if the data below doesn't suffice.

This is using PHP 5.3.3 (CentOS RPMs). Let me know if I can provide any more information. Thanks very much.

Pre-convert value:

INSERT INTO `prefix_options` VALUES (4570,'sf_flexform_options','a:134:{s:8:\"last_tab\";s:2:\"11\";s:17:\"enable_responsive\";s:1:\"1\";s:11:\"page_layout\";s:5:\"boxed\";s:18:\"enable_page_shadow\";s:1:\"1\";s:14:\"custom_favicon\";s:82:\"http://testbed4.xxxxxxxxxxx.com/wp-content/uploads/2013/03/yyyyyyyyyyyyfavicon.png\";s:12:\"rss_feed_url\";s:10:\"?feed=rss2\";s:10:\"custom_css\";s:0:\"\";s:16:\"google_analytics\";s:0:\"\";s:23:\"custom_admin_login_logo\";s:74:\"http://testbed4.xxxxxxxxxxx.com/wp-content/uploads/2013/04/yyyyy254x95.jpg\";s:20:\"enable_styleswitcher\";s:1:\"0\";s:12:\"use_bg_image\";s:1:\"1\";s:15:\"custom_bg_image\";s:0:\"\";s:7:\"bg_size\";s:4:\"auto\";s:15:\"preset_bg_image\";s:100:\"http://testbed4.xxxxxxxxxxx.com/wp-content/themes/flexform/images/preset-backgrounds/fake_luxury.png\";s:14:\"enable_top_bar\";s:1:\"0\";s:12:\"top_bar_menu\";s:1:\"0\";s:20:\"top_bar_social_icons\";s:59:\"[social size=\'small\' style=\'dark\' type=\'twitter,facebook,\']\";s:8:\"show_sub\";s:1:\"0\";s:16:\"show_translation\";s:1:\"0\";s:12:\"show_account\";s:1:\"0\";s:9:\"show_cart\";s:1:\"0\";s:8:\"sub_code\";s:0:\"\";s:11:\"logo_layout\";s:9:\"logo-left\";s:11:\"logo_upload\";s:72:\"http://testbed4.xxxxxxxxxxx.com/wp-content/uploads/2013/03/yyyyy1201.jpg\";s:18:\"retina_logo_upload\";s:0:\"\";s:10:\"logo_width\";s:3:\"115\";s:16:\"logo_top_spacing\";s:1:\"0\";s:18:\"logo_right_spacing\";s:1:\"0\";s:19:\"logo_bottom_spacing\";s:1:\"0\";s:17:\"logo_left_spacing\";s:2:\"50\";s:15:\"nav_top_spacing\";s:2:\"35\";s:18:\"enable_mini_header\";s:1:\"0\";s:16:\"enable_logo_fade\";s:1:\"1\";s:20:\"enable_nav_indicator\";s:1:\"1\";s:20:\"enable_header_shadow\";s:1:\"1\";s:13:\"enable_footer\";s:1:\"0\";s:21:\"enable_footer_divider\";s:1:\"1\";s:13:\"footer_layout\";s:8:\"footer-5\";s:16:\"enable_copyright\";s:1:\"1\";s:24:\"enable_copyright_divider\";s:1:\"1\";s:21:\"footer_copyright_text\";s:111:\"©[the-year] Yyyyyyy Yyyyy Yyyyyyyyyy · Site Design by <a href=\'http://www.zzzzzzzzzz.com\'>Zzzzzz Zzzzzzz</a> \";s:13:\"show_backlink\";s:1:\"0\";s:17:\"footer_gotop_text\";s:11:\"Back To Top\";s:25:\"default_show_page_heading\";s:1:\"1\";s:27:\"default_page_heading_bg_alt\";s:4:\"none\";s:22:\"default_sidebar_config\";s:11:\"no-sidebars\";s:20:\"default_left_sidebar\";s:9:\"Sidebar-1\";s:21:\"default_right_sidebar\";s:9:\"Sidebar-1\";s:14:\"filter_wrap_bg\";s:4:\"none\";s:16:\"alt_one_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_one_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_one_bg_image\";s:0:\"\";s:21:\"alt_one_bg_image_size\";s:4:\"auto\";s:16:\"alt_two_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_two_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_two_bg_image\";s:0:\"\";s:21:\"alt_two_bg_image_size\";s:4:\"auto\";s:18:\"alt_three_bg_color\";s:7:\"#FFFFFF\";s:20:\"alt_three_text_color\";s:7:\"#FFFFFF\";s:18:\"alt_three_bg_image\";s:0:\"\";s:23:\"alt_three_bg_image_size\";s:4:\"auto\";s:17:\"alt_four_bg_color\";s:7:\"#FFFFFF\";s:19:\"alt_four_text_color\";s:7:\"#FFFFFF\";s:17:\"alt_four_bg_image\";s:0:\"\";s:22:\"alt_four_bg_image_size\";s:4:\"auto\";s:17:\"alt_five_bg_color\";s:7:\"#FFFFFF\";s:19:\"alt_five_text_color\";s:7:\"#FFFFFF\";s:17:\"alt_five_bg_image\";s:0:\"\";s:22:\"alt_five_bg_image_size\";s:4:\"auto\";s:16:\"alt_six_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_six_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_six_bg_image\";s:0:\"\";s:21:\"alt_six_bg_image_size\";s:4:\"auto\";s:18:\"alt_seven_bg_color\";s:7:\"#FFFFFF\";s:20:\"alt_seven_text_color\";s:7:\"#FFFFFF\";s:18:\"alt_seven_bg_image\";s:0:\"\";s:23:\"alt_seven_bg_image_size\";s:4:\"auto\";s:18:\"alt_eight_bg_color\";s:7:\"#FFFFFF\";s:20:\"alt_eight_text_color\";s:7:\"#FFFFFF\";s:18:\"alt_eight_bg_image\";s:0:\"\";s:23:\"alt_eight_bg_image_size\";s:4:\"auto\";s:17:\"alt_nine_bg_color\";s:7:\"#FFFFFF\";s:19:\"alt_nine_text_color\";s:7:\"#FFFFFF\";s:17:\"alt_nine_bg_image\";s:0:\"\";s:22:\"alt_nine_bg_image_size\";s:4:\"auto\";s:16:\"alt_ten_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_ten_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_ten_bg_image\";s:0:\"\";s:21:\"alt_ten_bg_image_size\";s:4:\"auto\";s:22:\"archive_sidebar_config\";s:13:\"right-sidebar\";s:20:\"archive_sidebar_left\";s:9:\"Sidebar-1\";s:21:\"archive_sidebar_right\";s:9:\"Sidebar-1\";s:20:\"archive_display_type\";s:7:\"masonry\";s:16:\"body_font_option\";s:6:\"google\";s:13:\"web_body_font\";s:9:\"Helvetica\";s:20:\"google_standard_font\";s:5:\"Alike\";s:22:\"fontdeck_standard_font\";s:0:\"\";s:20:\"headings_font_option\";s:6:\"google\";s:16:\"web_heading_font\";s:9:\"Helvetica\";s:19:\"google_heading_font\";s:7:\"Brawler\";s:21:\"fontdeck_heading_font\";s:0:\"\";s:11:\"fontdeck_js\";s:0:\"\";s:14:\"body_font_size\";s:2:\"16\";s:21:\"body_font_line_height\";s:2:\"24\";s:12:\"h1_font_size\";s:2:\"30\";s:19:\"h1_font_line_height\";s:2:\"42\";s:12:\"h2_font_size\";s:2:\"24\";s:19:\"h2_font_line_height\";s:2:\"32\";s:12:\"h3_font_size\";s:2:\"18\";s:19:\"h3_font_line_height\";s:2:\"24\";s:12:\"h4_font_size\";s:2:\"16\";s:19:\"h4_font_line_height\";s:2:\"20\";s:12:\"h5_font_size\";s:2:\"14\";s:19:\"h5_font_line_height\";s:2:\"18\";s:12:\"h6_font_size\";s:2:\"12\";s:19:\"h6_font_line_height\";s:2:\"16\";s:16:\"testimonial_page\";s:3:\"106\";s:9:\"jobs_page\";s:3:\"106\";s:16:\"twitter_username\";s:0:\"\";s:17:\"facebook_page_url\";s:29:\"www.facebook.com/yyyyyyyyyyyy\";s:17:\"dribbble_username\";s:0:\"\";s:14:\"vimeo_username\";s:0:\"\";s:15:\"tumblr_username\";s:0:\"\";s:16:\"spotify_username\";s:0:\"\";s:14:\"skype_username\";s:0:\"\";s:17:\"linkedin_page_url\";s:0:\"\";s:15:\"lastfm_username\";s:0:\"\";s:19:\"googleplus_page_url\";s:0:\"\";s:15:\"flickr_page_url\";s:0:\"\";s:16:\"youtube_username\";s:12:\"yyyyyyyyyyyy\";s:16:\"behance_username\";s:0:\"\";s:18:\"pinterest_username\";s:0:\"\";s:8:\"yelp_url\";s:0:\"\";s:18:\"instagram_username\";s:0:\"\";}','yes');

Post-convert sqldump row:

INSERT INTO `prefix_options` VALUES (4570,'sf_flexform_options','a:134:{s:8:\"last_tab\";s:2:\"11\";s:17:\"enable_responsive\";s:1:\"1\";s:11:\"page_layout\";s:5:\"boxed\";s:18:\"enable_page_shadow\";s:1:\"1\";s:14:\"custom_favicon\";s:82:\"http://yyyyyyyyyyyy.com/wp-content/uploads/2013/03/yyyyyyyyyyyyfavicon.png\";s:12:\"rss_feed_url\";s:10:\"?feed=rss2\";s:10:\"custom_css\";s:0:\"\";s:16:\"google_analytics\";s:0:\"\";s:23:\"custom_admin_login_logo\";s:74:\"http://yyyyyyyyyyyy.com/wp-content/uploads/2013/04/yyyyy254x95.jpg\";s:20:\"enable_styleswitcher\";s:1:\"0\";s:12:\"use_bg_image\";s:1:\"1\";s:15:\"custom_bg_image\";s:0:\"\";s:7:\"bg_size\";s:4:\"auto\";s:15:\"preset_bg_image\";s:100:\"http://yyyyyyyyyyyy.com/wp-content/themes/flexform/images/preset-backgrounds/fake_luxury.png\";s:14:\"enable_top_bar\";s:1:\"0\";s:12:\"top_bar_menu\";s:1:\"0\";s:20:\"top_bar_social_icons\";s:59:\"[social size=\'small\' style=\'dark\' type=\'twitter,facebook,\']\";s:8:\"show_sub\";s:1:\"0\";s:16:\"show_translation\";s:1:\"0\";s:12:\"show_account\";s:1:\"0\";s:9:\"show_cart\";s:1:\"0\";s:8:\"sub_code\";s:0:\"\";s:11:\"logo_layout\";s:9:\"logo-left\";s:11:\"logo_upload\";s:72:\"http://yyyyyyyyyyyy.com/wp-content/uploads/2013/03/yyyyy1201.jpg\";s:18:\"retina_logo_upload\";s:0:\"\";s:10:\"logo_width\";s:3:\"115\";s:16:\"logo_top_spacing\";s:1:\"0\";s:18:\"logo_right_spacing\";s:1:\"0\";s:19:\"logo_bottom_spacing\";s:1:\"0\";s:17:\"logo_left_spacing\";s:2:\"50\";s:15:\"nav_top_spacing\";s:2:\"35\";s:18:\"enable_mini_header\";s:1:\"0\";s:16:\"enable_logo_fade\";s:1:\"1\";s:20:\"enable_nav_indicator\";s:1:\"1\";s:20:\"enable_header_shadow\";s:1:\"1\";s:13:\"enable_footer\";s:1:\"0\";s:21:\"enable_footer_divider\";s:1:\"1\";s:13:\"footer_layout\";s:8:\"footer-5\";s:16:\"enable_copyright\";s:1:\"1\";s:24:\"enable_copyright_divider\";s:1:\"1\";s:21:\"footer_copyright_text\";s:111:\"©[the-year] Yyyyyyy Yyyyy Yyyyyyyyyy · Site Design by <a href=\'http://www.zzzzzzzzzz.com\'>Zzzzzz Zzzzzzz</a> \";s:13:\"show_backlink\";s:1:\"0\";s:17:\"footer_gotop_text\";s:11:\"Back To Top\";s:25:\"default_show_page_heading\";s:1:\"1\";s:27:\"default_page_heading_bg_alt\";s:4:\"none\";s:22:\"default_sidebar_config\";s:11:\"no-sidebars\";s:20:\"default_left_sidebar\";s:9:\"Sidebar-1\";s:21:\"default_right_sidebar\";s:9:\"Sidebar-1\";s:14:\"filter_wrap_bg\";s:4:\"none\";s:16:\"alt_one_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_one_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_one_bg_image\";s:0:\"\";s:21:\"alt_one_bg_image_size\";s:4:\"auto\";s:16:\"alt_two_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_two_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_two_bg_image\";s:0:\"\";s:21:\"alt_two_bg_image_size\";s:4:\"auto\";s:18:\"alt_three_bg_color\";s:7:\"#FFFFFF\";s:20:\"alt_three_text_color\";s:7:\"#FFFFFF\";s:18:\"alt_three_bg_image\";s:0:\"\";s:23:\"alt_three_bg_image_size\";s:4:\"auto\";s:17:\"alt_four_bg_color\";s:7:\"#FFFFFF\";s:19:\"alt_four_text_color\";s:7:\"#FFFFFF\";s:17:\"alt_four_bg_image\";s:0:\"\";s:22:\"alt_four_bg_image_size\";s:4:\"auto\";s:17:\"alt_five_bg_color\";s:7:\"#FFFFFF\";s:19:\"alt_five_text_color\";s:7:\"#FFFFFF\";s:17:\"alt_five_bg_image\";s:0:\"\";s:22:\"alt_five_bg_image_size\";s:4:\"auto\";s:16:\"alt_six_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_six_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_six_bg_image\";s:0:\"\";s:21:\"alt_six_bg_image_size\";s:4:\"auto\";s:18:\"alt_seven_bg_color\";s:7:\"#FFFFFF\";s:20:\"alt_seven_text_color\";s:7:\"#FFFFFF\";s:18:\"alt_seven_bg_image\";s:0:\"\";s:23:\"alt_seven_bg_image_size\";s:4:\"auto\";s:18:\"alt_eight_bg_color\";s:7:\"#FFFFFF\";s:20:\"alt_eight_text_color\";s:7:\"#FFFFFF\";s:18:\"alt_eight_bg_image\";s:0:\"\";s:23:\"alt_eight_bg_image_size\";s:4:\"auto\";s:17:\"alt_nine_bg_color\";s:7:\"#FFFFFF\";s:19:\"alt_nine_text_color\";s:7:\"#FFFFFF\";s:17:\"alt_nine_bg_image\";s:0:\"\";s:22:\"alt_nine_bg_image_size\";s:4:\"auto\";s:16:\"alt_ten_bg_color\";s:7:\"#FFFFFF\";s:18:\"alt_ten_text_color\";s:7:\"#FFFFFF\";s:16:\"alt_ten_bg_image\";s:0:\"\";s:21:\"alt_ten_bg_image_size\";s:4:\"auto\";s:22:\"archive_sidebar_config\";s:13:\"right-sidebar\";s:20:\"archive_sidebar_left\";s:9:\"Sidebar-1\";s:21:\"archive_sidebar_right\";s:9:\"Sidebar-1\";s:20:\"archive_display_type\";s:7:\"masonry\";s:16:\"body_font_option\";s:6:\"google\";s:13:\"web_body_font\";s:9:\"Helvetica\";s:20:\"google_standard_font\";s:5:\"Alike\";s:22:\"fontdeck_standard_font\";s:0:\"\";s:20:\"headings_font_option\";s:6:\"google\";s:16:\"web_heading_font\";s:9:\"Helvetica\";s:19:\"google_heading_font\";s:7:\"Brawler\";s:21:\"fontdeck_heading_font\";s:0:\"\";s:11:\"fontdeck_js\";s:0:\"\";s:14:\"body_font_size\";s:2:\"16\";s:21:\"body_font_line_height\";s:2:\"24\";s:12:\"h1_font_size\";s:2:\"30\";s:19:\"h1_font_line_height\";s:2:\"42\";s:12:\"h2_font_size\";s:2:\"24\";s:19:\"h2_font_line_height\";s:2:\"32\";s:12:\"h3_font_size\";s:2:\"18\";s:19:\"h3_font_line_height\";s:2:\"24\";s:12:\"h4_font_size\";s:2:\"16\";s:19:\"h4_font_line_height\";s:2:\"20\";s:12:\"h5_font_size\";s:2:\"14\";s:19:\"h5_font_line_height\";s:2:\"18\";s:12:\"h6_font_size\";s:2:\"12\";s:19:\"h6_font_line_height\";s:2:\"16\";s:16:\"testimonial_page\";s:3:\"106\";s:9:\"jobs_page\";s:3:\"106\";s:16:\"twitter_username\";s:0:\"\";s:17:\"facebook_page_url\";s:29:\"www.facebook.com/yyyyyyyyyyyy\";s:17:\"dribbble_username\";s:0:\"\";s:14:\"vimeo_username\";s:0:\"\";s:15:\"tumblr_username\";s:0:\"\";s:16:\"spotify_username\";s:0:\"\";s:14:\"skype_username\";s:0:\"\";s:17:\"linkedin_page_url\";s:0:\"\";s:15:\"lastfm_username\";s:0:\"\";s:19:\"googleplus_page_url\";s:0:\"\";s:15:\"flickr_page_url\";s:0:\"\";s:16:\"youtube_username\";s:12:\"yyyyyyyyyyyy\";s:16:\"behance_username\";s:0:\"\";s:18:\"pinterest_username\";s:0:\"\";s:8:\"yelp_url\";s:0:\"\";s:18:\"instagram_username\";s:0:\"\";}','yes');

Is there a way to run this on database dumps?

I routinely do database transfers from a development server to a staging server, and so work routinely with full database dump files. Is there a way to get this to work by taking a text file as input?

If not, if you could guide me with how I might do this, I'll try to write it myself.

Change DB pass field to password type

Currently If someone is looking over your shoulder or in the same room, it would be very easy for them to see the password that you are typing. I recommend to change the type of this input field to "password" instead of "text" and then change the styling accordingly as well.

mysql_set_charset() errors

Hi, I'm getting the following error when running the CLI locally:

host: localhost
database: yamuna
user: root
pass: mypass
charset: utf-8
search: mywebsite.com
replace: dev.mywebsite.com

MySQL Connection Error: Array
(
[0] => No such file or directory
)
PHP Warning: mysql_set_charset() expects parameter 2 to be resource, boolean given in /Users/myusername/Sites/dev.mywebsite.com/.bak/searchreplacedb2cli.php on line 113
MySQL Table Error: Array
(
[0] => No such file or directory
[1] => No such file or directory
)

Using those identical login credentials I'm able to log into mysql no problem. Any idea what the problem could be? Thanks in advance.

newbie question

Ran this first time ever. URL change seem to work fine but got an error.

Saw this result in the browser window:

  • Not sure what this error means and whether this manual action advised is really necessary.
  • What are the draw backs of ignoring this message?
"wp_wfStatus" has no primary key, manual change needed on row 159.

"wp_wfStatus" has no primary key, manual change needed on row 160.

"wp_wfStatus" has no primary key, manual change needed on row 374.

"wp_wfStatus" has no primary key, manual change needed on row 375.

"wp_wfStatus" has no primary key, manual change needed on row 539.

"wp_wfStatus" has no primary key, manual change needed on row 540.

"wp_wfStatus" has no primary key, manual change needed on row 689.

"wp_wfStatus" has no primary key, manual change needed on row 690.

"wp_wfStatus" has no primary key, manual change needed on row 855.

"wp_wfStatus" has no primary key, manual change needed on row 856.


Completed
In the process of replacing "xyz.domain.com" with "www.domain.com" we scanned 57 tables with a total of 18728 rows, 8206 cells were changed. 7558 db updates were actually performed. It all took 9.990421 seconds.

CLI UI option

Rather than clicking on Live or Dry run, it would be useful if I could be shown the CLI command needed to do what I've configured the UI to do ( like how DB migrators can export a script to do the migration rather than doing the work there and then )

This way I don't have to exert the extra mental capacity figuring out what the command line options are and what their values should be, I can simply check a few boxes in the web frontend and copy paste a command at the end

Add Joomla & vBulletin to README

I would like to endorse this for safe usage with Joomla and vBulletin (and see it added to the README so everyone knows!). I've run it multiple times with each for dev-to-production and other various domain name migrations with zero problems.

Planning on testing with phpBB as well.

Not replacing value in wp-options

Using searchreplacedb2 2.2.0 and have tried this on FreeBSD 8 and Ubuntu 12 using mysql 5.5.24 and php 5.4.8.1.

I've tried to replace strings like "192.16.15.132/joe/boxcar/trunk" with "domain.com"

in a serialized array containing the string:
s:114:"http://192.16.15.132/joe/boxcar/trunk/products-page/letterpress-starter-pack/premium-ink-starter-pack-rubber-base/\"

But it won't replace it. I'll dig a bit more, but figured I'd post it in case there is something I'm missing or this is a known issue.

possible latent bugs in exceptional use cases

I noticed two potential problems in reviewing the searchreplacedb2.php code.

  1. The paging code (for large databases) has an error in the SQL LIMIT spec near line 300
$end = $start + $page_size;
// Grab the content of the table
$data = mysql_query( sprintf( 'SELECT * FROM %s LIMIT %d, %d', $table, $start, $end ), $connection );

$end should be $page_size. SQL requires start and row_count; not start and end. This won't affect databases with less than 50000 rows.

  1. The code to handle excluded columns by placing a column name in the $exclude_cols array will not work correctly if an excluded column is part of the primary key of the table.

The fix is to move the test @ line 331 ahead of the check for excluded columns @line 316

FR: output report with table-level statistics.

Very useful for me if I could which tables match search string. Many case where I want to exclude a table that is used for configuration options versus another table with just content (e.g. options vs post_content table in WP).

This would go hand-in-hand with dry-run modifcation which was submitted.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.