2011-05-16 153 views
1

下面的代码工作正常,但它在连接到不存在的数据库时会引发警告。这在错误关闭的产品中可以正常工作,但如果我不需要,我宁愿不会有错误。检查数据库是否存在(mysql + php)

function cpanel_db_connect($dbname) { 
    // normalize 
    $dbname = convert_to_slug($dbname); 
    $dbname = CPANEL_USER . '_' . $dbname; 

    $dbuser = CPANEL_USER . '_' . CPANEL_DB_USER; 

    // connnect database 
    $mysqli = new mysqli(CPANEL_DB_HOST, $dbuser, CPANEL_DB_PASS, $dbname); 

    if ($mysqli->connect_error) { 
     return false; 
    } 

    return $mysqli; 
} 
+1

你也许可以简单地用'@'运营商,例如抑制错误'$库MySQLi = @new mysqli的(CPANEL_DB_HOST,$ DBUSER,CPANEL_DB_PASS,$ DBNAME);' – 2011-05-16 21:02:22

+2

由于您使用的mysqli的OOP版本,只是做在周围连接部分一个try/catch。 – 2011-05-16 21:02:25

+0

你会得到什么警告/错误? – 2011-05-16 21:03:57

回答

1
$mysqli = @new mysqli(CPANEL_DB_HOST, $dbuser, CPANEL_DB_PASS, $dbname); 

上述作品!

+1

您可能需要使用专用的登录为这样的事情,并直接查询INFORMATION_SCHEMA数据库调查:'选择INFORMATION_SCHEMA.SCHEMATA其中SCHEMA_NAME ='你的数据库名here''比试图连接到更好SCHEMA_NAME(可能不存在)数据库并检查错误。 – 2011-05-16 22:03:29

3

我知道答案有点太晚了,而且已经有了一个可以接受的答案,但我会留下评论以防将来有人需要它。

在PHP中使用@符号禁止警告/错误并不是一个好习惯。你可能会意外地禁止一个无效的用户名或密码信息,你永远不会知道它。

一个检查数据库是否存在正在创建MySQL或MySQLi的新实例的更合适的方式(不指定默认数据库),并执行以下查询(类似于马克·B的评论):

SELECT COUNT(*) AS `exists` FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMATA.SCHEMA_NAME='my_database_name' 

然后您可以检查密钥exists的值以查看数据库是否存在。

下面是一个示例代码:

// statement to execute 
$sql = 'SELECT COUNT(*) AS `exists` FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMATA.SCHEMA_NAME="my_database_name"'; 

// execute the statement 
$query = $mysqli->query($sql); 
if ($query === false) { 
    throw new Exception($mysqli->error, $mysqli->errno); 
} 

// extract the value 
$row = $query->fetch_object(); 
$dbExists = (bool) $row->exists; 

这是一个有点长,但它的安全。

0

这个工作,只是在此代码替换$ DBNAME:

if (empty (mysql_fetch_array(mysql_query("SHOW DATABASES LIKE '$dbname' ")))){ 
echo "DB does Not exist"; }else{ echo "DB exists!";}