diff --git a/classes/db/Db.php b/classes/db/Db.php index 4a94f3b5b..e543f35ce 100644 --- a/classes/db/Db.php +++ b/classes/db/Db.php @@ -674,6 +674,11 @@ abstract class DbCore return call_user_func_array(array(Db::getClass(), 'hasTableWithSamePrefix'), array($server, $user, $pwd, $db, $prefix)); } + public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine) + { + return call_user_func_array(array(Db::getClass(), 'checkCreatePrivilege'), array($server, $user, $pwd, $db, $prefix, $engine)); + } + /** * @deprecated 1.5.0 */ diff --git a/classes/db/DbMySQLi.php b/classes/db/DbMySQLi.php index 959a52d3a..3d5556908 100644 --- a/classes/db/DbMySQLi.php +++ b/classes/db/DbMySQLi.php @@ -185,6 +185,25 @@ class DbMySQLiCore extends Db $link->close(); return 0; } + + public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine) + { + $link = @new mysqli($server, $user, $pwd, $db); + if (mysqli_connect_error()) + return false; + + $sql = ' + CREATE TABLE `'.$prefix.'test` ( + `test` tinyint(1) unsigned NOT NULL + ) ENGINE=MyISAM'; + $result = $link->query($sql); + + if (!$result) + return $link->error; + + $link->query('DROP TABLE `'.$prefix.'test`'); + return true; + } /** * @see Db::checkEncoding() diff --git a/classes/db/DbPDO.php b/classes/db/DbPDO.php index 06ce7539c..ac8709c75 100644 --- a/classes/db/DbPDO.php +++ b/classes/db/DbPDO.php @@ -174,6 +174,28 @@ class DbPDOCore extends Db return (bool)$result->fetch(); } + public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine) + { + try { + $link = DbPDO::_getPDO($server, $user, $pwd, $db, 5); + } catch (PDOException $e) { + return false; + } + + $sql = ' + CREATE TABLE `'.$prefix.'test` ( + `test` tinyint(1) unsigned NOT NULL + ) ENGINE=MyISAM'; + $result = $link->query($sql); + if (!$result) + { + $error = $link->errorInfo(); + return $error[2]; + } + $link->query('DROP TABLE `'.$prefix.'test`'); + return true; + } + /** * @see Db::checkConnection() */ diff --git a/classes/db/MySQL.php b/classes/db/MySQL.php index 92c41768b..2713305d8 100644 --- a/classes/db/MySQL.php +++ b/classes/db/MySQL.php @@ -174,6 +174,28 @@ class MySQLCore extends Db @mysql_close($link); return 0; } + + public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine) + { + ini_set('mysql.connect_timeout', 5); + if (!$link = @mysql_connect($server, $user, $pwd, true)) + return false; + if (!@mysql_select_db($db, $link)) + return false; + + $sql = ' + CREATE TABLE `'.$prefix.'test` ( + `test` tinyint(1) unsigned NOT NULL + ) ENGINE=MyISAM'; + + $result = mysql_query($sql, $link); + + if (!$result) + return mysql_error($link); + + mysql_query('DROP TABLE `'.$prefix.'test`', $link); + return true; + } /** * @see Db::checkEncoding() diff --git a/install-dev/models/database.php b/install-dev/models/database.php index 5bb2ca9c3..387713854 100644 --- a/install-dev/models/database.php +++ b/install-dev/models/database.php @@ -71,6 +71,12 @@ class InstallModelDatabase extends InstallAbstractModel // Check if a table with same prefix already exists if (!$clear && Db::hasTableWithSamePrefix($server, $login, $password, $database, $prefix)) $errors[] = $this->language->l('At least one table with same prefix was already found, please change your prefix or drop your database'); + if (($create_error = Db::checkCreatePrivilege($server, $login, $password, $database, $prefix, $engine)) !== true) + { + $errors[] = $this->language->l(sprintf('Your database login don\'t have the privileges to create table on the database "%s". Ask your hosting provider:', $database)); + if ($create_error != false) + $errors[] = $create_error; + } break; case 1: