检查数据库是否存在。

3

以下代码在连接到不存在的数据库时会抛出警告,除此之外一切正常。这在关闭错误提示的生产环境可以正常工作,但如果不需要错误提示我宁愿不要。

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;
}

2
你可以使用 @ 运算符来简单地抑制错误,例如:$mysqli = @new mysqli(CPANEL_DB_HOST, $dbuser, CPANEL_DB_PASS, $dbname); - Frank Farmer
3
如果你正在使用面向对象版本的mysqli,只需在连接部分加上一个try/catch。 - Marc B
你收到了什么警告/错误提示? - Jon Cram
@Marc,MySQLi在连接时不会抛出异常。您需要通过返回的对象上的connect_error检查错误。 - Kevin Peno
5个回答

5

在PHP中,使用@符号抑制警告/错误并不是一个好的实践。你可能会意外地抑制掉一个无效的用户名或密码消息,并且你永远也不会知道。

检查数据库是否存在的更合适的方法是创建一个新的Mysql或Mysqli实例(没有指定默认数据库),并执行以下查询(类似于Marc 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);

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

这个内容有点长,但更加安全。


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

以上代码可行!


1
你可能想要考虑使用专门的登录来处理这种情况,并直接查询 INFORMATION_SCHEMA 数据库:select SCHEMA_NAME from INFORMATION_SCHEMA.SCHEMATA where SCHEMA_NAME='your db name here',这比尝试连接(可能不存在的)数据库并检查错误要好。 - Marc B

0

以下是如何连接到数据库服务器而不选择数据库,仅在数据库存在时进行连接的方法:

$mysqli = new mysqli($db_biz['server'], $db_biz['user'], $db_biz['password']);

$query = 'SHOW DATABASES LIKE "' . $db_biz['dbName'] . '"';
$resShowBizDB = $mysqli->query($query);

if ($resShowBizDB->num_rows == 1) { //Found database
    $mysqli->select_db($db_biz['dbName']);
    
    if ($mysqli->connect_errno) { //Check for errors
        var_dump($mysqli);
        echo "Failed to connect to biz database: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }
    
    $mysqli->set_charset('utf8');
} else { //Didn't find DB
    die('<h1>ERROR</h1><p>Found no database</p>');
}

0

这个代码是有效的,只需要替换其中的 $dbname:

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

0

升级到MYSQLI:

$conn = new mysqli('localhost', 'root', '');
$dbname='test';
if (empty (mysqli_fetch_array(mysqli_query($conn,"SHOW DATABASES LIKE '$dbname'")))) 
{
    echo "DB not exist<br>"; 
}
else
{
    echo "DB exist<br>";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接