?
Solved

detect/alter MySQL tabe type with PHP

Posted on 2009-04-13
6
Medium Priority
?
371 Views
Last Modified: 2013-12-12
Is there a way to detect the type of table in a MySQL database?

If there is, can the table type be altered? to say INNODB?
0
Comment
Question by:Hube02
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 5

Assisted Solution

by:kevthedude
kevthedude earned 400 total points
ID: 24132445
This script will change anything that is not what $changeTo is and set it to $changeTo
<?php
	$changeTo = "InnoDB";
	$mysqli = new mysqli("localhost", "mysql_user", "mysql_pass", "mysql_database");
	if($result = $mysqli->query("show table status"))
	{
		$tables = array();
		while ($row = $result->fetch_object()) {
			if($row->Engine != $changeTo)
				array_push($tables,$row->Name);
		}
	} else {
		printf("Error message: %s", $mysqli->error);
		exit;
	}
	foreach($tables as $v)
	{
		if($result = $mysqli->query("ALTER TABLE `".$v."` ENGINE = ".$changeTo))
		{
			printf("Changed `%s` to %s \n", $v, $changeTo);
		} else {
			printf("Error message on table `%s`: %s", $v, $mysqli->error);
		}
	}
?>

Open in new window

0
 
LVL 111

Accepted Solution

by:
Ray Paseur earned 1600 total points
ID: 24132544
Maybe so.  You can show the CREATE TABLE statement with this code.  You can look in the array element called ["Create Table"] and find the string that says "ENGINE=".

Rather than altering it in PHP, I think I might want to create a copy and alter the copy.  You can also do this with phpMyAdmin.

HTH, ~Ray
<?php // RAY_show_tables.php
// INFORMATION FROM THE DATA BASE
// READABILITY
echo "<pre>\n";
 
// CONNECT TO THE DB
$db_host	= "localhost";
$db_name	= "X";
$db_user	= "Y";
$db_word	= "Z";
 
 
// CONNECT TO THE DATA BASE SERVER
if (!$db_connection = mysql_connect("$db_host", "$db_user", "$db_word")) {
	$errmsg	= mysql_errno() . ' ' . mysql_error();
	echo "<br/>! db_connection ";
	echo "<br/> $errmsg <br/>";
}
 
// SELECT THE DATA BASE
if (!$db_sel = mysql_select_db($db_name, $db_connection)) {
	$errmsg	= mysql_errno() . ' ' . mysql_error();
	echo "<br/>! db_sel ";
	echo "<br/> $errmsg <br/>";
	die('NO DATA BASE?');
}
 
// CHOOSE A TABLE
$my_table = "RAY_ANGLERS";
 
// INFORMATION ABOUT THE TABLE
$sql_t  = "SHOW CREATE TABLE $my_table";
if (!$t = mysql_query("$sql_t", $db_connection)) { fatal_query_error($sql_t); }
$show   = mysql_fetch_assoc($t);
 
// PRINT THE INFORMATION
var_dump($show);
 
 
 
 
 
// YOUR EMAIL ADDRESS
$admin_email	= "RPaseur@NationalPres.org";
/* ************************************************************************** */
// LOCAL FUNCTION TO CRAP OUT AND DIE ON FATAL MySQL ERRORS
function fatal_query_error($qstring)
{
	global $admin_email;
	$url	= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	$ref	= $_SERVER['HTTP_REFERER'];
	$errmsg	= mysql_errno() . ' ' . mysql_error();
 
	echo "<br /><br /><span class=\"loss\">FATAL MySQL Data Base Error</span> \n";
	echo "<br /><br />The URL for this page is:<br />$url \n";
	echo "<br /><br />The failing MySQL Query contained this:<br />$qstring \n";
	echo "<br /><br />The error message is:<br />$errmsg<br /><br />\n";
	echo "<br /><br />The referrer (if any) is:<br />$ref<br /><br />\n";
 
	if (!get_magic_quotes_gpc()) { $qstring	= addslashes($qstring); }
	$qstring	.= "\n\n";
	$qstring	.= "$errmsg \n\n";
	$subj		= ' !! FATAL MySQL Error in ' . "$url";
	mail ( $admin_email, $subj, $qstring);
	die();
}
/* ************************************************************************** */
 
?>

Open in new window

0
 
LVL 18

Author Comment

by:Hube02
ID: 24133378
Thanks kevthedude, however the application I'm working with is written in PHP4, so the mysqli functions will not work for me.
 
 If I do the altering I will need to go with Ray's suggestion.
 
 What I have is a small application that is installed on several websites. The application was built to use transactions, however, for whatever reason, when the database and tables were created they were done with MyISAM tables and not with InnoDB.
 
 Anyway, I was hoping do automate the process of correcting the error rather than using phpMyAdmin and dealing with every table in every database manually.
 
 Is there some danger using php to alter that table engine that I should be aware of?
 
 If I need to do this manually I will, but I would rather avoid it if I can.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 111

Expert Comment

by:Ray Paseur
ID: 24133522
No, I can't think of any danger, so long as you knock the site down during actual changes.  My strategy would be to try copying the tables and making the alterations in the copied tables.  But (insert large caveat here) I have never done this, so I would be all about backups and testing.  

You can use SHOW TABLES to get a list of table names.  Then you can iterate over the list.  

Best of luck with it, ~Ray
0
 
LVL 18

Author Comment

by:Hube02
ID: 24133551
I'll definitely do some testing first, it may be less time consuming to do it manually, depends on my my testing reveals.

Thanks for the help.
0
 
LVL 18

Author Closing Comment

by:Hube02
ID: 31569636
Thanks again, and the mysqli information will also com in handy when I finally get to stop worrying about PHP4 compatability.
0

Featured Post

Why Off-Site Backups Are The Only Way To Go

You are probably backing up your data—but how and where? Ransomware is on the rise and there are variants that specifically target backups. Read on to discover why off-site is the way to go.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Developers of all skill levels should learn to use current best practices when developing websites. However many developers, new and old, fall into the trap of using deprecated features because this is what so many tutorials and books tell them to u…
3 proven steps to speed up Magento powered sites. The article focus is on optimizing time to first byte (TTFB), full page caching and configuring server for optimal performance.
The viewer will learn how to count occurrences of each item in an array.
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…
Suggested Courses

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question