detect/alter MySQL tabe type with PHP

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?
LVL 18
Hube02Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

 
kevthedudeCommented:
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
 
Ray PaseurCommented:
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

Experts Exchange Solution brought to you by ConnectWise

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
 
Hube02Author Commented:
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
Cloud Class® Course: Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

 
Ray PaseurCommented:
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
 
Hube02Author Commented:
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
 
Hube02Author Commented:
Thanks again, and the mysqli information will also com in handy when I finally get to stop worrying about PHP4 compatability.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.