在PHP中有没有办法捕获MySQL和数据库错误?

9
有时我会收到类似以下的数据库错误信息:

警告:mysql_connect() [function.mysql-connect]: Access denied for user 'test'@'101.190.193.83' (using password: YES)

无法连接:Access denied for user 'test'@'101.190.193.83' (using password: YES)"

但实际上密码并没有更改。
是否有办法将此错误记录在日志文件中,并在屏幕上显示一些友好的消息,例如“服务器错误,请稍后再试。”?

我正在开发一个开源项目,用于捕获错误、在屏幕上显示漂亮的消息并记录比标准错误日志提供更多信息的日志。http://jarofgreen.co.uk/2011/01/tracking-errors-with-php/ 或 http://elastik.sf.net/ - James
5个回答

10

如果您不想PHP显示警告,您需要使用“@”运算符

$connect = @mysql_connect(HOST, USER, PASS);//won't display the warning if any.
if (!$connect) { echo 'Server error. Please try again sometime. CON'; }

在生产环境中,您可能需要将php.ini文件中的display_errors设置为0。

连接到MySQL时,您可以考虑使用PDO,它默认使用异常来报告错误。

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Could not connect : ' . $e->getMessage();
}

3
<?php
    $connect = mysql_connect(HOST, USER, PASS);
    if(!$connect) { echo 'Server error. Please try again sometime. CON'; }

    $select_db = mysql_select_db(DATABASE);
    if(!$select_db) { echo 'Server error. Please try again sometime. DB'; }
?>

格式似乎丢失了,stackoverflow无法识别它... http://pastebin.com/EFefnNSp - ChrisH
3
我帮您修正了。若要使代码格式化,请在代码前加上4个空格(或1个制表符)。您可以轻松地通过选择文本并按下CTRL+K来完成这一操作。 - drudge

3
有没有办法将这些错误记录到日志文件中...?
是的,所有PHP错误和警告都被写入到Web服务器的错误日志文件中,所以您不需要做任何其他事情--已经完成了。
回答您问题的第二部分,如果您不想在屏幕上显示原始错误消息,可以通过以下两种方式之一来防止这种情况:
1. 在函数调用前使用@符号--例如,$db = @mysql_connect(...)。这会关闭仅针对该特定函数调用的错误报告。通常认为过度使用此技术是一个坏习惯,但有时确实合适。
2. 更好的选择可能是关闭全局错误报告标志,可以在PHP.ini、本地.htaccess文件或程序中使用ini_set()来实现。
通常,在网页上启用错误报告应该只在开发网站时使用。一旦网站上线,您应该关闭错误报告,这样就不会在精心构建的页面布局中显示PHP错误,从而影响您的客户。任何发生的错误仍将写入服务器错误日志,但不会显示在页面上。
对于MySQL错误(如您遇到的错误),您仍然可以通过使用mysql_error()函数在程序中获取错误本身。这将包含最后一次发生的错误的详细信息,因此您可以编程检查它并报告一个明智的错误消息。

1

来源:http://wallstreetdeveloper.com/php-database-connection/

以下是 PHP 数据库连接的示例代码:

<?php
//Step-1 : Create a database connection
$connection=mysql_connect(“localhost”,”root”,”root”);
if(!$connection) {
    die(“Database Connection error” . mysql_error());
}
//Step-2 : Select a database to use
$db=mysql_select_db(“widget_corp”,$connection);
if(!$db) {
    die(“Database Selection error” . mysql_error());
}
?>
<html>
<head>
<title>Database</title>
</head>
<body>
<?php
 //Step 3 : Perform database Queury
 $result=mysql_query(“select * from subjects”,$connection);
if(!$result) {
    die(“No rows Fetch” . mysql_error());
}

//Step 4 : Use returned data
while($row=mysql_fetch_array($result))
{
     //echo $row[1].” “.$row[2].”<br>”;
    echo $row["menu_name"].” “.$row["position"].”<br>”;
}

?>
</body>
</html>
<?php
//Step 5 : Close Connection
mysql_close($connection);
?>

0
try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// if your are not set this attributes you won't get any exceptions.
} catch (PDOException $e) {
    echo 'Server error. Please try again some time.';
}

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