Published under the Creative Commons Licence
by Artful Software Development artfulsoftware.com
Version 2.32, 16 Apr 2019
TheUsual/PHP exists to provide a fast, free, user-friendly web browser viewing and maintenance interface for MySQL databases. It runs on your own computer under a web server like Apache or IIS, on a dedicated intranet or internet server, or on a remote hosting server (dedicated or shared) running MySQL 4 or preferably 5&Up.
There is now just one current version of TheUsual/PHP, for the mysqli PHP API. The mysql PHP API has been deprecated and will soon disappear from PHP; our last version of TheUsual for the mysql PHP API was 1.90.
TheUsual implements, in PHP 5.x for MySQL 4-5-6-8, the Artful concept of TheUsual—the usual jobs you have to do to create, update & maintain database data. Like earlier versions of TheUsual for XBase and Sybase backends, and like its cousin for Visual Studio 2005 and MySQL, it implements a general-purpose browsing and maintenance interface for any available database and its tables:
Chapter 12 of Get it Done with MySQL 5&Up, excerpted here, outlines the basic design and look-and-feel of TheUsual/PHP
To download TheUsual/PHP, visit http://www.artfulsoftware.com/theusual.html and scroll to the bottom of the page.
The mysql PHP API has been deprecated and will be removed. The last upgrade of TheUsual/PHP for that API, theUsualPHPmysql.rar, was version 1.90. Use the mysqli API instead, and the version of theUsual for that API, theUsualPHPmysqli.rar.
MySQL-PHP configuration has many moving parts. These are the best guides we know for getting them to work together:
Windows with Apache web server:
Windows with IIS
into a conveniently named folder (eg, theusual ) off the Document Root of your web server (for example /var/www/theusual, /apache/htdocs/theusual/, or on Windows with IIS, c:/inetpub/wwwroot/theusual/ ).
into c:/php/includes if available, or failing that, in a directory that is not web-visible and that is visible to PHP.
S3. In theusual-login.php, edit the values of $host, $user and $pswd for your MySQL setup.
S4. In your browser run http://localhost/theusual/theusual_start.php, and bookmark the page.
If you are running TheUsual on IIS:
1. Be sure to enable read-write sharing for IIS_IUSR for TheUsual's folders and subfolders.
2. Since Windows 7, IIS authentication is byzantine. If PHP scripts like TheUsual fail with an error like "You do not have permission to view this directory or page because of the access control list (ACL) configuration ...", from Start run inetmgr, click on the top level in the left navigation panel, select Authentication in the IIS middle panel, right-click on Anonymous Authentication and select Edit, and in the resulting Edit Anonymous Authentication Credentials dialog, click the Application pool identity radio button. Incredible, but there it is.
3. To allow imports bigger than 30MB, try this: select the top item in the left inetmgr navigation pane, click on Request Filtering in the middle pane under IIS, select Hiodden Segments, right click on Web.Config, from the context select Edit Feature Settings, and change Maximum Allowed Content Length to a value that suits your needs. Then restart IIS. If IIS doesn't allow big uploads, you will have to FTP or otherwise copy them directly into TheUsual's uploads folder.
W1. In your site's main web document folder (eg /home/your_site_name/public_html), create a folder named theusual. This folder will hold your web instance of TheUsual.
W2. Create a folder outside your web document tree, ie a folder that is not available via public_html, for example home/your_site_name/theusual. If your hosting provider does not provide access outside your document tree (unbelievably, some don't), get a better hosting provider right away!
W3. Visit http://www.tools.dynamicdrive.com/password/, and there enter the desired username and password for your instance of TheUsual. Usually, this will be the username and password provided by your hosting provider for access to your MySQL database. For 'Path to .htpasswd file', enter the full path to the folder you created in step W2. Click Submit.
W4. Save the indicated contents of .htaccess, which will look something like this...
to a plain text file named .htaccess in the folder you made in step W1.
W5. Save the indicated contents of .htpasswd, which will look something like this...
to a plain text file named .htpasswd in the folder you created in step W2,
W6. In the folder created in step W2, create a text file named theusualinc.php, with this content:
$_SESSION['host'] = "HOSTNAME";
$_SESSION['user'] = "USERNAME";
$_SESSION['pswd'] = "PASSWORD";
include( "/home/your_site_name/theusual/theusualinc.php" );right below the call to session_start(), making sure that /home/your_site_name/theusual exactly matches the path to the folder you created in step W2.
W8. Copy all files listed in step S1, including your newly modified copy of the_usual_start.php, into the folder you created in step W1.
W9. In your browser run http://www/your_site_name/theusual/theusual_start.php, bookmark the page, and enter your username and password.
TheUsual/PHP needs three MySQL authentication settings---$host, $user, $pswd---for authentication against the mysql.user table. These settings can be ...
If you use theusual-login.php, remember that PHP include files can be in the
php-includes path, for example in the c:/php/includes folder, or in the current
folder, but keeping such include files in the current folder is a security disaster on an
Here is a sample theusual-login.php. Fill in your own HOST, USER and PSWD values:
$_SESSION['host'] = getenv( "u_host" ) ? getenv( "u_host" ) : "HOST" ;
$_SESSION['user'] = getenv( "u_user" ) ? getenv( "u_user" ) : "USER" ;
$_SESSION['pswd'] = getenv( "u_pswd" ) ? getenv( "u_pswd" ) : "PSWD" ;
Versions 4.x of PHP use 3.x versions of MySQL client modules, but passwords created with MySQL since version 4.1 use an authentication protocol which earlier MySQL clients cannot decode. If you are using PHP 4.x, the password of any user of theUsual.php must have been entered with, or edited to OLD_PASSWORD('password').
Theusualcall.php is a simple frontend for selecting and running any instance of TheUsual you have access to, against any MySQL database server you have access to.
Theusualcall.php needs a text configuration file named theusualcall.ini containing two kinds of configuration lines ...
1. For each available installation of TheUsual, one line of comma-separated key=value pairs specifying the instance's name, group, host and path:
theusual = your choice of name for this instance of TheUsual; this will be its selectable name in theusualcall.php
group = your choice of name for the group to which this instance of TheUsual belongs; installations of TheUsual with a given group name can access only MySQL database servers with the same group name
host = the LAN machine name or URL where this instance of TheUsual lives (host pingability is not verified)
path = the path at host to the file which invokes this installation of TheUsual (for example theusual_start.php)
For example, suppose you have two installations of TheUsual on your LAN ...
... and you also have access to a web installation of TheUsual at ...
then theusualcall.ini needs these three lines, one for each of the above instances ...
theusual=thelaptop, group=lan, host=mylaptop, path=/theusual/theusual_start.php
theusual=thedesktop, group=lan, host=mydesktop, path=/php/theusual/theusual_start.php
theusual=myclient's site, group=myclient, host=www.myclientswebsite.com, path=/theusual/mylogin.php
2. For each available MySQL server login, one line of comma-separated key=value pairs specifying the mysql server name, its group as defined above, and optionally the username (user) and password (pswd) for that login:
mysql = the name of this MySQL server; if it is on your LAN, this is the LAN machine's name; if it is on the web, it is the MySQL server host name specified by the hosting provider
group = the name of the group to which this MySQL database server belongs; installations of TheUsual with a given group name can access only MySQL database servers with the same group name
user = the mysql.user.User value for this login; if you do not pass it, the called instance of TheUsual must specify it using another method of user/pswd authentication;
pswd = the mysql.user.Password value for this login; if you do not pass it, the called instance of TheUsual must specify it using another method of user/pswd authentication;
For the above example, theusualcall.ini would have:
mysql=mylaptop, group=lan, user=thisusername, pswd=thispassword
mysql=mydesktop, group=lan, user=anotherusername, pswd=anotherpassword
mysql=mydesktop, group=lan, user=yetanotherusername, pswd=yetanotherpassword
where the first three lines specify logins available to either of the group=lan instances of TheUsual
defined above, and the last line tells theusualcall.php to pass only the mysql name to the instance
of TheUsual at the myclient site, and not to send user and pswd with that call (on the assumption that mylogin.php will collect and authenticate those values).
theusualcall.php ignores lines in theusualcall.ini that don't begin with 'theusual' or 'mysql'. A sample theusualcall.ini is provided.
Any number of independent instances of TheUsual can run simultaneously in browser tabs, because TheUsual implements the session setup described in Chapter 12 of Get It Done With MySQL 5&6 and under MySQL and PHP | Basics | Session setup at http://artfulsoftware.com/infotree/mysqltips.php.
On load, TheUsual offers a list of databases for which you have privileges. Once you select a database, TheUsual puts up a dropdown table selection list, and a saved queries dropdown for the current database if you've enabled this option and if there are saved queries. Below these dropdowns you see a dashboard offering custom query, import, database browse and other command links.
If you make a choice from the table dropdown, TheUsual brings up a paged datagrid display of that table with order-selectable headers, and a statusbar permitting selection of First/Previous/Next/Last row groups and rows-per-page selection. You may add, edit, copy or delete rows for any table with a primary key.
If the selected table uses an ACID-compliant storage engine like InnoDB, and if other tables in the current database have foreign keys referencing that table, the dashboard offers a dropdown detail table selector. If you select a detail table from that dropdown, TheUsual displays a second grid with detail rows matching the current row of the master table. If that child table is in turn the parent of another table, Go commands in that grid select that detail table as the master table in a refreshed page.
Clicking on the database browse link brings up a list of tables in the current database with Analyze, Check, Export, GoTo, Optimize, Repair and Drop options. GoTo has the same effect as selecting a table or View from the Table/View dropdown. In v2.31 the SQL formatter function (originally from GitHub) was revamped to make it more useful for reading the vast amounts of interesting Stored Routine and View code that MySQL since v5.7 provides in its sys database:
MySQL 5 implements Views, so when run against MySQL 5 or later, theUsual/PHP lists Views as tables. To create a View, run a CREATE VIEW statement as a custom query. To run a View, select it from the Tables dropdown.
But MySQL Views have their limitations. They tend to be slow; indeed executing queries retrieved from a saved queries table is up to twice as fast as executing a View that invokes the query. And before MySQL version 5.7.7, Views may not have FROM clause subqueries, which multi-table reports often need. So theUsual offers the option of saving custom queries in a database, and has a point-and-click interface for selecting and executing them. It saves custom queries to
theusualviewsin a database whose name defaults to theusualsys (up to theUsual version 2.17, this database name defaulted to system. As of MySQL version 8.0.3, 'system' is a reserved word), or
Enable saved custom queries by setting $_SESSION['views']=TRUE in theusual_start.php. There you can also change the database name 'theusualsys' if you wish. Then in any database you select, TheUsual creates its saved queries table if it does not exist by executing:
CREATE TABLE theusualviews(
name VARCHAR(64) NOT NULL DEFAULT '',
db VARCHAR(64) NOT NULL DEFAULT '',
User VARCHAR(16) NOT NULL DEFAULT '',
Host VARCHAR(64) NOT NULL DEFAULT '%',
qry VARCHAR(8192) NOT NULL DEFAULT '',
and a Save button appears on the custom query form. To manage your saved queries, select theusualviews from the Tables dropdown for the appropriate database; browse and edit it as you would any other table. For convenient code editing, use the Settings panel (in the Browse database dashboard) to set text format to preformat.
Big query scripts
Do not try to send SQL scripts bigger than about a quarter of a megabyte through Custom Query. The custom query module is meant for scripts that are small enough to be meaningfully interactive and which may display SELECT results; it bogs down with more than 250 KB of input, and depending on the browser, can grind to a halt near 1MB.
Instead use the Import module, which can process 30MB of SQL commands on ordinary hardware in a minute. The Import dashboard option brings up a form where the user may ...
The Import module creates the uploads folder if it does not exist, logs file uploads to theusual_uploads.txt, and logs upload errors to theusual_uploads.err. If the import file is too big to be uploaded through the browser (e.g., the IIS 7.5 limit is 30MB unzipped, and difficult to change), you'll need to FTP or otherwise copy the SQL command file directly into the uploads folder.
The module can handle files that contain SQL text, and zip, gzip, bzip2 and rar archives of SQL text. Most PHP installations support zip and gzip. Bzip2 requires PHP configuration using --with-bz2. The PECL rar module is unstable with PHP 5.2 through 5.4 (if you find a rar plugin that works with those PHP versions, please let us know). The import form also sets sql mode, character set, file deletion policy, and whether to try to determine that the file actually contains SQL before executing any commands from it.
Beware that several php.ini settings govern import file size and script execution time:
edit php.ini, or invoke
ini_set(), to set
max_input_time to limits that accommodate your largest
and longest imports, and
upload_max_filesize to zero if you
can live with no limits, or to values you can live with.
The internet wasn't designed to display results of long batch jobs in real time. The MySQL client program isn't so good at the job either: results fly by faster than they can be read. The Import module is meant to handle potentially huge Inserts, so it shows just the first 80 characters of each SQL command it executes, alog with the result. Even with that, screen output may be massive. How will a web browser respond?
Browsers do their own output buffering. We've no control at that level.
Under Apache, output_buffering in php.ini is determinative; it defaults to 4KB, so flush commands in display code keep the user informed about how execution is proceeding.
But under IIS, screen output is usually held back until script execution completes. A Microsoft engineer offered this lame explanation: "For performance reasons and interoperability with some ASP.NET features ... we entirely buffer responses < 1MB and then send them at once." In IIS 7.5 it's actually 4MB. A 30 MB SQL script may take a minute or more to execute. Leaving the user uninformed for that long is rude, but IIS Manager offers no access to the controlling variable. A recommended workaround for this bit of IIS stupidity is first, in the left panel of IIS Manager, create an IIS "web site" forTheUsual, called, say, theUsual_mysqli; second, in the central IIS Manager panel find the name of the PHP engine--say it's PHP52_via_FastCGI; then finally, run this command ...
%windir%\system32\inetsrv\appcmd set config "theUsual_mysqli" /section:handlers /commitPath:apphost -[name='PHP52_via_FastCGI'].ResponseBufferLimit:0substituting your values for theUsual_mysqli and PHP52_via_FastCGI. Restart IIS.
Per page: A rows/page dropdown selector appears on the dashboard when the query is pageable. Possible values are 5,10,20,50,100,500,1000,2000,5000. To change these, edit $pagelens in theusual.php.
Prev, Top, Next, Last: Display the prievious, top, next or last <per page> rows returned by the current query.
Detail table: This is a dropdown selection list of ACID-compliant tables in the currently selected database with a foreign key referencing the currently selected table. Up to version 1.89, TheUsual could display one master-detail table relationship. Since version 2.00 (mysqli version only), there is no limit to the number of cascading master-detail relationships.
Master-detail relationships without declared foreign keys: Several MySQL storage engines offer no support for foreign keys, yet management of data in such tables often needs master-detail logic. TheUsual helps with this by letting you add, to the above child tables list, master-detail table relationships without declared foreign keys. It does this by storing such info in a "meta-data" table.
A meta-data table in what database? Until MySQL version 5.7, we could use 'sys' as the default name of the database holding theUsual's general-purpose utility tables and routines. In MySQL 5.7 MySQL implemented its own sys database, so we changed the default name of theUsual's default sys DB to 'system'. Then in version 8.0.3 MySQL made 'system' a reserved word, so since theUsual v2.18 the default name of theUsual's system database is theusualsys. It's set as a session variable in theusual_start.php:
$_SESSION['sysdb'] = 'name_of_database_to_use';
If you have database creation privileges and don't have a theusualsys database, consider creating create one and using it for this feature. Having set it, be sure to create the database.If you have access to just one database, and no privileges to create other databases, you can still use these informal foreign keys by setting the database for them to the DB you are already using. Set it in theusual_soart.php as above. The next time TheUsual runs, it creates a table named theusualfks in the database you've specified. You can use TheUsual (or any other MySQL client) to add rows to this table specifying master-detail (parent-child) table relationships.
Here is an example. If you downloaded the database script world.sql for the sample MySQL world database from http://downloads.mysql.com/docs/world.sql.gz or http://downloads.mysql.com/docs/world.sql.zip, you may have noticed that the tables are MyISAM, not InnoDB. To make the master-detail links from the country table to the city and countrylanguage tables visible to TheUsual, use TheUsual to browse theusualfks in the database named by $_SESSION['sysdb'] and insert these two rows:
Now when you browse world.country in TheUsual, you can choose city or countrylanguage as a child table, and TheUsual will auto-generate dropdown picklists for the relevant foreign keys:
Beware that TheUsual does not (yet) validate parent-child entries in theusualfks table; it just tries to execute them as if they were real foreign keys, and reports an error if the specification is incorrect.
If the detail table itself has a detail table, the leftmost column of each detail row shows, in addition to Edit, Ins, Copy and Del options, a Go option that makes the current detail table the master table in the next browse, which will be of the page containing the selected row. Use Go to daisy-chain down any number of cascading master-detail table pairs.
The statusbar Find control is enabled for a base table or updatable View selected from the Table dropdown. Up to v2.01, it supports primary key searches. Since v2.02, select a column from the dropdown that appears, then enter a value to search for: if TheUsual finds a first instance of that column value on the current ordering, it will display that page. Since v2.03, if the column value you enter contains the '%' wildcard, TheUsual will look for the first column value LIKE your search value on the current ordering. (To find multiple instances of a value, use Custom Query to add a WHERE condition to the current query.)
Every row offers options to Edit, Ins(ert), Copy or Del(ete) that row. Clicking on Edit puts the current row in edit mode, clicking on Ins brings up a new row for editing, and clicking on Copy brings up a new row which is a copy of the current row for editing. Finish an Edit, Ins or Copy cycle by clicking Save or Cancel.
Automatic foreign key lookup dropdowns: Since v1.57, during row edits, for columns that are foreign keys in ACID-compliant tables, and also for TheUsual's user-defined foreign keys, TheUsual automatically puts up a dropdown for selection of a key value from the referenced table. In that dropdown, beside the key column, it also displays a (VAR)CHAR description column, if it can find one. You can tell TheUsual what description column to use if you enabled TheUsual's user-defined foreign keys: edit the theusualfks table in the database specified by $_SESSION['sysdb'] = 'admin', and in the row for that foreign key, set the value of the column named referenced_desc_column to the desired SELECT expression (beware: TheUsual doesn't verify your syntax!).
Plugins for forms
Version 1.85 introduced input form plugins. To use the feature, make sure
$_SESSION['sysdb'] is set ...
$_SESSION['sysdb'] = 'name_of_database_to_use';
... in theusual_start.php. Then when TheUsual runs, it opens or creates a table named theusualplugins in that database. Install an input plugin by adding a row to that table specifying coltype, onfocus, jsfile and cssfile, and optionally specify script and onblur.
As a demonstration example and convenience, if the theusualplugins table is empty and if TheUsual can find the files calendar.js and calendar.css in the current folder, it installs a plugin calendar popup for date inputs by creating and populating a theusualplugins row for it. To import some other plugin, bring up the theusualplugins table in TheUsual, and add and populate a row.
Selecting Custom query from the dashboard brings up a custom query text control that's resizable in FireFox, Chrome and Safari, and an Execute button. If saved queries are enabled, it also has a query name control and a Save button. It supports CREATE PROCEDURE | FUNCTION | TRIGGER, for each of which, if the routine has more than one line, you should specify an alternative delimiter before, eg DELIMITER go, and after, eg END; go.
The mysql interface does not support multiple resultsets; TheUsual/mysql works around this by closing and reopening the connection for each query, but this workaround fails if the multiple queries are within a stored procedure, so with the mysql API, stored procedures that execute multiple queries will show just one resultset.
The mysqli interface does support multiple resultsets, and TheUsual/mysqli shows them all even when they're from within a stored procedure.
When executing multiple-query scripts, remember there's no paging.
Run big scripts (250KB or more) through the Import module.
A Chart prompt appears on the dashboard if TheUsual can match the data in the current datagrid to a type of chart it knows how to draw. TheUsual can now display, on the fly, nine kinds of Google Visualisation API charts—Area, Histogram, Line, Smoothed Line, Motion, Org (Tree), Pie, Pie with Percentages, and Scatter. These charts can use [VAR]CHAR, numeric and DATE values; BLOB, TEXT, ENUM and SET values are ignored. When customising queries for these charts, remember that MySQL functions like FORMAT() return strings; to make strings usable as numeric values for a chart, use CAST( FORMAT(...) AS DECIMAL[...]).
YYYYQn, or a string specifying year weeks in
YYYYWnnformat; and at least one numeric result column. See the example below.
To draw a chart, TheUsual has to write out the data to be charted in a format that the Google Visualization engine can understand, so charts work best with aggregating queries that keep down the rowcount. Area charts, Histograms and Scatter charts can handle up to 10k rows; Org charts can handle 5k rows but are best with a few hundred at most; Line charts can handle 2k rows. Pie charts become unreadable with much more than a dozen rows, though the module will accept 50.
Here is a simple GNP-By-Continent query on the world database:
And here is an image of a minimum motion chart in its final state. All we had to do was ...
Motionfrom the Chart dropdown in TheUsual, then click the Trails checkboxes and the Play button:
select floor(population/100000)*100000 as 'Population Band', count(*) as Size from world.city where countrycode='GBR' group by 1;
Selecting Line from the Charts dropdown generates this:
Print: Version 1.44 introduced a Print option to send browsed data to the printer of your choice.
Refresh: If your most recent custom query added or dropped a database or table, use this option to refresh the Database and Table dropdown menus.
The Browse <databasename> prompt in the dashboard brings up a view for administering all objects in the currently selected database. It includes one-click whole-database backup and options to Analyze, Check, Optimize, Repair or Drop tables.
Settings: This form allows you to toggle text/blob formatting, stripping of HTML tags from input queries, displaying live urls in text data, and use of information_schema for metadata (this latter provided because the more databases and tables there are on the server, the slower information_schema is; the first information_schema access can take minutes on servers with dozens of databases and thousands of tables).
Default settings and the Settings panel:
You can change the current MySQL character set in the Settings panel. TheUsual issues matching HTML charset and PHP character-setting directives on the next page repaint. To change the default startup charset (utf8), set $_SESSION['charset'] in theusual_start.php,
The default setting of $_SESSION['use_info_schema'], which determines whether to use information_schema for metadata, is FALSE because MySQL queries on information_schema are so painfully slow when there are many databases and tables.
The default setting of $_SESSION['views'], which allows TheUsual to save queries in a database table and retrieve them for execution, is TRUE; and the default setting of $_SESSION['sysdb'], the name of the database where TheUsual will look for its table theusualfks storing data-driven non-InnoDB foreign key specifications, is sys to v2.18, then theusualsys.
Some setting defaults can be changed by editing theusual_start.php.
In v2.20 the default separator char for passing multi-column keys was changed from "|" to "ʃ" when running with a Utf8 variant charset. This caused key readability problems on some system,s so the change is reverted in 2.21.
Backup: Since v1.45, database backup is available in the database administration browser. It assembles, then offers for download, a file of SQL commands to recreate the tables, views, data, stored routines and Triggers of the current database. It writes its file to the current web folder, offers to download the file to the client, logs the file operation, and when the downlaod completes, it deletes the dump file. If the download is declined or if it fails, the file stays on the server.
Under Apache this is routine. Under Windows and IIS, it can require two additional steps: make the server folder's security tab visible, then use the Security tab to enable writes to wwwroot. Open My Computer, click on Tools | Folder Options and then on the View tab. At the bottom of the list uncheck 'Use simple file sharing (Recommended)'. Now Windows Explorer shows the Security tab in the Properties context menu for every folder. In Windows Explorer, right-click on wwwroot, select the Security tab, select the Internet Guest Account ([username]/IUSR_[username]), check Write and Modify, and press OK.
|2.31||Corrected calls to SQL formatter.|
|2.31||Quote new reserved word 'Rows' in information_schema db stats query. Improved SQL formatter.|
|2.30||Corrected transactqry() retry handling, support for specifying retry count, charset matching in insert and update scripts.|
|2.29||Corrected saving of query updates, setting of defaults in input forms.|
|2.28||Faster rowcounts. Transaction support for InnoDB, XtraDB, TokuDB, PBXT inserts, updates, deletes.|
|2.27||Restored functionality growing last data page size up to page limit. Increased availability of Edit Query option. Disabled resetting of limit clause to default when executing a saved query with a limit clause. Work around 8 vs pre-8 no_auto_create_user incompatibility processing mysqldump scripts. Lengthened max_execution_time. Corrected master-detail display glitch.|
|2.26||Renamed row-find UI command name to 'Goto'. Disabled html autocomplete for form fields using plugins. Reworked child row code for cascading parent-child browse instances.|
|2.25||Added support for Common Table Expressions. Improved rowcount performance.|
|2.24||Changed dump delimiter for stored routines.|
|2.23||Backtick newly-reserved-word column names in dumptables().|
|2.22||Allow for MariaDB in version check. Allow limits up to 5K rows.|
|2.21||Some fixes to master-detail cascades. Experimental: for editability accept unique keys in place of primary keys.|
|2.20||Scale display of width-unspecified pics for mobiles & non-mobiles. Changed default separator char for passing multi-column keys in utf environments to "ʃ".|
|2.19||More corrections to restoration of form data after save error. Handle quotes in keys.|
|2.18||Var name changes for PHP 7.1. 'System' is a reserved word in 8.0.3, default system DB name now 'theusualsys'.|
|2.17||More improvement to live URL display.|
|2.16||Corrected handling of primary key strings containing URLs, improved display of live URLs.|
|2.15||Corrected handling of user queries with nested subqueries. More custom queries now chartable.|
|2.14||Backticked new 8.0 reserved words. Corrected connect error handling.|
|2.13||Corrected child-table-fetch error.|
|2.12||Corrected pseudo-foreign-key retrieval from theusualFKs table.|
|2.11||Corrected restoration of form data after save error, handling of semicolons terminating custom queries.|
|2.10||Added Histogram charts, updated Google Visualization API call. Fixed bug in saving query edits.|
|2.08||Corrected display of Show Create Table in schema browser.|
|2.07||PHP before 5.4 chokes on some !empty() calls, changed to !strlen().|
|2.06||Corrected edit link after non-PK Find.|
|2.05||Corrected master-detail row synchronisation. Don't override existing Limit clause in a saved query with the current setting.|
|2.04||Corrected row pointer after Insert, form value restoration after Insert or Update failure.|
|2.03||Added Find support for '%' wildcard. Corrected url display.|
|2.02a||Corrected misplacement of textarea edit width spec.|
|2.02||Find option enhanced for search on any column in base tables and updatable views selected from the Tables dropdown.|
|2.01||Corrected bug introduced in 2.00 preventing table DDL display in database browser.|
|2.00||Master-detail table browsing support for unlimited no. of cascading master-detail relationships.|
|1.90||Corrected handling of multiqueries that begin with a delimiter directive. Note: this is the last version of theUsual for the mysql API; from here on in, only the mysqli version of theUsual will be upgraded.|
|1.89||Changed the default name of the schema for server-wide settings from "sys" to "system" to accommodate MySQL 5.7 use of "sys" as the name of an endogenous schema.|
|1.88||Fixed parsing of illegal schema names. New setting liveurls activates urls in displayed data.|
|1.87||Option to filter HTML in all form strings. Fixed bug that could switch the current table on cancelling a theusualviews edit.|
|1.86||Recompute query rowcount on every refresh|
|1.85||Added support for input plugins|
|1.84a||Corrected typo in mysqldump() Create Table If Not Exists|
|1.84||Corrected multiquery delimiter block parser error|
|1.82||Do not switch default DB when the parser detects that a custom query's main table is in another DB|
|1.81||Removed glitch that displayed zero values as blanks|
|1.80||Corrected Backup download switch.|
|1.79||Corrected EOL handling in imports.|
|1.78||Added an Import module, and settings forms for import and backup. Fixed some display glitches. Optimised multiquery parsing. Added a GoTo command for each table & View in the database browser.|
|1.77||Corrected handling of multiple multiquery delimiters.|
|1.76||Modularised mysqldump routine, added table-export option to database browser.|
|1.75a||Improved error handling. Corrected delimiter block handling in multiquery module.|
|1.74||Corrected next-result error in mysqli multiquery module.|
|1.73||Added lightweight query formatter to make |
|1.72||Corrected implementation of user's text display choice. Sort information_schema to bottom of DB list.|
|1.71||Corrected display of multiple resultsets from stored procedures.|
|1.69||Corrected handling of blank numeric values in forms.|
|1.68||Improved handling of missing |
|1.67||Corrected parser code triggering warning in some foreign key checks.|
|1.66||Corrected handling of |
|1.65||Corrected minor error in reading user-defined foreign keys (|
|1.64||Corrected parsing of complex multiqueries.|
|1.63a||Corrected typo in parentkeys().|
|1.63||Removed irrelevant links in database browser.|
|1.62||Corrected Drop Table bug in mysql version of Browse Database.|
|1.61||Added automatic dropdowns for parent keys specified in |
|1.60||Automatic dropdowns and initialisation of child foreign key columns to parent key values when adding a row in detail datagrid.|
|1.59||Improved handling of limits in saved queries, and of missing 'sysdb' database when it has been specified.|
|1.58||Corrected recently introduced problem in definition of some custom query columns.|
|1.57||Added automatic foreign key dropdown lookups. Corrected timezone detection.|
|1.56||Added smoothed line charts, and pie charts with percentage display. Corrected View ordering.|
|1.55||Corrected handling of database-specific routine privileges for backup under shared hosting.|
|1.54||Corrected handling of |
|1.53||Corrected bug that prevented browse of |
|1.52||Corrected initialisation of Saved Queries dropdown.|
|1.51||Corrected handling of user dropping the current database.|
|1.50||Corrected handling of queries, Views and saved queries for charts.|
|1.49b||Do not automatically add an |
|1.49||Does on-the-fly Google Area, Motion, Pie, Org and Scatter charts. Corrected query saving.|
|1.48||More key-handling workarounds for servers that still set magic_quotes_gpc.|
|1.47||Corrected error handlers|
|1.46||Cleaned up display of decimal data. Corrected saving of Saved Queries|
|1.45||Backup option in Browse database mode|
|1.43||Corrected table selection button misdisplay after browser tab restoration. 143a: removed debugging stub|
|1.42||Correct for character set when using column length to determine single- vs multi-line edit (mysqli)|
|1.41||DB Browser: Disable join to mysql.procs for routine params when user does not have that privilege|
|1.40||Grey out rather than omit Top Prev Next Bott buttons when they can have no effect|
|1.39||Added dynamic character set setting, coordinated with Set Names. Corrected column headers.|
|1.38||Corrected handling of escaped quotes in multiqueries|
|1.37b||Corrected display glitches for errors, non-editable tables|
|1.37||Added Go option in detail browse to cascade master-detail chains. Updated default settings. Smoothed error handling.|
|1.36||More text formatting options. No default |
|1.35||Added front end for multiple installations of TheUsual and of MySQL servers|
|1.34||Corrected master-detail synchronisation when controlling order is not the primary key|
|1.33||Data-driven master-detail browsing; corrections to child table argument parsing & key argument handling|
|1.32||Added Triggers list to database browser|
|1.31||Corrected handling of multiqueries and of queries with |
|1.30||Improved handling of |
|1.29||Size limit setting for text and blob display/edit. Timestamp default handling improved.|
|1.28||Call mysql[i]_real_escape_string() for deletion key arguments only if !get_magic_quotes_gpc()|
|1.27||Corrected ordering of Views, handling of get_magic_quotes_gpc()|
|1.26||Accommodate MySQL 5-6 differences in information_schema.routines table structure|
|1.25||Corrected BLOB handling|
|1.24||Corrected handling of multi-column char keys in some update commands|
|1.23||Corrected handling of database and table names containing prohibited characters|
|1.22||Corrected handling of delimiters embedded in quoted strings inside multi-query strings|
|1.21||Corrected problem in Save Query|
|1.19||List stored routines in database browser|
|1.18||Enable Drop View in database browser|
|1.17||Strip slashes if get_magic_quotes_gpc() is set on inserts and updates|
|1.16||Improved handling of MySQL commands|
|1.15||Database browser supports Analyze, Check, Optimize, Repair, Drop Table commands|
|1.14||Generalised DELIMITER support in custom queries|
|1.13||Support for multi-queries|
|1.11||Remove any trailing semicolon from a query|
|1.10||Fixed row ordering glitches|
|1.09||Fixed master-detail glitches|
|1.08||Saved queries go to mysql.theusualviews if privs allow, otherwise to current db|
|1.07||Much faster: by default bypasses information_schema to get child table info|
|1.06||Instructions for installation on a shared hosting provider|
|1.05||Ins/Edit/Copy/Del/Save/Cancel buttons compressed. Accept NULLs to nullable columns.|
|1.04||Optional detail window if there is a child table|
|1.03||Query execution times|
|1.02||Support for many non-SELECT cmds|
|1.01||Support for calling sprocs|